Commit 56a06db3 authored by Russ Cox's avatar Russ Cox

cmd/ld: change GC_CALL to 32-bit relative address

The current code uses 64-bit pc-relative on 64-bit systems,
but in ELF linkers there is no such thing, so we cannot
express this in a .o file. Change to 32-bit.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/7383055
parent c8dcaeb2
...@@ -748,27 +748,6 @@ setuint64(Sym *s, vlong r, uint64 v) ...@@ -748,27 +748,6 @@ setuint64(Sym *s, vlong r, uint64 v)
setuintxx(s, r, v, 8); 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 vlong
addaddrplus(Sym *s, Sym *t, int32 add) addaddrplus(Sym *s, Sym *t, int32 add)
{ {
...@@ -949,7 +928,9 @@ gcaddsym(Sym *gc, Sym *s, int32 off) ...@@ -949,7 +928,9 @@ gcaddsym(Sym *gc, Sym *s, int32 off)
//print("gcaddsym: %s %d %s\n", s->name, s->size, gotype->name); //print("gcaddsym: %s %d %s\n", s->name, s->size, gotype->name);
adduintxx(gc, GC_CALL, PtrSize); adduintxx(gc, GC_CALL, PtrSize);
adduintxx(gc, off, 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 { } else {
//print("gcaddsym: %s %d <unknown type>\n", s->name, s->size); //print("gcaddsym: %s %d <unknown type>\n", s->name, s->size);
for(a = -off&(PtrSize-1); a+PtrSize<=s->size; a+=PtrSize) { for(a = -off&(PtrSize-1); a+PtrSize<=s->size; a+=PtrSize) {
......
...@@ -837,7 +837,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking) ...@@ -837,7 +837,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking)
// Stack push. // Stack push.
*stack_ptr-- = stack_top; *stack_ptr-- = stack_top;
stack_top = (Frame){1, 0, stack_top.b + pc[1], pc+3 /*return address*/}; 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; continue;
case GC_MAP_PTR: case GC_MAP_PTR:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment