diff options
author | Quentin Carbonneaux <quentin@c9x.me> | 2022-03-14 10:58:55 +0100 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2022-03-14 15:32:27 +0100 |
commit | 6ca9399ed6bec1a448aef79236670cd3daeb7daf (patch) | |
tree | a03e71383dee909f17d613589bec6082713aae23 | |
parent | 7a7a5f480312b997dcac0e4cc3befb502e54c836 (diff) | |
download | roux-6ca9399ed6bec1a448aef79236670cd3daeb7daf.tar.gz |
output symbol type and size
That is not available on osx so I tweaked the gas.c api a little to conditionally output the two directives.
-rw-r--r-- | all.h | 6 | ||||
-rw-r--r-- | gas.c | 26 | ||||
-rw-r--r-- | main.c | 17 |
3 files changed, 34 insertions, 15 deletions
diff --git a/all.h b/all.h index f806c5b..7e1a8d3 100644 --- a/all.h +++ b/all.h @@ -523,9 +523,15 @@ void spill(Fn *); void rega(Fn *); /* gas.c */ +enum Asm { + Gasmacho, + Gaself, +}; extern char *gasloc; extern char *gassym; +void gasinit(enum Asm); void gasemitlnk(char *, Lnk *, char *, FILE *); +void gasemitfntail(char *, FILE *); void gasemitdat(Dat *, FILE *); int gasstash(void *, int); void gasemitfin(FILE *); diff --git a/gas.c b/gas.c index e67043b..4ac42be 100644 --- a/gas.c +++ b/gas.c @@ -2,6 +2,23 @@ char *gasloc, *gassym; +static int gasasm; + +void +gasinit(enum Asm asmmode) +{ + gasasm = asmmode; + switch (gasasm) { + case Gaself: + gasloc = ".L"; + gassym = ""; + break; + case Gasmacho: + gasloc = "L"; + gassym = "_"; + break; + } +} void gasemitlnk(char *n, Lnk *l, char *s, FILE *f) @@ -25,6 +42,15 @@ gasemitlnk(char *n, Lnk *l, char *s, FILE *f) } void +gasemitfntail(char *fn, FILE *f) +{ + if (gasasm == Gaself) { + fprintf(f, ".type %s, @function\n", fn); + fprintf(f, ".size %s, .-%s\n", fn, fn); + } +} + +void gasemitdat(Dat *d, FILE *f) { static char *dtoa[] = { diff --git a/main.c b/main.c index ee16a75..74d057d 100644 --- a/main.c +++ b/main.c @@ -19,11 +19,6 @@ static struct TMap { { 0, 0 } }; -enum Asm { - Gasmacho, - Gaself, -}; - char debug['Z'+1] = { ['P'] = 0, /* parsing */ ['M'] = 0, /* memory optimization */ @@ -101,6 +96,7 @@ func(Fn *fn) fn->rpo[n]->link = fn->rpo[n+1]; if (!dbg) { T.emitfn(fn, outf); + gasemitfntail(fn->name, outf); fprintf(outf, "/* end function %s */\n\n", fn->name); } else fprintf(stderr, "\n"); @@ -174,16 +170,7 @@ main(int ac, char *av[]) exit(c != 'h'); } - switch (asmmode) { - case Gaself: - gasloc = ".L"; - gassym = ""; - break; - case Gasmacho: - gasloc = "L"; - gassym = "_"; - break; - } + gasinit(asmmode); do { f = av[optind]; |