aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuuk van Dijk <lvd@golang.org>2010-10-19 18:09:18 +0200
committerLuuk van Dijk <lvd@golang.org>2010-10-19 18:09:18 +0200
commit54aba2e6dd51e3a5d5f1c8f164332703c451ae4e (patch)
tree89b3ece8e4d1dd1db0d903061cafd7fc64f6463d
parente64280ecfae776972bfb23103e6adb41b6607b4a (diff)
downloadgo-54aba2e6dd51e3a5d5f1c8f164332703c451ae4e.tar.gz
go-54aba2e6dd51e3a5d5f1c8f164332703c451ae4e.zip
[68]l: expose genasmsym.
R=rsc CC=golang-dev https://golang.org/cl/2512042
-rw-r--r--src/cmd/6l/l.h1
-rw-r--r--src/cmd/8l/l.h1
-rw-r--r--src/cmd/8l/symtab.c40
3 files changed, 26 insertions, 16 deletions
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h
index e3f409e078..c79c6837d6 100644
--- a/src/cmd/6l/l.h
+++ b/src/cmd/6l/l.h
@@ -397,6 +397,7 @@ void doprof2(void);
void dostkoff(void);
vlong entryvalue(void);
void follow(void);
+void genasmsym(void (*put)(char*, int, vlong, vlong, int, Sym*));
void gethunk(void);
void gotypestrings(void);
void listinit(void);
diff --git a/src/cmd/8l/l.h b/src/cmd/8l/l.h
index 53dc63c583..72d2adcee4 100644
--- a/src/cmd/8l/l.h
+++ b/src/cmd/8l/l.h
@@ -346,6 +346,7 @@ void doprof2(void);
void dostkoff(void);
int32 entryvalue(void);
void follow(void);
+void genasmsym(void (*put)(char*, int, vlong, vlong, int, Sym*));
void instinit(void);
void listinit(void);
Sym* lookup(char*, int);
diff --git a/src/cmd/8l/symtab.c b/src/cmd/8l/symtab.c
index be8636a2d5..356dc6a7b9 100644
--- a/src/cmd/8l/symtab.c
+++ b/src/cmd/8l/symtab.c
@@ -34,7 +34,7 @@
#include "../ld/lib.h"
void
-putsymb(char *s, int t, int32 v, int ver, Sym *go)
+putsymb(char *s, int t, vlong v, vlong size, int ver, Sym *go)
{
int i, f;
vlong gv;
@@ -89,7 +89,7 @@ putsymb(char *s, int t, int32 v, int ver, Sym *go)
}
void
-asmsym(void)
+genasmsym(void (*put)(char*, int, vlong, vlong, int, Sym*))
{
Auto *a;
Sym *s;
@@ -97,10 +97,10 @@ asmsym(void)
s = lookup("etext", 0);
if(s->type == STEXT)
- putsymb(s->name, 'T', s->value, s->version, 0);
+ put(s->name, 'T', s->value, s->size, s->version, 0);
- for(h=0; h<NHASH; h++)
- for(s=hash[h]; s!=S; s=s->hash)
+ for(h=0; h<NHASH; h++) {
+ for(s=hash[h]; s!=S; s=s->hash) {
switch(s->type) {
case SCONST:
case SRODATA:
@@ -108,52 +108,60 @@ asmsym(void)
case SELFDATA:
if(!s->reachable)
continue;
- putsymb(s->name, 'D', symaddr(s), s->version, s->gotype);
+ put(s->name, 'D', symaddr(s), s->size, s->version, s->gotype);
continue;
case SMACHO:
if(!s->reachable)
continue;
- putsymb(s->name, 'D', s->value+INITDAT+segdata.filelen-dynptrsize, s->version, s->gotype);
+ put(s->name, 'D', s->value+INITDAT+segdata.filelen-dynptrsize, s->size, s->version, s->gotype);
continue;
case SBSS:
if(!s->reachable)
continue;
- putsymb(s->name, 'B', s->value+INITDAT, s->version, s->gotype);
+ put(s->name, 'B', s->value+INITDAT, s->size, s->version, s->gotype);
continue;
case SFIXED:
- putsymb(s->name, 'B', s->value, s->version, s->gotype);
+ put(s->name, 'B', s->value, s->size, s->version, s->gotype);
continue;
case SFILE:
- putsymb(s->name, 'f', s->value, s->version, 0);
+ put(s->name, 'f', s->value, 0, s->version, 0);
continue;
}
+ }
+ }
for(s = textp; s != nil; s = s->next) {
/* filenames first */
for(a=s->autom; a; a=a->link)
if(a->type == D_FILE)
- putsymb(a->asym->name, 'z', a->aoffset, 0, 0);
+ put(a->asym->name, 'z', a->aoffset, 0, 0, 0);
else
if(a->type == D_FILE1)
- putsymb(a->asym->name, 'Z', a->aoffset, 0, 0);
+ put(a->asym->name, 'Z', a->aoffset, 0, 0, 0);
- putsymb(s->name, 'T', s->value, s->version, s->gotype);
+ put(s->name, 'T', s->value, s->size, s->version, s->gotype);
/* frame, auto and param after */
- putsymb(".frame", 'm', s->text->to.offset+4, 0, 0);
+ put(".frame", 'm', s->text->to.offset+4, 0, 0, 0);
for(a=s->autom; a; a=a->link)
if(a->type == D_AUTO)
- putsymb(a->asym->name, 'a', -a->aoffset, 0, a->gotype);
+ put(a->asym->name, 'a', -a->aoffset, 0, 0, a->gotype);
else
if(a->type == D_PARAM)
- putsymb(a->asym->name, 'p', a->aoffset, 0, a->gotype);
+ put(a->asym->name, 'p', a->aoffset, 0, 0, a->gotype);
}
if(debug['v'] || debug['n'])
Bprint(&bso, "symsize = %ud\n", symsize);
Bflush(&bso);
}
+
+void
+asmsym(void)
+{
+ genasmsym(putsymb);
+}