diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-12-24 23:08:52 +0000 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-12-24 23:08:52 +0000 |
commit | 3c39df6c9534d5c45427339e028cee38968adbff (patch) | |
tree | c39bf8956ff0c0109502cd9f48eef26c7c40583e /assembler.c | |
parent | 70cfeac9959310944619bcf45f039d48f10f8c20 (diff) | |
download | obf-3c39df6c9534d5c45427339e028cee38968adbff.tar.gz obf-3c39df6c9534d5c45427339e028cee38968adbff.tar.bz2 obf-3c39df6c9534d5c45427339e028cee38968adbff.zip |
Implement SIZE_FMT and vec_append_fmt
SIZE_FMT gets the size of a cstr with the given sprintf formatted
string and arguments using `snprintf`.
vec_append_fmt formats a cstr with the given sprintf arguments then
appends it to the given vector.
This simplifies a little bit of the wordy implementation of the
assembler.
Diffstat (limited to 'assembler.c')
-rw-r--r-- | assembler.c | 89 |
1 files changed, 41 insertions, 48 deletions
diff --git a/assembler.c b/assembler.c index 3c45a7b..cabca41 100644 --- a/assembler.c +++ b/assembler.c @@ -72,53 +72,49 @@ void asm_translate_nodes(vec_t *asm_buffer, struct PResult nodes, for (size_t i = 0; i < nodes.size; ++i) { node_t node = nodes.nodes[i]; - if (node.type == LIN || node.type == LOUT) + // Something we can compile with only the information at hand + if (!(node.type == LIN || node.type == LOUT)) { - // Translate the node-relative addresses to assembly-label-relative - // addresses - i64 cur_asm_label = 0, next_asm_label = 0; - ast_ref_to_asm_label(i, labels, nodes.labels * 2, &cur_asm_label, - &next_asm_label); - if (cur_asm_label == -1 || next_asm_label == -1) - { - print_error( - src_name, node.row, node.col, - "[ASSEMBLY ERROR]: Could not find label for current jump!\n"); - exit(1); - } - - // Format labels - char current_label[128], next_label[128]; - - sprintf(current_label, ".L%lu", cur_asm_label); - sprintf(next_label, ".L%lu", next_asm_label); - - // Setup format string for assembly jump code - char *format_string = NULL; - if (node.type == LIN) - { - format_string = "%s:\n" - " cmp byte [r9], 0\n" - " je %s\n"; - } - else - { - format_string = "%s:\n" - " cmp byte [r9], 0\n" - " jne %s\n"; - } - char formatted_string[snprintf(NULL, 0, format_string, current_label, - next_label) + - 1]; - snprintf(formatted_string, sizeof(formatted_string), format_string, - current_label, next_label); - vec_append(asm_buffer, formatted_string, sizeof(formatted_string) - 1); + // I love tables so goddamn much + vec_append(asm_buffer, table[node.type].str, table[node.type].len); + continue; + } + + // NOTE: Must be a label + + // Translate the node-relative addresses to assembly-label-relative + // addresses + i64 cur_asm_label = 0, next_asm_label = 0; + ast_ref_to_asm_label(i, labels, nodes.labels * 2, &cur_asm_label, + &next_asm_label); + if (cur_asm_label == -1 || next_asm_label == -1) + { + print_error(src_name, node.row, node.col, + "[ASSEMBLY ERROR]: Could not find label for current jump!\n"); + exit(1); + } + + // Format labels + char current_label[128], next_label[128]; + + sprintf(current_label, ".L%lu", cur_asm_label); + sprintf(next_label, ".L%lu", next_asm_label); + + // Setup format string for assembly jump code + char *format_string = NULL; + if (node.type == LIN) + { + format_string = "%s:\n" + " cmp byte [r9], 0\n" + " je %s\n"; } else { - // I love tables so goddamn much - vec_append(asm_buffer, table[node.type].str, table[node.type].len); + format_string = "%s:\n" + " cmp byte [r9], 0\n" + " jne %s\n"; } + vec_append_fmt(asm_buffer, format_string, current_label, next_label); } asm_write_exit(asm_buffer); } @@ -151,10 +147,7 @@ void asm_write_init(vec_t *asm_buffer) "global _start\n" "_start:\n" " mov r9, memory\n"; - char initial_assembly[snprintf(NULL, 0, format_string, MEMORY_DEFAULT) + 1]; - snprintf(initial_assembly, sizeof(initial_assembly), format_string, - MEMORY_DEFAULT); - vec_append(asm_buffer, initial_assembly, sizeof(initial_assembly) - 1); + vec_append_fmt(asm_buffer, format_string, MEMORY_DEFAULT); } // Write the exit code for the assembly file @@ -183,7 +176,7 @@ int asm_assemble(const char *asm_name, const char *objname) #else char *format_str = "yasm -f elf64 -o %s %s"; #endif - char command[snprintf(NULL, 0, format_str, objname, asm_name) + 1]; + char command[SIZE_FMT(format_str, objname, asm_name) + 1]; sprintf(command, format_str, objname, asm_name); return system(command); } @@ -191,7 +184,7 @@ int asm_assemble(const char *asm_name, const char *objname) int asm_link(const char *objname, const char *outname) { char *format_str = "ld -o %s %s"; - char command[snprintf(NULL, 0, format_str, outname, objname) + 1]; + char command[SIZE_FMT(format_str, outname, objname) + 1]; sprintf(command, format_str, outname, objname); return system(command); } |