setuintxx(s, r, v, 8);
}
-static vlong
-addaddrpcrelplus(Sym *s, Sym *t, int32 add)
-{
- vlong i;
- Reloc *r;
-
- if(s->type == 0)
- s->type = SDATA;
- s->reachable = 1;
- i = s->size;
- s->size += PtrSize;
- symgrow(s, s->size);
- r = addrel(s);
- r->sym = t;
- r->off = i;
- r->siz = PtrSize;
- r->type = D_PCREL;
- r->add = add;
- return i;
-}
-
vlong
addaddrplus(Sym *s, Sym *t, int32 add)
{
//print("gcaddsym: %s %d %s\n", s->name, s->size, gotype->name);
adduintxx(gc, GC_CALL, PtrSize);
adduintxx(gc, off, PtrSize);
- addaddrpcrelplus(gc, decodetype_gc(gotype), 4*PtrSize);
+ addpcrelplus(gc, decodetype_gc(gotype), 3*PtrSize+4);
+ if(PtrSize == 8)
+ adduintxx(gc, 0, 4);
} else {
//print("gcaddsym: %s %d <unknown type>\n", s->name, s->size);
for(a = -off&(PtrSize-1); a+PtrSize<=s->size; a+=PtrSize) {
// Stack push.
*stack_ptr-- = stack_top;
stack_top = (Frame){1, 0, stack_top.b + pc[1], pc+3 /*return address*/};
- pc = (uintptr*)((byte*)pc + (uintptr)pc[2]); // target of the CALL instruction
+ pc = (uintptr*)((byte*)pc + *(int32*)(pc+2)); // target of the CALL instruction
continue;
case GC_MAP_PTR: