summaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2014-08-15 15:31:54 -0400
committerShenghou Ma <minux@golang.org>2014-08-15 15:31:54 -0400
commita78e6cc8d5fffdc680350684a9c0d92d4eaf6328 (patch)
treec91593e0b5286fac5acbfebe023daf8a92aa18e2 /src/liblink
parent820abe2364e4469bee248143a379a63622091fbb (diff)
downloadgo-a78e6cc8d5fffdc680350684a9c0d92d4eaf6328.tar.gz
[dev.power64] liblink: fix g->panicwrap update code generation
LGTM=rsc R=golang-codereviews, rsc CC=golang-codereviews https://codereview.appspot.com/123400043
Diffstat (limited to 'src/liblink')
-rw-r--r--src/liblink/obj9.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/liblink/obj9.c b/src/liblink/obj9.c
index 3405fce47..28793676c 100644
--- a/src/liblink/obj9.c
+++ b/src/liblink/obj9.c
@@ -512,6 +512,36 @@ addstacksplit(Link *ctxt, LSym *cursym)
p->to.type = D_BRANCH;
break;
}
+ if(cursym->text->reg & WRAPPER) {
+ // g->panicwrap -= autosize;
+ // MOVWZ panicwrap_offset(g), R3
+ // ADD $-autosize, R3
+ // MOVWZ R3, panicwrap_offset(g)
+ p->as = AMOVWZ;
+ p->from.type = D_OREG;
+ p->from.reg = REGG;
+ p->from.offset = 2*ctxt->arch->ptrsize;
+ p->to.type = D_REG;
+ p->to.reg = 3;
+ p = appendp(ctxt, p);
+
+ p->as = AADD;
+ p->from.type = D_CONST;
+ p->from.offset = -autosize;
+ p->to.type = D_REG;
+ p->to.reg = 3;
+ p = appendp(ctxt, p);
+
+ p->as = AMOVWZ;
+ p->from.type = D_REG;
+ p->from.reg = 3;
+ p->to.type = D_OREG;
+ p->to.reg = REGG;
+ p->to.offset = 2*ctxt->arch->ptrsize;
+ p = appendp(ctxt, p);
+
+ p->as = ARETURN;
+ }
if(cursym->text->mark & LEAF) {
if(!autosize) {
p->as = ABR;