/* * 500_asm — assembler smoke. Drive w6c on a tiny program, feed the * output to w6a, then read back the .o magic to confirm we produced * a valid ELF64 relocatable object. */ #include #include #include #include static int run(const char *cmd) { return system(cmd); } int main(void) { const char *bin = getenv("BIN"); if (!bin) bin = "out/bin"; char src[64], asmf[64], obj[64]; snprintf(src, sizeof src, "/tmp/wwt_%d.ww", getpid()); snprintf(asmf, sizeof asmf, "/tmp/wwt_%d.s", getpid()); snprintf(obj, sizeof obj, "/tmp/wwt_%d.o", getpid()); const char *programs[] = { "fn main() i32 = { return 42; };", "fn add(a: i32, b: i32) i32 = { return a + b; };", "fn loop() i32 = { let i: i32 = 0; for (i < 10) { i += 1; }; return i; };", "fn cmp(a: i32, b: i32) bool = { return a < b; };", NULL }; int n = 0, fail = 0; for (int i = 0; programs[i]; i++, n++) { FILE *f = fopen(src, "wb"); fputs(programs[i], f); fclose(f); char cmd[512]; snprintf(cmd, sizeof cmd, "%s/w6c -o %s %s", bin, asmf, src); if (run(cmd) != 0) { fprintf(stderr, "w6c fail: %s\n", programs[i]); fail++; continue; } snprintf(cmd, sizeof cmd, "%s/w6a -o %s %s", bin, obj, asmf); if (run(cmd) != 0) { fprintf(stderr, "w6a fail: %s\n", programs[i]); fail++; continue; } FILE *of = fopen(obj, "rb"); if (of == NULL) { fail++; continue; } unsigned char hdr[16]; size_t r = fread(hdr, 1, sizeof hdr, of); fclose(of); if (r != 16 || memcmp(hdr, "\x7f""ELF", 4) != 0 || hdr[4] != 2 /* ELFCLASS64 */) { fprintf(stderr, "not an ELF64: %s\n", programs[i]); fail++; } } unlink(src); unlink(asmf); unlink(obj); if (fail) { fprintf(stderr, "%d/%d w6a tests failed\n", fail, n); return 1; } printf("w6a: %d/%d ok\n", n, n); return 0; }