diff options
| -rw-r--r-- | tasm/Makefile | 4 | ||||
| -rw-r--r-- | tasm/gen/source.mk | 9 | ||||
| -rw-r--r-- | tasm/scripts/makefile | 21 | ||||
| -rw-r--r-- | tasm/src/assembler.c | 30 | ||||
| -rw-r--r-- | tasm/src/source.mk | 8 |
5 files changed, 54 insertions, 18 deletions
diff --git a/tasm/Makefile b/tasm/Makefile index d2a1e69..2a28c21 100644 --- a/tasm/Makefile +++ b/tasm/Makefile @@ -20,6 +20,10 @@ setup: @echo -n > deps.mk @./scripts/gen-deps -p TASM -c COMPILE_TASM -b tasm "${TASM_SOURCES}" +.PHONY: analyze +analyze: setup + CC='gcc -fanalyzer' SKIP_ANALYZER='-fno-analyzer' $(MAKE) -f scripts/makefile + CLEANUP := build deps.mk tasm CLEANUP_CMD := TASM_SOURCES := ../core/bits.c diff --git a/tasm/gen/source.mk b/tasm/gen/source.mk new file mode 100644 index 0000000..107c342 --- /dev/null +++ b/tasm/gen/source.mk @@ -0,0 +1,9 @@ +gen/gen_parser.c: src/parser.y gen/gen_lexer.inc + bison -Wcounterexamples -o gen/gen_parser.c src/parser.y + +gen/gen_lexer.inc: src/lexer.l + flex -o gen/gen_lexer.inc src/lexer.l + +build/gen/gen_parser.o: gen/gen_parser.c + mkdir -p build/gen + $(COMPILE_TASM) $(SKIP_ANALYZER) -c gen/gen_parser.c -o build/gen/gen_parser.o diff --git a/tasm/scripts/makefile b/tasm/scripts/makefile index 367c03e..1d3bf5d 100644 --- a/tasm/scripts/makefile +++ b/tasm/scripts/makefile @@ -30,9 +30,14 @@ OBJCOPY != [ "$(LLVM)" != "0" ] \ && echo llvm-objcopy \ || echo $(CROSS_COMPILE)objcopy -COMPILER != [ "$(LLVM)" != "0" ] \ - && echo clang --target="$(CROSS_COMPILE)" \ - || echo $(CROSS_COMPILE)gcc +COMPILER != [ -n "$(CROSS_COMPILE)" ] \ + && { \ + [ "$(LLVM)" != "0" ] \ + && echo clang --target="$(CROSS_COMPILE)" \ + || echo $(CROSS_COMPILE)gcc \ + ; \ + } \ + || echo $(CC) OBFLAGS = -std=gnu17 -g @@ -56,15 +61,15 @@ LINT = $(COMPILER) \ UBSAN ?= 0 TASM_FLAGS != [ "$(UBSAN)" != "0" ] \ && echo -fsanitize=undefined \ - || echo + || : COMPILE_TASM = $(COMPILE) $(TASM_FLAGS) --include deps.mk --include src/source.mk +include deps.mk +include gen/source.mk -tasm: $(TASM_OBJS) - $(COMPILE_TASM) $(TASM_OBJS) -o $@ +tasm: $(TASM_OBJS) build/gen/gen_parser.o + $(COMPILE_TASM) $(TASM_OBJS) build/gen/gen_parser.o -o $@ # might lint some common things twice diff --git a/tasm/src/assembler.c b/tasm/src/assembler.c index d8b3ee6..690d9df 100644 --- a/tasm/src/assembler.c +++ b/tasm/src/assembler.c @@ -274,9 +274,21 @@ static int process(struct asm_ctx *ctx, const char *file) int process_file(struct asm_ctx *ctx, const char *file) { const char *base = tasm_basename(file); + if (!base) + return -1; + const char *dir = tasm_dirname(file); + if (!dir) { + free((void *)base); + return -1; + } const char *cwd = tasm_cwdname(); + if (!cwd) { + free((void *)base); + free((void *)dir); + return -1; + } chdir(dir); int res = process(ctx, base); @@ -292,6 +304,9 @@ int process_file(struct asm_ctx *ctx, const char *file) static struct asm_ctx *asm_ctx_create() { struct asm_ctx *ctx = malloc(sizeof(struct asm_ctx)); + if (!ctx) + return NULL; + /* code buffer */ ctx->size = 1; ctx->buf = malloc(sizeof(tri_t)); @@ -482,17 +497,26 @@ int assemble(const char *outfile, const char *infile) { /** @todo cleanup */ struct asm_ctx *ctx = asm_ctx_create(); + if (!ctx) + return -1; + int ret = process_file(ctx, infile); - if (ret) + if (ret) { + asm_ctx_destroy(ctx); return ret; + } ret = fix_relocs(ctx); - if (ret) + if (ret) { + asm_ctx_destroy(ctx); return ret; + } FILE *f = fopen(outfile, "wb"); - if (!f) + if (!f) { + asm_ctx_destroy(ctx); return -1; + } for (size_t i = 0; i < ctx->idx; ++i) { tri_t t = ctx->buf[i]; diff --git a/tasm/src/source.mk b/tasm/src/source.mk index 5052ba3..a82d9f3 100644 --- a/tasm/src/source.mk +++ b/tasm/src/source.mk @@ -1,8 +1,2 @@ SOURCES != echo src/*.c -TASM_SOURCES += $(SOURCES) gen/gen_parser.c - -gen/gen_parser.c: src/parser.y gen/gen_lexer.inc - bison -Wcounterexamples -o gen/gen_parser.c src/parser.y - -gen/gen_lexer.inc: src/lexer.l - flex -o gen/gen_lexer.inc src/lexer.l +TASM_SOURCES += $(SOURCES) |
