diff options
author | Thomas Bracht Laumann Jespersen <t@laumann.xyz> | 2023-01-26 12:09:44 +0100 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2023-06-06 18:44:51 +0200 |
commit | 0d929287d77ccc3fb52ca8bd072678b5ae2c81c8 (patch) | |
tree | 72cf91ec66052797059734c9d089a49a69b47122 /emit.c | |
parent | e493a7f23352f51acc0a1e12284ab19d7894488a (diff) | |
download | roux-0d929287d77ccc3fb52ca8bd072678b5ae2c81c8.tar.gz |
implement line number info tracking
Support "file" and "loc" directives. "file" takes a string (a file name) assigns it a number, sets the current file to that number and records the string for later. "loc" takes a single number and outputs location information with a reference to the current file.
Diffstat (limited to 'emit.c')
-rw-r--r-- | emit.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/emit.c b/emit.c index 017c461..b880d67 100644 --- a/emit.c +++ b/emit.c @@ -207,3 +207,35 @@ macho_emitfin(FILE *f) emitfin(f, sec); } + +static uint32_t *file; +static uint nfile; +static uint curfile; + +void +emitdbgfile(char *fn, FILE *f) +{ + uint32_t id; + uint n; + + id = intern(fn); + for (n=0; n<nfile; n++) + if (file[n] == id) { + /* gas requires positive + * file numbers */ + curfile = n + 1; + return; + } + if (!file) + file = vnew(0, sizeof *file, PHeap); + vgrow(&file, ++nfile); + file[nfile-1] = id; + curfile = nfile; + fprintf(f, ".file %u %s\n", curfile, fn); +} + +void +emitdbgloc(uint loc, FILE *f) +{ + fprintf(f, "\t.loc %u %u\n", curfile, loc); +} |