/* * w6a — amd64 assembler driver. Read .s, parse, encode, emit ELF .o. */ #include "a.h" #include #include #include static int slurp(const char *path, char **buf, u64 *len) { FILE *f = fopen(path, "rb"); if (f == NULL) return -1; fseek(f, 0, SEEK_END); long n = ftell(f); fseek(f, 0, SEEK_SET); if (n < 0) { fclose(f); return -1; } char *b = malloc((size_t)n + 1); if (fread(b, 1, (size_t)n, f) != (size_t)n) { free(b); fclose(f); return -1; } b[n] = 0; fclose(f); *buf = b; *len = (u64)n; return 0; } int main(int argc, char **argv) { const char *src = NULL; const char *out = NULL; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-o") == 0 && i + 1 < argc) out = argv[++i]; else if (argv[i][0] == '-') { fprintf(stderr, "w6a: unknown flag %s\n", argv[i]); return 2; } else if (src == NULL) src = argv[i]; else { fprintf(stderr, "w6a: only one input\n"); return 2; } } if (src == NULL || out == NULL) { fputs("usage: w6a -o file.o file.s\n", stderr); return 2; } char *buf; u64 len; if (slurp(src, &buf, &len) < 0) { fprintf(stderr, "w6a: cannot read %s\n", src); return 1; } Asm a; a_init(&a, src, buf, len); if (a_parse(&a) != 0) return 1; if (a_encode(&a) != 0) return 1; FILE *f = fopen(out, "wb"); if (f == NULL) { fprintf(stderr, "w6a: cannot open %s\n", out); return 1; } int rc = a_emit_elf(&a, f); fclose(f); free(buf); return rc; }