* first bunch of pic fixes

git-svn-id: trunk@76 -
This commit is contained in:
florian 2005-05-22 19:57:38 +00:00
parent 9fba8829e3
commit b0545a7a04
2 changed files with 34 additions and 3 deletions

View File

@ -70,7 +70,11 @@ interface
if assigned(symbol) then
AsmWrite(symbol.name);
if ref.refaddr=addr_pic then
{$ifdef x86_64}
AsmWrite('@GOTPCREL');
{$else x86_64}
AsmWrite('@GOT');
{$endif x86_64}
if offset<0 then
AsmWrite(tostr(offset))
else

View File

@ -324,11 +324,9 @@ unit cgx86;
procedure tcgx86.make_simple_ref(list:taasmoutput;var ref: treference);
{$ifdef x86_64}
var
hreg : tregister;
href : treference;
{$endif x86_64}
begin
{$ifdef x86_64}
{ Only 32bit is allowed }
@ -384,6 +382,31 @@ unit cgx86;
ref.base:=hreg;
end;
end;
{$else x86_64}
if (cs_create_pic in aktmoduleswitches) and
assigned(ref.symbol) then
begin
reference_reset_symbol(href,ref.symbol,0);
hreg:=getaddressregister(list);
href.refaddr:=addr_pic;
href.base:=current_procinfo.got;
list.concat(taicpu.op_ref_reg(A_MOV,S_L,href,hreg));
ref.symbol:=nil;
if ref.base=NR_NO then
ref.base:=hreg
else if ref.index=NR_NO then
begin
ref.index:=hreg;
ref.scalefactor:=1;
end
else
begin
list.concat(taicpu.op_reg_reg(A_ADD,S_Q,ref.base,hreg));
ref.base:=hreg;
end;
end;
{$endif x86_64}
end;
@ -666,7 +689,10 @@ unit cgx86;
tmpref.base:=NR_RIP;
list.concat(taicpu.op_ref_reg(A_MOV,S_Q,tmpref,r));
{$else x86_64}
internalerror(2005042501);
reference_reset_symbol(tmpref,ref.symbol,0);
tmpref.refaddr:=addr_pic;
tmpref.base:=current_procinfo.got;
list.concat(taicpu.op_ref_reg(A_MOV,S_L,tmpref,r));
{$endif x86_64}
end
else
@ -1753,6 +1779,7 @@ unit cgx86;
a_call_name(list,'FPC_GETEIPINEBX');
list.concat(taicpu.op_sym_ofs_reg(A_ADD,tcgsize2opsize[OS_ADDR],objectlibrary.newasmsymbol('_GLOBAL_OFFSET_TABLE_',AB_EXTERNAL,AT_DATA),0,NR_PIC_OFFSET_REG));
list.concat(tai_regalloc.alloc(NR_PIC_OFFSET_REG,nil));
current_procinfo.got:=NR_PIC_OFFSET_REG;
end;
end;