summary refs log tree commit diff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin@c9x.me>2022-03-14 10:58:55 +0100
committerQuentin Carbonneaux <quentin@c9x.me>2022-03-14 15:32:27 +0100
commit6ca9399ed6bec1a448aef79236670cd3daeb7daf (patch)
treea03e71383dee909f17d613589bec6082713aae23
parent7a7a5f480312b997dcac0e4cc3befb502e54c836 (diff)
downloadroux-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.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];