diff --git a/compiler/aasmdata.pas b/compiler/aasmdata.pas index 4e6c4a9899..1a3d929e93 100644 --- a/compiler/aasmdata.pas +++ b/compiler/aasmdata.pas @@ -235,6 +235,8 @@ interface of a dead-strippable data block, and references to such labels are also ignored to determine whether a data block should be live) } procedure getlocaldatalabel(out l : TAsmLabel); + { data label visible within the current unit, if it's global or local depends if library based smartlinking is used } + procedure getdatalabel(out l: TAsmLabel); { generate an alternative (duplicate) symbol } procedure GenerateAltSymbol(p:TAsmSymbol); procedure ResetAltSymbols; @@ -731,6 +733,15 @@ implementation end; + procedure TAsmData.getdatalabel(out l : TAsmLabel); + begin + if create_smartlink_library then + getglobaldatalabel(l) + else + getlocaldatalabel(l); + end; + + procedure TAsmData.getaddrlabel(out l : TAsmLabel); begin l:=TAsmLabel.createlocal(AsmSymbolDict,FNextLabelNr[alt_addr],alt_addr); diff --git a/compiler/ncgcon.pas b/compiler/ncgcon.pas index f799259bf4..942511f745 100644 --- a/compiler/ncgcon.pas +++ b/compiler/ncgcon.pas @@ -134,10 +134,7 @@ implementation { :-(, we must generate a new entry } if not(assigned(lab_real)) then begin - if create_smartlink_library then - current_asmdata.getglobaldatalabel(lastlabel) - else - current_asmdata.getlocaldatalabel(lastlabel); + current_asmdata.getdatalabel(lastlabel); entry^.Data:=lastlabel; lab_real:=lastlabel; maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]); @@ -324,7 +321,7 @@ implementation end; cst_shortstring: begin - current_asmdata.getlocaldatalabel(lastlabel.lab); + current_asmdata.getdatalabel(lastlabel.lab); { truncate strings larger than 255 chars } if len>255 then @@ -345,7 +342,7 @@ implementation end; cst_conststring: begin - current_asmdata.getlocaldatalabel(lastlabel.lab); + current_asmdata.getdatalabel(lastlabel.lab); { the data includes the terminating #0 because this string can be used for pchar assignments (but it's @@ -406,7 +403,7 @@ implementation i: longint; tcb: ttai_typedconstbuilder; begin - current_asmdata.getlocaldatalabel(lab); + current_asmdata.getdatalabel(lab); result:=lab; lab_set:=lab; tcb:=ctai_typedconstbuilder.create([tcalo_is_lab,tcalo_make_dead_strippable,tcalo_apply_constalign]); @@ -510,7 +507,7 @@ implementation { :-(, we must generate a new entry } if not assigned(entry^.Data) then begin - current_asmdata.getlocaldatalabel(lastlabel); + current_asmdata.getdatalabel(lastlabel); datatcb:=ctai_typedconstbuilder.create([tcalo_is_lab,tcalo_make_dead_strippable,tcalo_apply_constalign]); datatcb.emit_guid_const(value); current_asmdata.asmlists[al_typedconsts].concatList( diff --git a/compiler/x86/nx86cnv.pas b/compiler/x86/nx86cnv.pas index a7e95ab56a..ff79792bfb 100644 --- a/compiler/x86/nx86cnv.pas +++ b/compiler/x86/nx86cnv.pas @@ -412,7 +412,7 @@ implementation if it is 1 then we add 2**64 as float. Since 2**64 can be represented exactly, use a single-precision constant to save space. } - current_asmdata.getlocaldatalabel(l1); + current_asmdata.getdatalabel(l1); current_asmdata.getjumplabel(l2); if not(signtested) then begin diff --git a/compiler/x86/nx86mat.pas b/compiler/x86/nx86mat.pas index d0869e1f69..6de491f4a7 100644 --- a/compiler/x86/nx86mat.pas +++ b/compiler/x86/nx86mat.pas @@ -187,7 +187,7 @@ interface begin location_reset(location,LOC_MMREGISTER,def_cgsize(resultdef)); - current_asmdata.getlocaldatalabel(l1); + current_asmdata.getdatalabel(l1); new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,l1.name,const_align(16)); current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1)); case def_cgsize(resultdef) of diff --git a/compiler/x86/nx86set.pas b/compiler/x86/nx86set.pas index 2e66bdb53f..6c37eb4891 100644 --- a/compiler/x86/nx86set.pas +++ b/compiler/x86/nx86set.pas @@ -154,7 +154,7 @@ implementation end; end; - current_asmdata.getlocaldatalabel(table); + current_asmdata.getdatalabel(table); { make it a 32bit register } indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_INT); cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_INT,hregister,indexreg); diff --git a/compiler/x86_64/nx64cnv.pas b/compiler/x86_64/nx64cnv.pas index bbf60b1d4e..9ec830977a 100644 --- a/compiler/x86_64/nx64cnv.pas +++ b/compiler/x86_64/nx64cnv.pas @@ -110,7 +110,7 @@ implementation we load bits 0..62 and then check bit 63: if it is 1 then we add $80000000 000000000 as double } - current_asmdata.getlocaldatalabel(l1); + current_asmdata.getdatalabel(l1); current_asmdata.getjumplabel(l2); { Get sign bit }