ww: import toolchain — C bootstrap + ww-side self-host (phases 0-10)
C bootstrap (phases 0-9):
cmd/wwc, cmd/6c, cmd/6a, cmd/6l, cmd/ww, rt, lib/*.
ww-side self-host (phase 10):
selfhost/cmd/wwc — ww-cgen frontend; bootstrap fixed point.
selfhost/cmd/6a — assembler; byte-identical to C 6a (test 991).
selfhost/cmd/6l — linker w/ archive (.a) support; byte-identical
to C 6l (test 992).
selfhost/cmd/ww — driver (build/run/version); byte-identical to
C ww (test 993).
make test: 15/15. make bootstrap: ww2.s == ww3.s, ww2.o == ww3.o,
ww2 == ww3 byte-identical, with the full ww-tooled chain.
This commit is contained in:
65
test/wwc/900_stdlib.c
Normal file
65
test/wwc/900_stdlib.c
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* 900_stdlib — verify each stdlib module parses, type-checks, and
|
||||
* codegens. We don't link or run them; they exist for downstream
|
||||
* users to import. As real applications come online they will start
|
||||
* exercising the bodies through the e2e harness.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static const char *modules[] = {
|
||||
"lib/types/types.ww",
|
||||
"lib/ascii/ascii.ww",
|
||||
"lib/bytes/bytes.ww",
|
||||
"lib/strings/strings.ww",
|
||||
"lib/io/stream.ww",
|
||||
"lib/errors/errors.ww",
|
||||
"lib/os/os.ww",
|
||||
"lib/strconv/strconv.ww",
|
||||
"lib/sort/sort.ww",
|
||||
"lib/path/path.ww",
|
||||
"lib/encoding/utf8/utf8.ww",
|
||||
"lib/encoding/hex/hex.ww",
|
||||
"lib/hash/fnv/fnv.ww",
|
||||
"lib/time/time.ww",
|
||||
"lib/c/libc/libc.ww",
|
||||
"lib/bufio/bufio.ww",
|
||||
"lib/fmt/fmt.ww",
|
||||
"lib/net/net.ww",
|
||||
"lib/slices/slices.ww",
|
||||
NULL
|
||||
};
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
const char *bin = getenv("BIN");
|
||||
if (!bin) bin = "out/bin";
|
||||
char absbin[1024];
|
||||
if (bin[0] != '/') {
|
||||
char cwd[1024];
|
||||
if (getcwd(cwd, sizeof cwd) == NULL) return 1;
|
||||
snprintf(absbin, sizeof absbin, "%s/%s", cwd, bin);
|
||||
bin = absbin;
|
||||
}
|
||||
char cwd[1024];
|
||||
if (getcwd(cwd, sizeof cwd) == NULL) return 1;
|
||||
|
||||
int n = 0, fail = 0;
|
||||
for (int i = 0; modules[i]; i++, n++) {
|
||||
char path[1024], cmd[2048];
|
||||
snprintf(path, sizeof path, "%s/%s", cwd, modules[i]);
|
||||
snprintf(cmd, sizeof cmd, "%s/6c %s > /dev/null 2>&1",
|
||||
bin, path);
|
||||
int rc = system(cmd);
|
||||
if (rc != 0) {
|
||||
fprintf(stderr, "stdlib FAIL: %s (rc=%d)\n", modules[i], rc);
|
||||
fail++;
|
||||
}
|
||||
}
|
||||
if (fail) { fprintf(stderr, "%d/%d stdlib modules failed\n", fail, n); return 1; }
|
||||
printf("stdlib: %d/%d ok\n", n, n);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user