GCC Code Coverage Report


Directory: src/
File: script_transcompiler/backend_linux_x86_64.cpp
Date: 2024-12-30 15:39:09
Exec Total Coverage
Lines: 222 227 97.8%
Functions: 8 8 100.0%
Branches: 341 674 50.6%

Line Branch Exec Source
1 #include "data.h"
2
3 #include <tuple>
4
5 namespace
6 {
7 struct asm_file
8 {
9 std::vector<std::string> data;
10
11 std::vector<std::string> lines;
12
13 bool need_memory = false;
14 bool exit_failure = false;
15 unsigned int data_cnt = 0;
16 bool need_new_line = false;
17 };
18
19 // free memory stored at allocated_memory
20 // after call, allocated_memory_size is 0
21 4 inline void _free_memory(std::vector<std::string>& lines)
22 {
23
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 lines.push_back("# free memory");
24
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 lines.push_back("movq allocated_memory(%rip), %rdi");
25
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 lines.push_back("movq allocated_memory_size(%rip), %rsi");
26
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 lines.push_back("movq $11, %rax");
27
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 lines.push_back("syscall");
28
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 lines.push_back("movq $0, allocated_memory_size(%rip)");
29 4 }
30
31 // alloc memory of size stored in allocated_memory_size
32 // after success, memory address is stored in allocated_memory
33 3 inline void _alloc_memory(std::vector<std::string>& lines)
34 {
35
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq $0, %rdi ");
36
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq allocated_memory_size(%rip), %rsi");
37
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq $7, %rdx");
38
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq $34, %r10 ");
39
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq $-1, %r8");
40
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq $0, %r9");
41
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq $9, %rax");
42
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("syscall");
43
44
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("cmpq $-1, %rax ");
45
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("je exit_failure");
46
47
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 lines.push_back("movq %rax, allocated_memory(%rip)");
48 3 }
49
50 11 inline std::tuple<std::string, std::string> get_new_text(asm_file& file)
51 {
52
2/4
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 11 times.
✗ Branch 5 not taken.
11 const auto text_id = "text_" + std::to_string(file.data_cnt);
53
1/2
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
11 const auto text_length = text_id + "_len";
54
55 11 file.data_cnt += 1;
56
57
1/2
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
22 return {text_id, text_length};
58 11 }
59
60 10 inline void _print_stdout(asm_file& file)
61 {
62
2/4
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
10 file.lines.push_back("mov $1, %rax");
63
2/4
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
10 file.lines.push_back("mov $1, %rdi");
64
2/4
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
10 file.lines.push_back("syscall");
65 10 }
66
67 3 inline void _print_new_line(asm_file& file)
68 {
69
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 file.lines.push_back("lea new_line(%rip), %rsi");
70
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 file.lines.push_back("mov $new_line_length, %rdx");
71 3 _print_stdout(file);
72
73 3 file.need_new_line = true;
74 3 }
75
76 1 inline void add_new_line(asm_file& file)
77 {
78
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.data.push_back("new_line: .string \"\\n\"");
79
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.data.push_back("new_line_length = . - new_line");
80 1 }
81
82 14 inline void generate_linux_x86_64_asm(const intermediate& i, asm_file& file)
83 {
84
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 file.lines.push_back("# " + i.line);
85
86
8/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
14 switch (i.command)
87 {
88 case (intermediate::cmd::comment):
89 {
90 file.lines.push_back("#" + i.operand);
91 break;
92 }
93
94 1 case (intermediate::cmd::process_memory):
95 {
96
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov allocated_memory(%rip), %rdi");
97
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov allocated_memory_size(%rip), %rsi");
98
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("call text_conversion_c");
99
100 1 file.need_memory = true;
101
102 1 break;
103 }
104 4 case (intermediate::cmd::print_text):
105 {
106
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 const auto [text_id, text_length] = get_new_text(file);
107
108
4/8
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
4 file.data.push_back(text_id + ": .string \"" + i.operand + "\\n\"");
109
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 file.data.push_back(text_length + " = . - " + text_id);
110
111
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 file.lines.push_back("lea " + text_id + "(%rip), %rsi");
112
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 file.lines.push_back("mov $" + text_length + ", %rdx");
113
114
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 _print_stdout(file);
115
116 4 break;
117 4 }
118
119 3 case (intermediate::cmd::print_memory):
120 {
121
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 file.lines.push_back("movq allocated_memory(%rip), %rsi");
122
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 file.lines.push_back("movq allocated_memory_size(%rip), %rdx");
123
124 3 _print_stdout(file);
125
126 3 _print_new_line(file);
127
128 3 file.need_memory = true;
129
130 3 break;
131 }
132
133 case (intermediate::cmd::text_memory):
134 {
135 _free_memory(file.lines);
136 }
137 [[fallthrough]];
138 1 case (intermediate::cmd::text_init_memory):
139 {
140
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 const auto [text_id, text_length] = get_new_text(file);
141
142
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 file.data.push_back(text_id + ": .string \"" + i.operand + "\"");
143
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.data.push_back(text_length + " = . - " + text_id);
144
145
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("mov $" + text_length + ", %rax");
146
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("movq %rax, allocated_memory_size(%rip)");
147
148
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 _alloc_memory(file.lines);
149
150
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("# copy");
151
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("movq allocated_memory(%rip), %rdi");
152
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("lea " + text_id + "(%rip), %rsi");
153
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("mov $" + text_length + ", %rcx");
154
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("rep movsb");
155
156 1 file.exit_failure = true;
157 1 file.need_memory = true;
158
159 1 break;
160 1 }
161
162 1 case (intermediate::cmd::create_file):
163 {
164
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 const auto [text_id, text_length] = get_new_text(file);
165
166
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 file.data.push_back(text_id + ": .string \"" + i.operand + "\"");
167 // file.data.push_back(text_length + " = . - " + text_id);
168
169
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("# create file");
170
171
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $2, %rax");
172
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("lea " + text_id + "(%rip), %rdi");
173
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $577, %rsi");
174
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $0644, %rdx");
175
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
176
177
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("cmpq $-1, %rax");
178
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("je exit_failure");
179
180
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov %rax, %rdi");
181
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $3, %rax");
182
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
183
184 1 break;
185 1 }
186
187 1 case (intermediate::cmd::save_memory):
188 {
189
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 const auto [file_name_id, text_length] = get_new_text(file);
190
191 // file name
192
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 file.data.push_back(file_name_id + ": .string \"" + i.operand + "\"");
193 //file.data.push_back(text_length + " = . - " + file_name_id);
194
195 // create file
196
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $2, %rax ");
197
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("lea " + file_name_id + "(%rip), %rdi");
198
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $0101, %rsi");
199
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $0644, %rdx");
200
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
201
202
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("cmpq $-1, %rax");
203
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("je exit_failure");
204
205 // write to file
206
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov %rax, %rdi");
207
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $1, %rax ");
208
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("movq allocated_memory(%rip), %rsi");
209
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("movq allocated_memory_size(%rip), %rdx");
210
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
211 // close file
212
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $3, %rax");
213
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
214
215 1 file.need_memory = true;
216 1 file.exit_failure = true;
217
218 1 break;
219 1 }
220
221 1 case (intermediate::cmd::save_text):
222 {
223
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 const auto [text_id, text_length] = get_new_text(file);
224
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 const auto [file_name_id, file_name_length] = get_new_text(file);
225
226 // file name
227
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 file.data.push_back(file_name_id + ": .string \"" + i.operandB + "\"");
228 // file.data.push_back(file_name_length + " = . - " + file_name_id);
229 // text
230
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 file.data.push_back(text_id + ": .string \"" + i.operand + "\"");
231
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.data.push_back(text_length + " = . - " + text_id);
232 // create file
233
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $2, %rax ");
234
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("lea " + file_name_id + "(%rip), %rdi");
235
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $0101, %rsi");
236
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $0644, %rdx");
237
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
238
239
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("cmpq $-1, %rax");
240
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("je exit_failure");
241
242 // write to file
243
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov %rax, %rdi");
244
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $1, %rax ");
245
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("lea " + text_id + "(%rip), %rsi");
246
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 file.lines.push_back("mov $" + text_length + ", %rdx");
247
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
248 // close file
249
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $3, %rax");
250
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
251
252 1 file.need_memory = true;
253 1 file.exit_failure = true;
254 1 break;
255 1 }
256 2 case (intermediate::cmd::load_memory):
257 {
258 2 _free_memory(file.lines);
259 }
260 [[fallthrough]];
261 2 case (intermediate::cmd::load_init_memory):
262 {
263
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 const auto [file_name_id, file_name_length] = get_new_text(file);
264
265 // file name
266
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
2 file.data.push_back(file_name_id + ": .string \"" + i.operand + "\"");
267 //file.data.push_back(file_name_length + " = . - " + file_name_id);
268
269
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq $2, %rax");
270
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
2 file.lines.push_back("lea " + file_name_id + "(%rip), %rdi");
271
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq $0, %rsi");
272
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("syscall");
273
274
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("cmpq $-1, %rax");
275
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("je exit_failure");
276
277
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq %rax, %rdi");
278
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq %rax, %rbx");
279
280 // file size
281
282
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("# file size");
283
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq $5, %rax");
284
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("subq $128, %rsp");
285
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq %rsp, %rsi ");
286
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("syscall");
287
288
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq 48(%rsp), %rdx");
289
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq %rdx, allocated_memory_size(%rip)");
290
291
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 _alloc_memory(file.lines);
292
293 // read data into memory
294
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("# read data into memory");
295
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq $0, %rax");
296
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq %rbx, %rdi");
297
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq allocated_memory(%rip), %rsi");
298
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("movq allocated_memory_size(%rip), %rdx");
299
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("syscall");
300
301 // close file
302
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("# close file");
303
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("mov $3, %rax");
304
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("syscall");
305
306 2 file.need_memory = true;
307 2 file.exit_failure = true;
308
309 2 break;
310 2 }
311 }
312
313
2/4
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
14 file.lines.push_back("");
314 14 }
315
316 } // namespace
317
318 1 void generate_linux_x86_64(data& data)
319 {
320 1 asm_file file;
321
322
2/2
✓ Branch 5 taken 14 times.
✓ Branch 6 taken 1 times.
15 for (const auto& i : data.c)
323
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 generate_linux_x86_64_asm(i, file);
324
325
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.need_new_line)
326
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 add_new_line(file);
327
328
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.need_memory)
329
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 _free_memory(file.lines);
330
331
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.exit_failure)
332 {
333
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.data.push_back("text_failure: .string \"an error occured\"");
334
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.data.push_back("text_failure_len = . - text_failure");
335 }
336
337 // exit success
338
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("mov $60, %rax");
339
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("xor %rdi, %rdi");
340
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("syscall");
341
342 // ---
343
344
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("# Linux x86_64 AMD64");
345
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("# AT&T syntax");
346
347
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back(".section .data");
348
349
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.need_memory)
350 {
351
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("allocated_memory: .quad 0");
352
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("allocated_memory_size: .quad 0");
353 }
354
355
2/2
✓ Branch 5 taken 21 times.
✓ Branch 6 taken 1 times.
22 for (const auto& d : file.data)
356 {
357
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 data.result.push_back(d);
358 }
359
360
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back(".section .text");
361
362
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back(".global _start");
363
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("_start:");
364
365
2/2
✓ Branch 5 taken 229 times.
✓ Branch 6 taken 1 times.
230 for (const auto& l : file.lines)
366 {
367
1/2
✓ Branch 1 taken 229 times.
✗ Branch 2 not taken.
229 data.result.push_back(l);
368 }
369
370
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.exit_failure)
371 {
372
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("");
373
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("exit_failure:");
374
375
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.need_memory)
376
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 _free_memory(data.result);
377
378
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("lea text_failure(%rip), %rsi");
379
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("mov $text_failure_len, %rdx");
380
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("mov $1, %rax");
381
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("mov $1, %rdi");
382
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("syscall");
383
384
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("mov $60, %rax");
385
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("mov $1, %edi");
386
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("syscall");
387 }
388
389
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("\n");
390 1 }
391