| 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 |