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 |