From b1c8bfc478ce4923a70c4cc1ca0fff6659d51fd6 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 6 Feb 2005 00:05:56 +0000 Subject: [PATCH] + x86_64 pic draft --- compiler/aasmtai.pas | 11 ++++++++++- compiler/pmodules.pas | 11 ++++++++++- compiler/systems.pas | 8 ++++++-- compiler/systems/i_linux.pas | 10 +++++++--- compiler/x86/agx86att.pas | 9 +++++++-- compiler/x86/cgx86.pas | 32 ++++++++++++++++++++++++++++++-- compiler/x86/nx86add.pas | 20 ++++++++++++++++---- compiler/x86/x86reg.dat | 8 ++++++-- compiler/x86_64/cgcpu.pas | 13 ++++++------- compiler/x86_64/r8664ari.inc | 31 ++++++++++++++++--------------- compiler/x86_64/r8664att.inc | 3 ++- compiler/x86_64/r8664con.inc | 1 + compiler/x86_64/r8664dwrf.inc | 1 + compiler/x86_64/r8664nor.inc | 2 +- compiler/x86_64/r8664num.inc | 1 + compiler/x86_64/r8664op.inc | 1 + compiler/x86_64/r8664ot.inc | 1 + compiler/x86_64/r8664rni.inc | 5 +++-- compiler/x86_64/r8664sri.inc | 33 +++++++++++++++++---------------- compiler/x86_64/r8664stab.inc | 1 + compiler/x86_64/r8664std.inc | 3 ++- 21 files changed, 145 insertions(+), 60 deletions(-) diff --git a/compiler/aasmtai.pas b/compiler/aasmtai.pas index dc6317c807..bd91c09e2f 100644 --- a/compiler/aasmtai.pas +++ b/compiler/aasmtai.pas @@ -1891,6 +1891,12 @@ implementation too much of a a speed penalty} if (ref^.segment<>NR_NO) and (ref^.segment<>NR_DS) then segprefix:=ref^.segment; +{$endif} +{$ifdef extdebug} + if (cs_create_pic in aktmoduleswitches) and + assigned(r.symbol) and + (r.refaddr=addr_no) then + internalerror(200502052); {$endif} typ:=top_ref; if assigned(add_reg_instruction_hook) then @@ -2236,7 +2242,10 @@ begin end. { $Log$ - Revision 1.93 2005-01-31 17:07:50 peter + Revision 1.94 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.93 2005/01/31 17:07:50 peter * fix [regpara] in intel assembler Revision 1.92 2004/11/01 10:34:08 peter diff --git a/compiler/pmodules.pas b/compiler/pmodules.pas index 2accaaaa93..6a71de8528 100644 --- a/compiler/pmodules.pas +++ b/compiler/pmodules.pas @@ -788,6 +788,8 @@ implementation if (cs_local_browser in aktmoduleswitches) and not(cs_browser in aktmoduleswitches) then exclude(aktmoduleswitches,cs_local_browser); + if (cs_create_pic in aktmoduleswitches) then + def_system_macro('FPC_PIC'); end; @@ -1348,6 +1350,10 @@ implementation current_module.realmodulename:=stringdup(orgpattern); current_module.islibrary:=true; exportlib.preparelib(orgpattern); + + if tf_library_needs_pic in target_info.flags then + include(aktmoduleswitches,cs_create_pic); + consume(_ID); consume(_SEMICOLON); end @@ -1602,7 +1608,10 @@ implementation end. { $Log$ - Revision 1.181 2005-01-24 22:08:32 peter + Revision 1.182 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.181 2005/01/24 22:08:32 peter * interface wrapper generation moved to cgobj * generate interface wrappers after the module is parsed diff --git a/compiler/systems.pas b/compiler/systems.pas index 6facb5c032..97455afe16 100644 --- a/compiler/systems.pas +++ b/compiler/systems.pas @@ -230,7 +230,8 @@ interface tf_smartlink_sections, tf_needs_dwarf_cfi, tf_use_8_3, - tf_pic_uses_got + tf_pic_uses_got, + tf_library_needs_pic ); psysteminfo = ^tsysteminfo; @@ -717,7 +718,10 @@ finalization end. { $Log$ - Revision 1.100 2005-01-25 18:48:15 peter + Revision 1.101 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.100 2005/01/25 18:48:15 peter * tf_pic_uses_got added Revision 1.99 2004/12/28 20:43:00 hajny diff --git a/compiler/systems/i_linux.pas b/compiler/systems/i_linux.pas index 2c15f88c5d..ac33823152 100644 --- a/compiler/systems/i_linux.pas +++ b/compiler/systems/i_linux.pas @@ -285,7 +285,8 @@ unit i_linux; system : system_x86_64_LINUX; name : 'Linux for x86-64'; shortname : 'Linux'; - flags : [tf_needs_symbol_size,tf_needs_dwarf_cfi]; + flags : [tf_needs_symbol_size,tf_needs_dwarf_cfi, + tf_library_needs_pic]; cpu : cpu_x86_64; unit_env : 'LINUXUNITS'; extradefines : 'UNIX;HASUNIX'; @@ -348,7 +349,7 @@ unit i_linux; system : system_SPARC_Linux; name : 'Linux for SPARC'; shortname : 'Linux'; - flags : [tf_needs_symbol_size]; + flags : [tf_needs_symbol_size,tf_library_needs_pic]; cpu : cpu_SPARC; unit_env : 'LINUXUNITS'; extradefines : 'UNIX;HASUNIX'; @@ -513,7 +514,10 @@ initialization end. { $Log$ - Revision 1.34 2005-01-30 17:45:38 florian + Revision 1.35 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.34 2005/01/30 17:45:38 florian * better alignment on linux Revision 1.33 2005/01/25 18:48:15 peter diff --git a/compiler/x86/agx86att.pas b/compiler/x86/agx86att.pas index a4fe8bd422..196700ccf5 100644 --- a/compiler/x86/agx86att.pas +++ b/compiler/x86/agx86att.pas @@ -70,6 +70,8 @@ interface AsmWrite(gas_regname(segment)+':'); if assigned(symbol) then AsmWrite(symbol.name); + if ref.refaddr=addr_pic then + AsmWrite('@GOTPCREL'); if offset<0 then AsmWrite(tostr(offset)) else @@ -111,7 +113,7 @@ interface top_reg : AsmWrite(gas_regname(o.reg)); top_ref : - if o.ref^.refaddr=addr_no then + if o.ref^.refaddr in [addr_no,addr_pic] then WriteReference(o.ref^) else begin @@ -279,7 +281,10 @@ initialization end. { $Log$ - Revision 1.17 2004-10-31 21:45:04 peter + Revision 1.18 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.17 2004/10/31 21:45:04 peter * generic tlocation * move tlocation to cgutils diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index 5a9b69bced..0dcf215bbd 100644 --- a/compiler/x86/cgx86.pas +++ b/compiler/x86/cgx86.pas @@ -112,6 +112,7 @@ unit cgx86; procedure g_overflowcheck(list: taasmoutput; const l:tlocation;def:tdef);override; + procedure make_simple_ref(list:taasmoutput;var ref: treference); protected procedure a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: tasmlabel); procedure check_register_size(size:tcgsize;reg:tregister); @@ -119,7 +120,6 @@ unit cgx86; procedure opmm_loc_reg(list: taasmoutput; Op: TOpCG; size : tcgsize;loc : tlocation;dst: tregister; shuffle : pmmshuffle); private procedure sizes2load(s1,s2 : tcgsize;var op: tasmop; var s3: topsize); - procedure make_simple_ref(list:taasmoutput;var ref: treference); procedure floatload(list: taasmoutput; t : tcgsize;const ref : treference); procedure floatstore(list: taasmoutput; t : tcgsize;const ref : treference); @@ -328,6 +328,7 @@ unit cgx86; {$ifdef x86_64} var hreg : tregister; + href : treference; {$endif x86_64} begin {$ifdef x86_64} @@ -360,6 +361,30 @@ unit cgx86; end; end; end; + 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:=NR_RIP; + list.concat(taicpu.op_ref_reg(A_MOV,S_Q,href,hreg)); + + ref.symbol:=nil; + + if ref.index=NR_NO then + begin + ref.index:=hreg; + ref.scalefactor:=1; + end + else if ref.base=NR_NO then + ref.base:=hreg + else + begin + list.concat(taicpu.op_reg_reg(A_ADD,S_Q,ref.base,hreg)); + ref.base:=hreg; + end; + end; {$endif x86_64} end; @@ -1746,7 +1771,10 @@ unit cgx86; end. { $Log$ - Revision 1.144 2005-02-05 18:32:17 florian + Revision 1.145 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.144 2005/02/05 18:32:17 florian * fixed previous commit Revision 1.143 2005/02/05 18:08:48 florian diff --git a/compiler/x86/nx86add.pas b/compiler/x86/nx86add.pas index 18fe3cbf04..13fc676513 100644 --- a/compiler/x86/nx86add.pas +++ b/compiler/x86/nx86add.pas @@ -255,7 +255,10 @@ unit nx86add; exprasmlist.concat(taicpu.op_reg_reg(op,TCGSize2Opsize[opsize],right.location.register,left.location.register)); LOC_REFERENCE, LOC_CREFERENCE : - exprasmlist.concat(taicpu.op_ref_reg(op,TCGSize2Opsize[opsize],right.location.reference,left.location.register)); + begin + tcgx86(cg).make_simple_ref(exprasmlist,right.location.reference); + exprasmlist.concat(taicpu.op_ref_reg(op,TCGSize2Opsize[opsize],right.location.reference,left.location.register)); + end; LOC_CONSTANT : begin {$ifdef x86_64} @@ -512,7 +515,10 @@ unit nx86add; location_force_mem(exprasmlist,left.location); case left.location.loc of LOC_REFERENCE,LOC_CREFERENCE: - exprasmlist.concat(taicpu.op_ref_reg(op,S_NO,left.location.reference,right.location.register)); + begin + tcgx86(cg).make_simple_ref(exprasmlist,left.location.reference); + exprasmlist.concat(taicpu.op_ref_reg(op,S_NO,left.location.reference,right.location.register)); + end; LOC_MMREGISTER,LOC_CMMREGISTER: exprasmlist.concat(taicpu.op_reg_reg(op,S_NO,left.location.register,right.location.register)); else @@ -535,7 +541,10 @@ unit nx86add; location_force_mem(exprasmlist,right.location); case right.location.loc of LOC_REFERENCE,LOC_CREFERENCE: - exprasmlist.concat(taicpu.op_ref_reg(op,S_NO,right.location.reference,left.location.register)); + begin + tcgx86(cg).make_simple_ref(exprasmlist,right.location.reference); + exprasmlist.concat(taicpu.op_ref_reg(op,S_NO,right.location.reference,left.location.register)); + end; LOC_MMREGISTER,LOC_CMMREGISTER: exprasmlist.concat(taicpu.op_reg_reg(op,S_NO,right.location.register,left.location.register)); else @@ -795,7 +804,10 @@ begin end. { $Log$ - Revision 1.15 2004-11-01 12:43:29 peter + Revision 1.16 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.15 2004/11/01 12:43:29 peter * shortstr compare with empty string fixed * removed special i386 code diff --git a/compiler/x86/x86reg.dat b/compiler/x86/x86reg.dat index 47bbc441b4..96b7069125 100644 --- a/compiler/x86/x86reg.dat +++ b/compiler/x86/x86reg.dat @@ -79,7 +79,8 @@ NR_R15W,$0103000f,r15w,%r15w,r15w,r15w,-1,-1,15,OT_REG16,0,64 NR_R15D,$0104000f,r15d,%r15d,r15d,r15d,-1,-1,15,OT_REG32,0,64 ; EIP is needed for DWARF call frame info return address (RA) -NR_EIP,$05000000,EIP,EIP,EIP,EIP,-1,8,16,OT_NONE,0 +NR_RIP,$05000000,rip,%rip,rip,rip,-1,8,16,OT_NONE,0,64 +NR_EIP,$05000000,eip,%eip,eip,eip,-1,8,16,OT_NONE,0 NR_CS,$05000001,cs,%cs,cs,cs,-1,-1,-1,OT_REG_CS,1 NR_DS,$05000002,ds,%ds,ds,ds,-1,-1,-1,OT_REG_DESS,3 NR_ES,$05000003,es,%es,es,es,-1,-1,-1,OT_REG_DESS,0 @@ -142,7 +143,10 @@ NR_XMM15,$0400000f,xmm15,%xmm15,xmm15,xmm15,-1,-1,32,OT_XMMREG,7,64 ; ; $Log$ -; Revision 1.5 2004-06-16 20:07:11 florian +; Revision 1.6 2005-02-06 00:05:56 florian +; + x86_64 pic draft +; +; Revision 1.5 2004/06/16 20:07:11 florian ; * dwarf branch merged ; ; Revision 1.4.2.2 2004/04/20 16:35:58 peter diff --git a/compiler/x86_64/cgcpu.pas b/compiler/x86_64/cgcpu.pas index 34ec0a5b04..1919f428c6 100644 --- a/compiler/x86_64/cgcpu.pas +++ b/compiler/x86_64/cgcpu.pas @@ -52,12 +52,8 @@ unit cgcpu; procedure Tcgx86_64.init_register_allocators; begin inherited init_register_allocators; - if cs_create_pic in aktmoduleswitches then - rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,[RS_RAX,RS_RDX,RS_RCX,RS_RSI,RS_RDI, - RS_R8,RS_R9,RS_R10,RS_R11,RS_R12,RS_R13,RS_R14,RS_R15],first_int_imreg,[RS_EBP,RS_EBX]) - else - rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,[RS_RAX,RS_RDX,RS_RCX,RS_RBX,RS_RSI,RS_RDI, - RS_R8,RS_R9,RS_R10,RS_R11,RS_R12,RS_R13,RS_R14,RS_R15],first_int_imreg,[RS_EBP]); + rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,[RS_RAX,RS_RDX,RS_RCX,RS_RBX,RS_RSI,RS_RDI, + RS_R8,RS_R9,RS_R10,RS_R11,RS_R12,RS_R13,RS_R14,RS_R15],first_int_imreg,[RS_RBP]); rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBNONE,[RS_XMM0,RS_XMM1,RS_XMM2,RS_XMM3,RS_XMM4,RS_XMM5,RS_XMM6,RS_XMM7, RS_XMM8,RS_XMM9,RS_XMM10,RS_XMM11,RS_XMM12,RS_XMM13,RS_XMM14,RS_XMM15],first_mm_imreg,[]); rgfpu:=Trgx86fpu.create; @@ -144,7 +140,10 @@ begin end. { $Log$ - Revision 1.20 2005-01-24 22:08:33 peter + Revision 1.21 2005-02-06 00:05:56 florian + + x86_64 pic draft + + Revision 1.20 2005/01/24 22:08:33 peter * interface wrapper generation moved to cgobj * generate interface wrappers after the module is parsed diff --git a/compiler/x86_64/r8664ari.inc b/compiler/x86_64/r8664ari.inc index caeb08d778..bdce69ce50 100644 --- a/compiler/x86_64/r8664ari.inc +++ b/compiler/x86_64/r8664ari.inc @@ -9,23 +9,23 @@ 18, 7, 6, -82, 83, 84, 85, -70, +86, +71, 8, 12, 26, 25, 11, -76, 77, 78, 79, 80, 81, -71, +82, +72, 13, 4, 31, @@ -33,12 +33,12 @@ 9, 27, 14, -72, +70, +73, 23, 35, -74, 75, -100, +76, 101, 102, 103, @@ -46,6 +46,7 @@ 105, 106, 107, +108, 45, 46, 48, @@ -84,15 +85,15 @@ 10, 28, 15, +69, 24, 36, 22, 21, 34, 33, -73, -99, -91, +74, +100, 92, 93, 94, @@ -100,20 +101,20 @@ 96, 97, 98, -86, +99, 87, 88, 89, 90, -108, +91, 109, -118, +110, 119, 120, 121, 122, 123, -110, +124, 111, 112, 113, @@ -121,5 +122,5 @@ 115, 116, 117, -69, +118, 0 diff --git a/compiler/x86_64/r8664att.inc b/compiler/x86_64/r8664att.inc index 2c8f67ab4f..f9539b56f8 100644 --- a/compiler/x86_64/r8664att.inc +++ b/compiler/x86_64/r8664att.inc @@ -68,7 +68,8 @@ '%r15b', '%r15w', '%r15d', -'EIP', +'%rip', +'%eip', '%cs', '%ds', '%es', diff --git a/compiler/x86_64/r8664con.inc b/compiler/x86_64/r8664con.inc index 8bd32a6e98..ae6a0d28e3 100644 --- a/compiler/x86_64/r8664con.inc +++ b/compiler/x86_64/r8664con.inc @@ -68,6 +68,7 @@ NR_R15 = tregister($0105000f); NR_R15L = tregister($0101000f); NR_R15W = tregister($0103000f); NR_R15D = tregister($0104000f); +NR_RIP = tregister($05000000); NR_EIP = tregister($05000000); NR_CS = tregister($05000001); NR_DS = tregister($05000002); diff --git a/compiler/x86_64/r8664dwrf.inc b/compiler/x86_64/r8664dwrf.inc index 00f3da190b..27f736cb5c 100644 --- a/compiler/x86_64/r8664dwrf.inc +++ b/compiler/x86_64/r8664dwrf.inc @@ -69,6 +69,7 @@ 15, 15, 16, +16, -1, -1, -1, diff --git a/compiler/x86_64/r8664nor.inc b/compiler/x86_64/r8664nor.inc index 1fda98235b..7b3502fb2e 100644 --- a/compiler/x86_64/r8664nor.inc +++ b/compiler/x86_64/r8664nor.inc @@ -1,2 +1,2 @@ { don't edit, this file is generated from x86reg.dat } -124 +125 diff --git a/compiler/x86_64/r8664num.inc b/compiler/x86_64/r8664num.inc index cfe4519826..01e0b0dfa7 100644 --- a/compiler/x86_64/r8664num.inc +++ b/compiler/x86_64/r8664num.inc @@ -69,6 +69,7 @@ tregister($0101000f), tregister($0103000f), tregister($0104000f), tregister($05000000), +tregister($05000000), tregister($05000001), tregister($05000002), tregister($05000003), diff --git a/compiler/x86_64/r8664op.inc b/compiler/x86_64/r8664op.inc index 78dee4c3a1..61f5df7ba9 100644 --- a/compiler/x86_64/r8664op.inc +++ b/compiler/x86_64/r8664op.inc @@ -69,6 +69,7 @@ 0, 0, 0, +0, 1, 3, 0, diff --git a/compiler/x86_64/r8664ot.inc b/compiler/x86_64/r8664ot.inc index 42306c8da7..7db67465fe 100644 --- a/compiler/x86_64/r8664ot.inc +++ b/compiler/x86_64/r8664ot.inc @@ -69,6 +69,7 @@ OT_REG8, OT_REG16, OT_REG32, OT_NONE, +OT_NONE, OT_REG_CS, OT_REG_DESS, OT_REG_DESS, diff --git a/compiler/x86_64/r8664rni.inc b/compiler/x86_64/r8664rni.inc index b0b0a031d0..3ab0a735ab 100644 --- a/compiler/x86_64/r8664rni.inc +++ b/compiler/x86_64/r8664rni.inc @@ -68,7 +68,6 @@ 57, 61, 65, -91, 92, 93, 94, @@ -101,6 +100,7 @@ 121, 122, 123, +124, 69, 70, 71, @@ -122,4 +122,5 @@ 87, 88, 89, -90 +90, +91 diff --git a/compiler/x86_64/r8664sri.inc b/compiler/x86_64/r8664sri.inc index 7a0eb72fb3..67d9df19f9 100644 --- a/compiler/x86_64/r8664sri.inc +++ b/compiler/x86_64/r8664sri.inc @@ -1,5 +1,4 @@ { don't edit, this file is generated from x86reg.dat } -69, 0, 2, 1, @@ -11,23 +10,23 @@ 18, 7, 6, -82, 83, 84, 85, -70, +86, +71, 8, 12, 26, 25, 11, -76, 77, 78, 79, 80, 81, -71, +82, +72, 13, 4, 31, @@ -35,12 +34,12 @@ 9, 27, 14, -72, +70, +73, 23, 35, -74, 75, -100, +76, 101, 102, 103, @@ -48,6 +47,7 @@ 105, 106, 107, +108, 45, 46, 48, @@ -86,15 +86,15 @@ 10, 28, 15, +69, 24, 36, 22, 21, 34, 33, -73, -99, -91, +74, +100, 92, 93, 94, @@ -102,24 +102,25 @@ 96, 97, 98, -86, +99, 87, 88, 89, 90, -108, +91, 109, -118, +110, 119, 120, 121, 122, 123, -110, +124, 111, 112, 113, 114, 115, 116, -117 +117, +118 diff --git a/compiler/x86_64/r8664stab.inc b/compiler/x86_64/r8664stab.inc index 0c57616281..d487a36364 100644 --- a/compiler/x86_64/r8664stab.inc +++ b/compiler/x86_64/r8664stab.inc @@ -90,6 +90,7 @@ -1, -1, -1, +-1, 12, 13, 14, diff --git a/compiler/x86_64/r8664std.inc b/compiler/x86_64/r8664std.inc index 2e9d97dfba..55ea578074 100644 --- a/compiler/x86_64/r8664std.inc +++ b/compiler/x86_64/r8664std.inc @@ -68,7 +68,8 @@ 'r15b', 'r15w', 'r15d', -'EIP', +'rip', +'eip', 'cs', 'ds', 'es',