From 6797685c86a8b14f70dca4b91647cf3ddecce99d Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 18 Apr 2015 19:32:49 +0000 Subject: [PATCH] * write set constants only as large as needed by taking care of resultdef.size, resolves issue #27886 git-svn-id: trunk@30655 - --- compiler/ncgcon.pas | 41 +++-------------------------------------- 1 file changed, 3 insertions(+), 38 deletions(-) diff --git a/compiler/ncgcon.pas b/compiler/ncgcon.pas index 9b5fc1696b..b931803f20 100644 --- a/compiler/ncgcon.pas +++ b/compiler/ncgcon.pas @@ -458,10 +458,10 @@ implementation new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,result.name,const_align(8)); current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lab)); if (source_info.endian=target_info.endian) then - for i:=0 to 31 do + for i:=0 to resultdef.size-1 do current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_8bit(Psetbytes(value_set)^[i])) else - for i:=0 to 31 do + for i:=0 to resultdef.size-1 do current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_8bit(reverse_byte(Psetbytes(value_set)^[i]))); end; @@ -474,7 +474,7 @@ implementation { const already used ? } if not assigned(lab_set) then begin - entry := current_asmdata.ConstPools[sp_varsets].FindOrAdd(value_set, 32); + entry := current_asmdata.ConstPools[sp_varsets].FindOrAdd(value_set, resultdef.size); { :-(, we must generate a new entry } if not assigned(entry^.Data) then @@ -515,41 +515,6 @@ implementation location.value:=location.value shr (32-resultdef.size*8); end; - procedure varsetconst; - var - lastlabel : tasmlabel; - i : longint; - entry : PHashSetItem; - begin - location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(8)); - lastlabel:=nil; - { const already used ? } - if not assigned(lab_set) then - begin - entry := current_asmdata.ConstPools[sp_varsets].FindOrAdd(value_set, 32); - - lab_set := TAsmLabel(entry^.Data); // is it needed anymore? - - { :-(, we must generate a new entry } - if not assigned(entry^.Data) then - begin - current_asmdata.getglobaldatalabel(lastlabel); - lab_set:=lastlabel; - entry^.Data:=lastlabel; - maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]); - new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(8)); - current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel)); - if (source_info.endian=target_info.endian) then - for i:=0 to 31 do - current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_8bit(Psetbytes(value_set)^[i])) - else - for i:=0 to 31 do - current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_8bit(reverse_byte(Psetbytes(value_set)^[i]))); - end; - end; - location.reference.symbol:=lab_set; - end; - begin adjustforsetbase;