summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--all.h6
-rw-r--r--gas.c26
-rw-r--r--main.c17
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];