summaryrefslogtreecommitdiff
path: root/src/cmd/6l
diff options
context:
space:
mode:
authorLuuk van Dijk <lvd@golang.org>2010-09-20 18:44:19 +0200
committerLuuk van Dijk <lvd@golang.org>2010-09-20 18:44:19 +0200
commit2c971cf5619e2cef631983c7da0e9d317d4954e8 (patch)
tree742182a620da5686e5892fbd7a671fef1e75b019 /src/cmd/6l
parent5246c9617771931fa4c2ac0f2783595e1d5f9be4 (diff)
downloadgo-2c971cf5619e2cef631983c7da0e9d317d4954e8.tar.gz
6l/8l: emit DWARF frame info.
R=rsc, ken2, r CC=golang-dev http://codereview.appspot.com/2151044
Diffstat (limited to 'src/cmd/6l')
-rw-r--r--src/cmd/6l/l.h11
-rw-r--r--src/cmd/6l/pass.c12
2 files changed, 19 insertions, 4 deletions
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h
index 22f266fe4..b8f47fc00 100644
--- a/src/cmd/6l/l.h
+++ b/src/cmd/6l/l.h
@@ -95,6 +95,7 @@ struct Prog
Prog* dlink;
Prog* pcond; /* work on this */
vlong pc;
+ int32 spadj;
int32 line;
short as;
char ft; /* oclass cache */
@@ -102,7 +103,7 @@ struct Prog
uchar mark; /* work on these */
uchar back;
- char width; /* fake for DATA */
+ char width; /* fake for DATA */
char mode; /* 16, 32, or 64 */
};
struct Auto
@@ -397,7 +398,7 @@ void buildop(void);
void cflush(void);
void ckoff(Sym*, int32);
Prog* copyp(Prog*);
-vlong cpos(void);
+vlong cpos(void);
double cputime(void);
void datblk(int32, int32);
void deadcode(void);
@@ -463,3 +464,9 @@ uint32 machheadr(void);
#pragma varargck type "R" int
#pragma varargck type "A" int
#pragma varargck argpos diag 1
+
+/* Used by ../ld/dwarf.c */
+enum
+{
+ DWARFREGSP = 7
+};
diff --git a/src/cmd/6l/pass.c b/src/cmd/6l/pass.c
index ea3351239..d207e7483 100644
--- a/src/cmd/6l/pass.c
+++ b/src/cmd/6l/pass.c
@@ -692,7 +692,7 @@ dostkoff(void)
p->from.type = D_INDIR+D_GS;
p->from.offset = tlsoffset+0;
p->to.type = D_CX;
-
+
if(debug['K']) {
// 6l -K means check not only for stack
// overflow but stack underflow.
@@ -843,6 +843,7 @@ dostkoff(void)
p->as = AADJSP;
p->from.type = D_CONST;
p->from.offset = autoffset;
+ p->spadj = autoffset;
if(q != P)
q->pcond = p;
}
@@ -903,26 +904,32 @@ dostkoff(void)
case APUSHL:
case APUSHFL:
deltasp += 4;
+ p->spadj = 4;
continue;
case APUSHQ:
case APUSHFQ:
deltasp += 8;
+ p->spadj = 8;
continue;
case APUSHW:
case APUSHFW:
deltasp += 2;
+ p->spadj = 2;
continue;
case APOPL:
case APOPFL:
deltasp -= 4;
+ p->spadj = -4;
continue;
case APOPQ:
case APOPFQ:
deltasp -= 8;
+ p->spadj = -8;
continue;
case APOPW:
case APOPFW:
deltasp -= 2;
+ p->spadj = -2;
continue;
case ARET:
break;
@@ -937,7 +944,7 @@ dostkoff(void)
p->as = AADJSP;
p->from.type = D_CONST;
p->from.offset = -autoffset;
-
+ p->spadj = -autoffset;
p = appendp(p);
p->as = ARET;
}
@@ -954,6 +961,7 @@ dostkoff(void)
q->from = zprg.from;
q->from.type = D_CONST;
q->from.offset = -autoffset;
+ q->spadj = -autoffset;
q->to = zprg.to;
continue;
}