aboutsummaryrefslogtreecommitdiff
path: root/tasm
diff options
context:
space:
mode:
Diffstat (limited to 'tasm')
-rw-r--r--tasm/Makefile4
-rw-r--r--tasm/gen/source.mk9
-rw-r--r--tasm/scripts/makefile21
-rw-r--r--tasm/src/assembler.c30
-rw-r--r--tasm/src/source.mk8
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)