소스 검색

* replaced "in_make_direct_ref" field with a trefaddr flag

git-svn-id: trunk@34548 -
Jonas Maebe 8 년 전
부모
커밋
27bb656cec
4개의 변경된 파일17개의 추가작업 그리고 17개의 파일을 삭제
  1. 2 1
      compiler/cgbase.pas
  2. 4 4
      compiler/powerpc/agppcvasm.pas
  3. 4 4
      compiler/ppcgen/agppcgas.pas
  4. 7 8
      compiler/x86/cgx86.pas

+ 2 - 1
compiler/cgbase.pas

@@ -69,7 +69,8 @@ interface
          addr_no,
          addr_no,
          addr_full,
          addr_full,
          addr_pic,
          addr_pic,
-         addr_pic_no_got
+         addr_pic_no_got,
+         addr_load_indirect    // only load symbol address via indirect symbol, not actual symbol data
          {$IF defined(POWERPC) or defined(POWERPC64) or defined(SPARC) or defined(MIPS)}
          {$IF defined(POWERPC) or defined(POWERPC64) or defined(SPARC) or defined(MIPS)}
          ,
          ,
          addr_low,         // bits 48-63
          addr_low,         // bits 48-63

+ 4 - 4
compiler/powerpc/agppcvasm.pas

@@ -66,13 +66,13 @@ unit agppcvasm;
 
 
 {$ifdef cpu64bitaddr}
 {$ifdef cpu64bitaddr}
     const
     const
-      refaddr2str: array[trefaddr] of string[9] = ('', '', '', '', '@l', '@h', '@higher', '@highest', '@ha', '@highera', '@highesta');
+      refaddr2str: array[trefaddr] of string[9] = ('', '', '', '', '', '@l', '@h', '@higher', '@highest', '@ha', '@highera', '@highesta');
       verbose_refaddrs = [addr_low, addr_high, addr_higher, addr_highest, addr_higha, addr_highera, addr_highesta];
       verbose_refaddrs = [addr_low, addr_high, addr_higher, addr_highest, addr_higha, addr_highera, addr_highesta];
-      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','lo16', 'hi16', '@err', '@err', 'ha16', '@err', '@err');
+      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','','lo16', 'hi16', '@err', '@err', 'ha16', '@err', '@err');
 {$else cpu64bitaddr}
 {$else cpu64bitaddr}
     const
     const
-      refaddr2str: array[trefaddr] of string[3] = ('','','','','@l','@h','@ha');
-      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','lo16','hi16','ha16');
+      refaddr2str: array[trefaddr] of string[3] = ('','','','','','@l','@h','@ha');
+      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','','lo16','hi16','ha16');
       verbose_refaddrs = [addr_low,addr_high,addr_higha];
       verbose_refaddrs = [addr_low,addr_high,addr_higha];
 {$endif cpu64bitaddr}
 {$endif cpu64bitaddr}
 
 

+ 4 - 4
compiler/ppcgen/agppcgas.pas

@@ -78,13 +78,13 @@ unit agppcgas;
 
 
 {$ifdef cpu64bitaddr}
 {$ifdef cpu64bitaddr}
     const
     const
-      refaddr2str: array[trefaddr] of string[9] = ('', '', '', '', '@l', '@h', '@higher', '@highest', '@ha', '@highera', '@highesta');
+      refaddr2str: array[trefaddr] of string[9] = ('', '', '', '', '', '@l', '@h', '@higher', '@highest', '@ha', '@highera', '@highesta');
       verbose_refaddrs = [addr_low, addr_high, addr_higher, addr_highest, addr_higha, addr_highera, addr_highesta];
       verbose_refaddrs = [addr_low, addr_high, addr_higher, addr_highest, addr_higha, addr_highera, addr_highesta];
-      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','lo16', 'hi16', '@err', '@err', 'ha16', '@err', '@err');
+      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','','lo16', 'hi16', '@err', '@err', 'ha16', '@err', '@err');
 {$else cpu64bitaddr}
 {$else cpu64bitaddr}
     const
     const
-      refaddr2str: array[trefaddr] of string[3] = ('','','','','@l','@h','@ha');
-      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','lo16','hi16','ha16');
+      refaddr2str: array[trefaddr] of string[3] = ('','','','','','@l','@h','@ha');
+      refaddr2str_darwin: array[trefaddr] of string[4] = ('','','','','','lo16','hi16','ha16');
       verbose_refaddrs = [addr_low,addr_high,addr_higha];
       verbose_refaddrs = [addr_low,addr_high,addr_higha];
 {$endif cpu64bitaddr}
 {$endif cpu64bitaddr}
 
 

+ 7 - 8
compiler/x86/cgx86.pas

@@ -132,8 +132,6 @@ unit cgx86;
 
 
         procedure generate_leave(list : TAsmList);
         procedure generate_leave(list : TAsmList);
       protected
       protected
-        in_make_direct_ref : boolean;
-
         procedure a_jmp_cond(list : TAsmList;cond : TOpCmp;l: tasmlabel);
         procedure a_jmp_cond(list : TAsmList;cond : TOpCmp;l: tasmlabel);
         procedure check_register_size(size:tcgsize;reg:tregister);
         procedure check_register_size(size:tcgsize;reg:tregister);
 
 
@@ -428,7 +426,8 @@ unit cgx86;
           exit;
           exit;
 
 
         { handle indirect symbols first }
         { handle indirect symbols first }
-        make_direct_ref(list,ref);
+        if ref.refaddr<>addr_load_indirect then
+            make_direct_ref(list,ref);
 
 
 {$if defined(x86_64)}
 {$if defined(x86_64)}
         { Only 32bit is allowed }
         { Only 32bit is allowed }
@@ -649,13 +648,13 @@ unit cgx86;
         href : treference;
         href : treference;
         hreg : tregister;
         hreg : tregister;
       begin
       begin
-        if in_make_direct_ref then
-          exit;
-        in_make_direct_ref:=true;
         if assigned(ref.symbol) and (ref.symbol.bind in asmsymbindindirect) then
         if assigned(ref.symbol) and (ref.symbol.bind in asmsymbindindirect) then
           begin
           begin
             hreg:=getaddressregister(list);
             hreg:=getaddressregister(list);
             reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
             reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+            { tell make_simple_ref that we are loading the symbol address via an indirect
+              symbol and that hence it should not call make_direct_ref() again }
+            href.refaddr:=addr_load_indirect;
             a_op_ref_reg(list,OP_MOVE,OS_ADDR,href,hreg);
             a_op_ref_reg(list,OP_MOVE,OS_ADDR,href,hreg);
             if ref.base<>NR_NO then
             if ref.base<>NR_NO then
               begin
               begin
@@ -666,7 +665,6 @@ unit cgx86;
             ref.symbol:=nil;
             ref.symbol:=nil;
             ref.base:=hreg;
             ref.base:=hreg;
           end;
           end;
-        in_make_direct_ref:=false;
       end;
       end;
 
 
 
 
@@ -1040,7 +1038,8 @@ unit cgx86;
 
 
         { this could probably done in a more optimized way, but for now this
         { this could probably done in a more optimized way, but for now this
           is sufficent }
           is sufficent }
-        make_direct_ref(list,dirref);
+        if dirref.refaddr<>addr_load_indirect then
+          make_direct_ref(list,dirref);
 
 
         with dirref do
         with dirref do
           begin
           begin