浏览代码

* fixed a_jmp_name() for darwin/i386 (go via a stub)
* fixed g_external_wrapper for darwin/i386 (both with and without pic,
by using a_jmp_name(), because the darwin jump stubs can always
be called directly)

git-svn-id: trunk@8669 -

Jonas Maebe 18 年之前
父节点
当前提交
c84744b27f
共有 1 个文件被更改,包括 18 次插入8 次删除
  1. 18 8
      compiler/x86/cgx86.pas

+ 18 - 8
compiler/x86/cgx86.pas

@@ -567,8 +567,17 @@ unit cgx86;
 ****************************************************************************}
 ****************************************************************************}
 
 
     procedure tcgx86.a_jmp_name(list : TAsmList;const s : string);
     procedure tcgx86.a_jmp_name(list : TAsmList;const s : string);
+      var
+        r: treference;
       begin
       begin
-        list.concat(taicpu.op_sym(A_JMP,S_NO,current_asmdata.RefAsmSymbol(s)));
+        if (target_info.system<>system_i386_darwin) then
+          list.concat(taicpu.op_sym(A_JMP,S_NO,current_asmdata.RefAsmSymbol(s)))
+        else
+          begin 
+            reference_reset_symbol(r,get_darwin_call_stub(s),0);
+            r.refaddr:=addr_full;
+            list.concat(taicpu.op_ref(A_JMP,S_NO,r));
+          end;
       end;
       end;
 
 
 
 
@@ -2038,6 +2047,13 @@ unit cgx86;
         ref : treference;
         ref : treference;
         sym : tasmsymbol;
         sym : tasmsymbol;
       begin
       begin
+       if (target_info.system=system_i386_darwin) then
+         begin
+           { a_jmp_name jumps to a stub which is always pic-safe on darwin }
+           inherited g_external_wrapper(list,procdef,externalname);
+           exit;
+         end;
+
         sym:=current_asmdata.RefAsmSymbol(externalname);
         sym:=current_asmdata.RefAsmSymbol(externalname);
         reference_reset_symbol(ref,sym,0);
         reference_reset_symbol(ref,sym,0);
 
 
@@ -2048,13 +2064,7 @@ unit cgx86;
               got loaded
               got loaded
             }
             }
             g_maybe_got_init(list);
             g_maybe_got_init(list);
-            if (target_info.system<>system_i386_darwin) then
-              ref.refaddr:=addr_pic
-            else
-              begin
-                ref.refaddr:=addr_no;
-                ref.relsymbol:=current_procinfo.CurrGOTLabel;
-              end
+            ref.refaddr:=addr_pic
           end
           end
         else
         else
           ref.refaddr:=addr_full;
           ref.refaddr:=addr_full;