Procházet zdrojové kódy

* reference FPC_ABSMASK_SINGLE/-DOUBLE using the indirect symbol if required for dynamic packages

git-svn-id: trunk@43536 -
svenbarth před 5 roky
rodič
revize
f4d96906c2
1 změnil soubory, kde provedl 15 přidání a 3 odebrání
  1. 15 3
      compiler/x86/nx86inl.pas

+ 15 - 3
compiler/x86/nx86inl.pas

@@ -87,7 +87,7 @@ implementation
     uses
       systems,
       globtype,globals,
-      verbose,compinnr,
+      verbose,compinnr,fmodule,
       defutil,
       aasmbase,aasmdata,aasmcpu,
       symconst,symtype,symdef,symcpu,
@@ -557,8 +557,16 @@ implementation
 
 
      procedure tx86inlinenode.second_abs_real;
+
+       function needs_indirect:boolean; inline;
+         begin
+           result:=(tf_supports_packages in target_info.flags) and
+                     (target_info.system in systems_indirect_var_imports);
+         end;
+
        var
          href : treference;
+         sym : tasmsymbol;
        begin
          if use_vectorfpu(resultdef) then
            begin
@@ -575,7 +583,9 @@ implementation
              case tfloatdef(resultdef).floattype of
                s32real:
                  begin
-                   reference_reset_symbol(href,current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_SINGLE',AT_DATA),0,4,[]);
+                   sym:=current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_SINGLE',AT_DATA,needs_indirect);
+                   reference_reset_symbol(href,sym,0,4,[]);
+                   current_module.add_extern_asmsym(sym);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList, href);
                    if UseAVX then
                      current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
@@ -585,7 +595,9 @@ implementation
                  end;
                s64real:
                  begin
-                   reference_reset_symbol(href,current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_DOUBLE',AT_DATA),0,4,[]);
+                   sym:=current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_DOUBLE',AT_DATA,needs_indirect);
+                   reference_reset_symbol(href,sym,0,4,[]);
+                   current_module.add_extern_asmsym(sym);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList, href);
                    if UseAVX then
                      current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(