aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2024-12-19 08:45:47 +0000
committerAryadev Chavali <aryadev@aryadevchavali.com>2024-12-19 08:45:47 +0000
commit7686c1043c8fd24acf5bc588a71cbcf8c820a282 (patch)
treeb036885906f61ba224a7eda314622da261b25819
parentffc8068a74cca75a66296e8bec06d1ef47d7c830 (diff)
downloadobf-7686c1043c8fd24acf5bc588a71cbcf8c820a282.tar.gz
obf-7686c1043c8fd24acf5bc588a71cbcf8c820a282.tar.bz2
obf-7686c1043c8fd24acf5bc588a71cbcf8c820a282.zip
Refactor assembler to use vec_t instead of buffer
Clearer, precise and no double pointers.
-rw-r--r--assembler.c90
-rw-r--r--assembler.h9
2 files changed, 48 insertions, 51 deletions
diff --git a/assembler.c b/assembler.c
index 8270f01..faf7bb3 100644
--- a/assembler.c
+++ b/assembler.c
@@ -17,22 +17,22 @@ struct Label
/* First, the functions to call external utilities (badly written, I know). They
* presume a filled asm_buffer. */
-void asm_write(buffer_t **asm_buffer)
+void asm_write(const char *asm_name, vec_t *asm_buffer)
{
- FILE *fp = fopen(asm_buffer[0]->name, "w");
- fwrite(asm_buffer[0]->data, asm_buffer[0]->size, 1, fp);
+ FILE *fp = fopen(asm_name, "w");
+ fwrite(asm_buffer->data, asm_buffer->size, 1, fp);
fclose(fp);
}
-int asm_assemble(const char *srcname, const char *objname)
+int asm_assemble(const char *asm_name, const char *objname)
{
#ifdef DEBUG
char *format_str = "yasm -f elf64 -g dwarf2 -o %s %s";
#else
char *format_str = "yasm -f elf64 -o %s %s";
#endif
- char command[snprintf(NULL, 0, format_str, objname, srcname) + 1];
- sprintf(command, format_str, objname, srcname);
+ char command[snprintf(NULL, 0, format_str, objname, asm_name) + 1];
+ sprintf(command, format_str, objname, asm_name);
return system(command);
}
@@ -44,45 +44,14 @@ int asm_link(const char *objname, const char *outname)
return system(command);
}
-int asm_compile(buffer_t **asm_buffer, const char *objname, const char *outname)
+int asm_compile(vec_t *asm_buffer, const char *asm_name, const char *objname,
+ const char *outname)
{
- asm_write(asm_buffer);
- asm_assemble(asm_buffer[0]->name, objname);
+ asm_write(asm_name, asm_buffer);
+ asm_assemble(asm_name, objname);
return asm_link(objname, outname);
}
-void asm_setup_buffer(buffer_t **asm_buffer, const char *outname)
-{
- *asm_buffer = buffer_init_str(outname, NULL, 1024);
- asm_buffer[0]->size = 0;
-}
-
-// Write the initial boilerplate of the assembly file
-void asm_write_init(buffer_t **asm_buffer)
-{
- const char format_string[] = "section .bss\n"
- " memory resb %d\n"
- "section .text\n"
- "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);
- buffer_append_bytes(asm_buffer, (u8 *)initial_assembly,
- sizeof(initial_assembly) - 1);
-}
-
-// Write the exit code for the assembly file
-void asm_write_exit(buffer_t **asm_buffer)
-{
- buffer_append_bytes(asm_buffer,
- (u8 *)" mov rax, 60\n"
- " mov rdi, 0\n"
- " syscall\n",
- 37);
-}
-
// A table which translates brainfuck operations into generic assembly code (I
// love C's array indexing)
static const struct
@@ -116,7 +85,13 @@ i64 get_abs_label(u64, struct Label *, u64);
// and next items in given pointers.
void ast_ref_to_asm_label(u64, struct Label *, u64, i64 *, i64 *);
-void asm_translate_nodes(buffer_t **asm_buffer, struct PResult nodes,
+// Write the initial boilerplate of the assembly file
+void asm_write_init(vec_t *asm_buffer);
+
+// Write the exit code boilerplate for the assembly file
+void asm_write_exit(vec_t *asm_buffer);
+
+void asm_translate_nodes(vec_t *asm_buffer, struct PResult nodes,
const char *src_name)
{
asm_write_init(asm_buffer);
@@ -175,14 +150,12 @@ void asm_translate_nodes(buffer_t **asm_buffer, struct PResult nodes,
1];
snprintf(formatted_string, sizeof(formatted_string), format_string,
current_label, next_label);
- buffer_append_bytes(asm_buffer, (u8 *)formatted_string,
- sizeof(formatted_string) - 1);
+ vec_append(asm_buffer, formatted_string, sizeof(formatted_string) - 1);
}
else
{
// I love tables so goddamn much
- buffer_append_bytes(asm_buffer, (u8 *)table[node.type].str,
- table[node.type].len);
+ vec_append(asm_buffer, table[node.type].str, table[node.type].len);
}
}
asm_write_exit(asm_buffer);
@@ -206,3 +179,28 @@ void ast_ref_to_asm_label(u64 ref, struct Label *labels, u64 size, i64 *cur,
return;
*next = get_abs_label(labels[*cur].next, labels, size);
}
+
+// Write the initial boilerplate of the assembly file
+void asm_write_init(vec_t *asm_buffer)
+{
+ const char format_string[] = "section .bss\n"
+ " memory resb %d\n"
+ "section .text\n"
+ "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);
+}
+
+// Write the exit code for the assembly file
+void asm_write_exit(vec_t *asm_buffer)
+{
+ vec_append(asm_buffer,
+ " mov rax, 60\n"
+ " mov rdi, 0\n"
+ " syscall\n",
+ 37);
+}
diff --git a/assembler.h b/assembler.h
index f311a96..e6b2eb2 100644
--- a/assembler.h
+++ b/assembler.h
@@ -4,14 +4,13 @@
#include "./lib.h"
#include "./parser.h"
-void asm_setup_buffer(buffer_t **asm_buffer, const char *outname);
-void asm_translate_nodes(buffer_t **asm_buffer, struct PResult nodes,
+void asm_translate_nodes(vec_t *asm_buffer, struct PResult nodes,
const char *src_name);
-void asm_write(buffer_t **asm_buffer);
-int asm_assemble(const char *srcname, const char *objname);
+void asm_write(const char *asm_name, vec_t *asm_buffer);
+int asm_assemble(const char *asm_name, const char *objname);
int asm_link(const char *objname, const char *outname);
-int asm_compile(buffer_t **asm_buffer, const char *objname,
+int asm_compile(vec_t *asm_buffer, const char *asm_name, const char *objname,
const char *outname);
#endif