浏览代码

+ SPARC: override g_external_wrapper method and emit PIC-safe jump without distance limit. Mantis #25455.

git-svn-id: trunk@26286 -
sergei 11 年之前
父节点
当前提交
890d757573
共有 1 个文件被更改,包括 11 次插入0 次删除
  1. 11 0
      compiler/sparc/cgcpu.pas

+ 11 - 0
compiler/sparc/cgcpu.pas

@@ -92,6 +92,7 @@ interface
         procedure g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : tcgint);override;
         procedure g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : tcgint);override;
         procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
         procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
         procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
         procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
+        procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string);override;
         { Transform unsupported methods into Internal errors }
         { Transform unsupported methods into Internal errors }
         procedure a_bit_scan_reg_reg(list: TAsmList; reverse: boolean; size: TCGSize; src, dst: TRegister); override;
         procedure a_bit_scan_reg_reg(list: TAsmList; reverse: boolean; size: TCGSize; src, dst: TRegister); override;
         procedure g_stackpointer_alloc(list : TAsmList;localsize : longint);override;
         procedure g_stackpointer_alloc(list : TAsmList;localsize : longint);override;
@@ -1577,6 +1578,16 @@ implementation
         List.concat(Tai_symbol_end.Createname(labelname));
         List.concat(Tai_symbol_end.Createname(labelname));
       end;
       end;
 
 
+
+    procedure tcgsparc.g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string);
+      begin
+        { CALL overwrites %o7 with its own address, we use delay slot to restore it. }
+        list.concat(taicpu.op_reg_reg(A_MOV,NR_O7,NR_G1));
+        list.concat(taicpu.op_sym(A_CALL,current_asmdata.RefAsmSymbol(externalname)));
+        list.concat(taicpu.op_reg_reg(A_MOV,NR_G1,NR_O7));
+      end;
+
+
     procedure tcgsparc.g_stackpointer_alloc(list : TAsmList;localsize : longint);
     procedure tcgsparc.g_stackpointer_alloc(list : TAsmList;localsize : longint);
       begin
       begin
         Comment(V_Error,'tcgsparc.g_stackpointer_alloc method not implemented');
         Comment(V_Error,'tcgsparc.g_stackpointer_alloc method not implemented');