summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2016-11-27 18:17:37 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2016-11-27 18:17:37 +0000
commitc18f3da68f01c737b722ec5d19a052b4a74e9308 (patch)
treef79d285de82063856b11673f7f8e749ed425a696
parentc24c856965f801d3d8e72361ffa1bc944127144d (diff)
downloadfpc-c18f3da68f01c737b722ec5d19a052b4a74e9308.tar.gz
+ added volatility information to all memory references
o separate information for reading and writing, because e.g. in a try-block, only the writes to local variables and parameters are volatile (they have to be committed immediately in case the next instruction causes an exception) o for now, only references to absolute memory addresses are marked as volatile o the volatily information is (should be) properly maintained throughout all code generators for all archictures with this patch o no optimizers or other compiler infrastructure uses the volatility information yet o this functionality is not (yet) exposed at the language level, it is only for internal code generator use right now git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@34996 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--compiler/aarch64/cgcpu.pas26
-rw-r--r--compiler/aarch64/hlcgcpu.pas4
-rw-r--r--compiler/aarch64/ncpumem.pas2
-rw-r--r--compiler/aarch64/ncpuset.pas4
-rw-r--r--compiler/aarch64/rgcpu.pas2
-rw-r--r--compiler/aasmsym.pas2
-rw-r--r--compiler/aasmtai.pas2
-rw-r--r--compiler/arm/cgcpu.pas80
-rw-r--r--compiler/arm/hlcgcpu.pas14
-rw-r--r--compiler/arm/narmcal.pas8
-rw-r--r--compiler/arm/narmcnv.pas2
-rw-r--r--compiler/arm/narmcon.pas2
-rw-r--r--compiler/arm/narminl.pas2
-rw-r--r--compiler/arm/narmset.pas8
-rw-r--r--compiler/arm/raarmgas.pas2
-rw-r--r--compiler/arm/rgcpu.pas16
-rw-r--r--compiler/avr/cgcpu.pas14
-rw-r--r--compiler/avr/raavrgas.pas2
-rw-r--r--compiler/avr/rgcpu.pas4
-rw-r--r--compiler/cgobj.pas22
-rw-r--r--compiler/cgutils.pas35
-rw-r--r--compiler/hlcg2ll.pas8
-rw-r--r--compiler/hlcgobj.pas50
-rw-r--r--compiler/i386/aoptcpu.pas10
-rw-r--r--compiler/i386/cgcpu.pas6
-rw-r--r--compiler/i386/hlcgcpu.pas20
-rw-r--r--compiler/i386/n386add.pas2
-rw-r--r--compiler/i386/n386cal.pas6
-rw-r--r--compiler/i386/n386flw.pas4
-rw-r--r--compiler/i8086/cgcpu.pas14
-rw-r--r--compiler/i8086/hlcgcpu.pas36
-rw-r--r--compiler/i8086/n8086add.pas2
-rw-r--r--compiler/i8086/n8086inl.pas2
-rw-r--r--compiler/i8086/n8086ld.pas22
-rw-r--r--compiler/i8086/n8086mem.pas4
-rw-r--r--compiler/jvm/hlcgcpu.pas18
-rw-r--r--compiler/jvm/njvmcal.pas2
-rw-r--r--compiler/jvm/njvmcnv.pas6
-rw-r--r--compiler/jvm/njvmflw.pas4
-rw-r--r--compiler/jvm/njvmld.pas4
-rw-r--r--compiler/jvm/njvmmem.pas8
-rw-r--r--compiler/llvm/hlcgllvm.pas36
-rw-r--r--compiler/llvm/nllvmcnv.pas8
-rw-r--r--compiler/llvm/nllvmcon.pas4
-rw-r--r--compiler/llvm/nllvminl.pas8
-rw-r--r--compiler/llvm/nllvmld.pas2
-rw-r--r--compiler/llvm/nllvmmem.pas8
-rw-r--r--compiler/llvm/tgllvm.pas2
-rw-r--r--compiler/m68k/aoptcpu.pas4
-rw-r--r--compiler/m68k/cgcpu.pas42
-rw-r--r--compiler/m68k/hlcgcpu.pas8
-rw-r--r--compiler/m68k/n68kcal.pas4
-rw-r--r--compiler/m68k/n68kmem.pas2
-rw-r--r--compiler/m68k/rgcpu.pas4
-rw-r--r--compiler/mips/cgcpu.pas22
-rw-r--r--compiler/mips/hlcgcpu.pas10
-rw-r--r--compiler/mips/ncpucnv.pas2
-rw-r--r--compiler/mips/ncpuset.pas2
-rw-r--r--compiler/mips/rgcpu.pas4
-rw-r--r--compiler/ncgbas.pas10
-rw-r--r--compiler/ncgcal.pas8
-rw-r--r--compiler/ncgcnv.pas19
-rw-r--r--compiler/ncgcon.pas10
-rw-r--r--compiler/ncgflw.pas4
-rw-r--r--compiler/ncginl.pas10
-rw-r--r--compiler/ncgld.pas48
-rw-r--r--compiler/ncgmem.pas36
-rw-r--r--compiler/ncgobjc.pas2
-rw-r--r--compiler/ncgopt.pas2
-rw-r--r--compiler/ncgutil.pas4
-rw-r--r--compiler/powerpc/cgcpu.pas58
-rw-r--r--compiler/powerpc/nppccal.pas10
-rw-r--r--compiler/powerpc64/cgcpu.pas38
-rw-r--r--compiler/powerpc64/nppccnv.pas2
-rw-r--r--compiler/ppcgen/cgppc.pas30
-rw-r--r--compiler/ppcgen/hlcgppc.pas16
-rw-r--r--compiler/ppcgen/ngppcinl.pas2
-rw-r--r--compiler/ppcgen/ngppcset.pas4
-rw-r--r--compiler/ppcgen/rgcpu.pas4
-rw-r--r--compiler/procinfo.pas2
-rw-r--r--compiler/sparc/cgcpu.pas22
-rw-r--r--compiler/sparc/hlcgcpu.pas4
-rw-r--r--compiler/sparc/ncpucnv.pas2
-rw-r--r--compiler/sparc/ncpuset.pas4
-rw-r--r--compiler/sparc/rgcpu.pas8
-rw-r--r--compiler/systems/t_win.pas8
-rw-r--r--compiler/tgobj.pas2
-rw-r--r--compiler/x86/aasmcpu.pas2
-rw-r--r--compiler/x86/cgx86.pas68
-rw-r--r--compiler/x86/hlcgx86.pas2
-rw-r--r--compiler/x86/nx86add.pas2
-rw-r--r--compiler/x86/nx86cnv.pas2
-rw-r--r--compiler/x86/nx86inl.pas12
-rw-r--r--compiler/x86/nx86ld.pas4
-rw-r--r--compiler/x86/nx86mat.pas2
-rw-r--r--compiler/x86/nx86mem.pas2
-rw-r--r--compiler/x86/nx86set.pas2
-rw-r--r--compiler/x86_64/cgcpu.pas8
-rw-r--r--compiler/x86_64/hlcgcpu.pas8
-rw-r--r--compiler/x86_64/nx64add.pas2
-rw-r--r--compiler/x86_64/nx64cal.pas4
-rw-r--r--compiler/x86_64/nx64cnv.pas2
-rw-r--r--compiler/x86_64/nx64set.pas6
103 files changed, 586 insertions, 564 deletions
diff --git a/compiler/aarch64/cgcpu.pas b/compiler/aarch64/cgcpu.pas
index 0d78e96326..e0c9d724c8 100644
--- a/compiler/aarch64/cgcpu.pas
+++ b/compiler/aarch64/cgcpu.pas
@@ -175,7 +175,7 @@ implementation
(ref.index=preferred_newbasereg) then
preferred_newbasereg:=getaddressregister(list);
{ load the (GOT) page }
- reference_reset_symbol(href,ref.symbol,0,8);
+ reference_reset_symbol(href,ref.symbol,0,8,[]);
if ((ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) and
(ref.symbol.bind in [AB_LOCAL,AB_GLOBAL])) or
((ref.symbol.typ=AT_DATA) and
@@ -185,7 +185,7 @@ implementation
href.refaddr:=addr_gotpage;
list.concat(taicpu.op_reg_ref(A_ADRP,preferred_newbasereg,href));
{ load the GOT entry (= address of the variable) }
- reference_reset_base(href,preferred_newbasereg,0,sizeof(pint));
+ reference_reset_base(href,preferred_newbasereg,0,sizeof(pint),[]);
href.symbol:=ref.symbol;
{ code symbols defined in the current compilation unit do not
have to be accessed via the GOT }
@@ -245,7 +245,7 @@ implementation
so.shiftmode:=ref.shiftmode;
so.shiftimm:=ref.shiftimm;
list.concat(taicpu.op_reg_reg_reg_shifterop(A_ADD,preferred_newbasereg,ref.base,ref.index,so));
- reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.alignment);
+ reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.alignment,ref.volatility);
{ possibly still an invalid offset -> fall through }
end
else if ref.offset<>0 then
@@ -291,7 +291,7 @@ implementation
end
else
a_op_reg_reg_reg(list,OP_ADD,OS_ADDR,ref.index,ref.base,preferred_newbasereg);
- reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.alignment);
+ reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.alignment,ref.volatility);
{ fall through to the handling of base + offset, since the
offset may still be too big }
end;
@@ -379,7 +379,7 @@ implementation
a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,ref.base,preferred_newbasereg);
ref.offset:=0;
end;
- reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.alignment);
+ reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.alignment,ref.volatility);
end;
end
else
@@ -407,7 +407,7 @@ implementation
preferred_newbasereg:=getaddressregister(list);
end;
a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,ref.base,preferred_newbasereg);
- reference_reset_base(ref,preferred_newbasereg,0,ref.alignment);
+ reference_reset_base(ref,preferred_newbasereg,0,ref.alignment,ref.volatility);
end
end;
A_LDUR,A_STUR:
@@ -429,7 +429,7 @@ implementation
if preferred_newbasereg=NR_NO then
preferred_newbasereg:=getaddressregister(list);
a_load_const_reg(list,OS_ADDR,ref.offset,preferred_newbasereg);
- reference_reset_base(ref,preferred_newbasereg,0,newalignment(8,ref.offset));
+ reference_reset_base(ref,preferred_newbasereg,0,newalignment(8,ref.offset),ref.volatility);
end;
@@ -1522,7 +1522,7 @@ implementation
pairreg: tregister;
begin
result:=0;
- reference_reset_base(ref,NR_SP,-16,16);
+ reference_reset_base(ref,NR_SP,-16,16,[]);
ref.addressmode:=AM_PREINDEXED;
pairreg:=NR_NO;
{ store all used registers pairwise }
@@ -1570,7 +1570,7 @@ implementation
localsize:=align(localsize,16);
{ save stack pointer and return address }
- reference_reset_base(ref,NR_SP,-16,16);
+ reference_reset_base(ref,NR_SP,-16,16,[]);
ref.addressmode:=AM_PREINDEXED;
list.concat(taicpu.op_reg_reg_ref(A_STP,NR_FP,NR_LR,ref));
{ initialise frame pointer }
@@ -1646,7 +1646,7 @@ implementation
pairreg: tregister;
regcount: longint;
begin
- reference_reset_base(ref,NR_SP,16,16);
+ reference_reset_base(ref,NR_SP,16,16,[]);
ref.addressmode:=AM_POSTINDEXED;
{ highest reg stored twice? }
regcount:=0;
@@ -1717,7 +1717,7 @@ implementation
a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_FP,NR_SP);
{ restore framepointer and return address }
- reference_reset_base(ref,NR_SP,16,16);
+ reference_reset_base(ref,NR_SP,16,16,[]);
ref.addressmode:=AM_POSTINDEXED;
list.concat(taicpu.op_reg_reg_ref(A_LDP,NR_FP,NR_LR,ref));
end;
@@ -1918,12 +1918,12 @@ implementation
basereplaced:=true;
if forcepostindexing then
begin
- reference_reset_base(ref,tmpreg,scaledoffset,ref.alignment);
+ reference_reset_base(ref,tmpreg,scaledoffset,ref.alignment,ref.volatility);
ref.addressmode:=AM_POSTINDEXED;
end
else
begin
- reference_reset_base(ref,tmpreg,0,ref.alignment);
+ reference_reset_base(ref,tmpreg,0,ref.alignment,ref.volatility);
ref.addressmode:=AM_OFFSET;
end
end;
diff --git a/compiler/aarch64/hlcgcpu.pas b/compiler/aarch64/hlcgcpu.pas
index 562de5c7a5..27297d78a6 100644
--- a/compiler/aarch64/hlcgcpu.pas
+++ b/compiler/aarch64/hlcgcpu.pas
@@ -185,11 +185,11 @@ implementation
if (procdef.extnumber=$ffff) then
Internalerror(200006139);
{ mov 0(%rdi),%rax ; load vmt}
- reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(pint));
+ reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(pint),[]);
getcpuregister(list,NR_IP0);
a_load_ref_reg(list,voidpointertype,voidpointertype,href,NR_IP0);
{ jmp *vmtoffs(%eax) ; method offs }
- reference_reset_base(href,voidpointertype,NR_IP0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_IP0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint),[]);
op:=A_LDR;
tcgaarch64(cg).make_simple_ref(list,op,OS_ADDR,PF_None,href,NR_IP0);
list.concat(taicpu.op_reg_ref(op,NR_IP0,href));
diff --git a/compiler/aarch64/ncpumem.pas b/compiler/aarch64/ncpumem.pas
index 99e6f4cf4c..c5584bc8e4 100644
--- a/compiler/aarch64/ncpumem.pas
+++ b/compiler/aarch64/ncpumem.pas
@@ -113,7 +113,7 @@ implementation
location.reference.offset:=0;
base:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,base);
- reference_reset_base(location.reference,base,oldoffset,location.reference.alignment);
+ reference_reset_base(location.reference,base,oldoffset,location.reference.alignment,location.reference.volatility);
end;
shift:=BsfDWord(l);
location.reference.index:=maybe_const_reg;
diff --git a/compiler/aarch64/ncpuset.pas b/compiler/aarch64/ncpuset.pas
index f689d1cf8d..d03145d73e 100644
--- a/compiler/aarch64/ncpuset.pas
+++ b/compiler/aarch64/ncpuset.pas
@@ -124,11 +124,11 @@ implementation
indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_ADDR);
cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_ADDR,hregister,indexreg);
{ load table address }
- reference_reset_symbol(href,tablelabel,0,4);
+ reference_reset_symbol(href,tablelabel,0,4,[]);
basereg:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,basereg);
{ load table slot, 32-bit sign extended }
- reference_reset_base(href,basereg,0,4);
+ reference_reset_base(href,basereg,0,4,[]);
href.index:=indexreg;
href.shiftmode:=SM_LSL;
href.shiftimm:=2;
diff --git a/compiler/aarch64/rgcpu.pas b/compiler/aarch64/rgcpu.pas
index 74e954eb89..87f3cedf30 100644
--- a/compiler/aarch64/rgcpu.pas
+++ b/compiler/aarch64/rgcpu.pas
@@ -83,7 +83,7 @@ implementation
hreg:=cg.getaddressregister(helplist);
cg.a_load_const_reg(helplist,OS_ADDR,spilltemp.offset,hreg);
- reference_reset_base(tmpref,spilltemp.base,0,sizeof(pint));
+ reference_reset_base(tmpref,spilltemp.base,0,sizeof(pint),[]);
tmpref.index:=hreg;
if isload then
helpins:=spilling_create_load(tmpref,tempreg)
diff --git a/compiler/aasmsym.pas b/compiler/aasmsym.pas
index f9287ce1f8..eafc943832 100644
--- a/compiler/aasmsym.pas
+++ b/compiler/aasmsym.pas
@@ -68,4 +68,4 @@ implementation
end;
end;
-end. \ No newline at end of file
+end.
diff --git a/compiler/aasmtai.pas b/compiler/aasmtai.pas
index c4fb17af95..c3e3b378cd 100644
--- a/compiler/aasmtai.pas
+++ b/compiler/aasmtai.pas
@@ -2569,7 +2569,7 @@ implementation
var
r : treference;
begin
- reference_reset_symbol(r,s,sofs,1);
+ reference_reset_symbol(r,s,sofs,1,[]);
r.refaddr:=addr_full;
loadref(opidx,r);
end;
diff --git a/compiler/arm/cgcpu.pas b/compiler/arm/cgcpu.pas
index 10e7cda619..94ac3b5efe 100644
--- a/compiler/arm/cgcpu.pas
+++ b/compiler/arm/cgcpu.pas
@@ -338,7 +338,7 @@ unit cgcpu;
end
else
begin
- reference_reset(hr,4);
+ reference_reset(hr,4,[]);
current_asmdata.getjumplabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -405,7 +405,7 @@ unit cgcpu;
begin
tmpreg2:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+ reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment,ref.volatility);
end
else
usedtmpref:=ref;
@@ -437,7 +437,7 @@ unit cgcpu;
begin
tmpreg2:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+ reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment,ref.volatility);
end
else
usedtmpref:=ref;
@@ -526,7 +526,7 @@ unit cgcpu;
begin
{ offset in the wrapper needs to be adjusted for the stored
return address }
- reference_reset_base(href,reference.index,reference.offset+sizeof(aint),sizeof(pint));
+ reference_reset_base(href,reference.index,reference.offset+sizeof(aint),sizeof(pint),[]);
if is_shifter_const(ioffset,shift) then
a_op_const_ref(list,OP_SUB,size,ioffset,href)
else
@@ -554,7 +554,7 @@ unit cgcpu;
a_load_const_reg(list,size,a,paraloc.location^.register);
LOC_REFERENCE:
begin
- reference_reset(ref,paraloc.alignment);
+ reference_reset(ref,paraloc.alignment,[]);
ref.base:=paraloc.location^.reference.index;
ref.offset:=paraloc.location^.reference.offset;
a_load_const_ref(list,size,a,ref);
@@ -582,7 +582,7 @@ unit cgcpu;
a_load_ref_reg(list,location^.size,location^.size,tmpref,location^.register);
LOC_REFERENCE:
begin
- reference_reset_base(ref,location^.reference.index,location^.reference.offset,paraloc.alignment);
+ reference_reset_base(ref,location^.reference.index,location^.reference.offset,paraloc.alignment,[]);
{ doubles in softemu mode have a strange order of registers and references }
if location^.size=OS_32 then
g_concatcopy(list,tmpref,ref,4)
@@ -626,7 +626,7 @@ unit cgcpu;
a_loadaddr_ref_reg(list,r,paraloc.location^.register);
LOC_REFERENCE:
begin
- reference_reset(ref,paraloc.alignment);
+ reference_reset(ref,paraloc.alignment,[]);
ref.base := paraloc.location^.reference.index;
ref.offset := paraloc.location^.reference.offset;
tmpreg := getintregister(list,OS_ADDR);
@@ -658,7 +658,7 @@ unit cgcpu;
sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
else
sym:=current_asmdata.WeakRefAsmSymbol(s,AT_FUNCTION);
- reference_reset_symbol(r,sym,0,sizeof(pint));
+ reference_reset_symbol(r,sym,0,sizeof(pint),[]);
if (tf_pic_uses_got in target_info.flags) and
(cs_create_pic in current_settings.moduleswitches) then
@@ -1689,7 +1689,7 @@ unit cgcpu;
end;
LOC_REFERENCE :
begin
- reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,paraloc.alignment);
+ reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,paraloc.alignment,[]);
{ concatcopy should choose the best way to copy the data }
g_concatcopy(list,href,href2,tcgsize2size[hloc^.size]);
end;
@@ -1935,7 +1935,7 @@ unit cgcpu;
if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
a_reg_alloc(list,NR_FRAME_POINTER_REG);
{ save int registers }
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED;
regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
@@ -2070,7 +2070,7 @@ unit cgcpu;
if (mmregs<>[]) or
(firstfloatreg<>RS_NO) then
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
if (tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023) or
(current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16]) then
begin
@@ -2177,7 +2177,7 @@ unit cgcpu;
if (firstfloatreg<>RS_NO) or
(mmregs<>[]) then
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
if (tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023) or
(current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16]) then
begin
@@ -2250,7 +2250,7 @@ unit cgcpu;
saveregs:=regs*[RS_R8,RS_R10,RS_R11];
if saveregs<>[] then
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED;
for r:=RS_R8 to RS_R11 do
@@ -2318,7 +2318,7 @@ unit cgcpu;
end
else
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED;
list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_FD));
@@ -2327,7 +2327,7 @@ unit cgcpu;
else
begin
{ restore int registers and return }
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_FRAME_POINTER_REG;
list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_EA));
end;
@@ -2362,7 +2362,7 @@ unit cgcpu;
Otherwise the init code can be distorted in later stages of code generation. }
a_reg_alloc(list,NR_R12);
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
current_asmdata.getglobaldatalabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
ref.symbol:=l;
@@ -2460,7 +2460,7 @@ unit cgcpu;
if the symbol is absolute or relative there.
}
{ create consts entry }
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
tmpref.symboldata:=current_procinfo.aktlocaldata.last;
@@ -2518,7 +2518,7 @@ unit cgcpu;
(tf_pic_uses_got in target_info.flags) and
assigned(ref.symbol) then
begin
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
tmpref.base:=current_procinfo.got;
tmpref.index:=tmpreg;
list.concat(taicpu.op_reg_ref(A_LDR,tmpreg,tmpref));
@@ -2802,7 +2802,7 @@ unit cgcpu;
else
begin
a_loadaddr_ref_reg(list,source,srcreg);
- reference_reset_base(srcref,srcreg,0,source.alignment);
+ reference_reset_base(srcref,srcreg,0,source.alignment,source.volatility);
end;
while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
@@ -2816,7 +2816,7 @@ unit cgcpu;
destreg:=getintregister(list,OS_ADDR);
a_loadaddr_ref_reg(list,dest,destreg);
- reference_reset_base(dstref,destreg,0,dest.alignment);
+ reference_reset_base(dstref,destreg,0,dest.alignment,dest.volatility);
tmpregi2:=1;
while (tmpregi2<=tmpregi) do
begin
@@ -2884,11 +2884,11 @@ unit cgcpu;
begin{unaligned & 4<len<helpsize **or** aligned/unaligned & len>helpsize}
destreg:=getintregister(list,OS_ADDR);
a_loadaddr_ref_reg(list,dest,destreg);
- reference_reset_base(dstref,destreg,0,dest.alignment);
+ reference_reset_base(dstref,destreg,0,dest.alignment,dest.volatility);
srcreg:=getintregister(list,OS_ADDR);
a_loadaddr_ref_reg(list,source,srcreg);
- reference_reset_base(srcref,srcreg,0,source.alignment);
+ reference_reset_base(srcref,srcreg,0,source.alignment,source.volatility);
countreg:=getintregister(list,OS_32);
@@ -3583,7 +3583,7 @@ unit cgcpu;
if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
a_reg_alloc(list,NR_FRAME_POINTER_REG);
{ save int registers }
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED;
regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
@@ -3794,7 +3794,7 @@ unit cgcpu;
begin
tmpreg2:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+ reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment,ref.volatility);
end
else
usedtmpref:=ref;
@@ -3827,7 +3827,7 @@ unit cgcpu;
begin
tmpreg2:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+ reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment,ref.volatility);
end
else
usedtmpref:=ref;
@@ -3884,7 +3884,7 @@ unit cgcpu;
list.concat(taicpu.op_reg_const(A_MOV,reg,a))
else
begin
- reference_reset(hr,4);
+ reference_reset(hr,4,[]);
current_asmdata.getjumplabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -3924,7 +3924,7 @@ unit cgcpu;
else
begin
list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R4]));
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -3941,13 +3941,13 @@ unit cgcpu;
begin
{ offset in the wrapper needs to be adjusted for the stored
return address }
- reference_reset_base(href,reference.index,reference.offset+sizeof(aint),sizeof(pint));
+ reference_reset_base(href,reference.index,reference.offset+sizeof(aint),sizeof(pint),[]);
if is_thumb_imm(ioffset) then
a_op_const_ref(list,OP_SUB,size,ioffset,href)
else
begin
list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R4]));
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -4008,7 +4008,7 @@ unit cgcpu;
tmpreg:=getintregister(list,OS_ADDR);
a_loadaddr_ref_reg(list,ref,tmpreg);
- reference_reset_base(href,tmpreg,0,ref.alignment);
+ reference_reset_base(href,tmpreg,0,ref.alignment,ref.volatility);
end
else if (op=A_LDR) and
(oppostfix in [PF_None]) and
@@ -4018,7 +4018,7 @@ unit cgcpu;
tmpreg:=getintregister(list,OS_ADDR);
a_loadaddr_ref_reg(list,ref,tmpreg);
- reference_reset_base(href,tmpreg,0,ref.alignment);
+ reference_reset_base(href,tmpreg,0,ref.alignment,ref.volatility);
end
else if (op=A_LDR) and
((oppostfix in [PF_SH,PF_SB]) or
@@ -4027,7 +4027,7 @@ unit cgcpu;
tmpreg:=getintregister(list,OS_ADDR);
a_loadaddr_ref_reg(list,ref,tmpreg);
- reference_reset_base(href,tmpreg,0,ref.alignment);
+ reference_reset_base(href,tmpreg,0,ref.alignment,ref.volatility);
end;
Result:=inherited handle_load_store(list, op, oppostfix, reg, href);
@@ -4285,7 +4285,7 @@ unit cgcpu;
list.concat(taicpu.op_reg_const(A_MOVW,reg,a))
else
begin
- reference_reset(hr,4);
+ reference_reset(hr,4,[]);
current_asmdata.getjumplabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -4345,7 +4345,7 @@ unit cgcpu;
begin
tmpreg2:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+ reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment,ref.volatility);
end
else
usedtmpref:=ref;
@@ -4377,7 +4377,7 @@ unit cgcpu;
begin
tmpreg2:=getintregister(list,OS_INT);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
+ reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment,ref.volatility);
end
else
usedtmpref:=ref;
@@ -4799,7 +4799,7 @@ unit cgcpu;
list.concat(taicpu.op_reg_reg(A_MOV,NR_R12,NR_STACK_POINTER_REG));
end;
{ save int registers }
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED;
@@ -4850,7 +4850,7 @@ unit cgcpu;
if firstfloatreg<>RS_NO then
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
begin
a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
@@ -4900,7 +4900,7 @@ unit cgcpu;
if firstfloatreg<>RS_NO then
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
begin
a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
@@ -4956,7 +4956,7 @@ unit cgcpu;
list.concat(taicpu.op_reg_reg(A_MOV,NR_R15,NR_R14))
else
begin
- reference_reset(ref,4);
+ reference_reset(ref,4,[]);
ref.index:=NR_STACK_POINTER_REG;
ref.addressmode:=AM_PREINDEXED;
list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_FD));
@@ -5018,7 +5018,7 @@ unit cgcpu;
)
) then
begin
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
{ load symbol }
tmpreg:=getintregister(list,OS_INT);
diff --git a/compiler/arm/hlcgcpu.pas b/compiler/arm/hlcgcpu.pas
index a88215968a..36647cbd24 100644
--- a/compiler/arm/hlcgcpu.pas
+++ b/compiler/arm/hlcgcpu.pas
@@ -66,7 +66,7 @@ implementation
href : treference;
l : TAsmLabel;
begin
- reference_reset_base(href,voidpointertype,NR_R0,0,sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_R0,0,sizeof(pint),[]);
if GenerateThumbCode then
begin
if (href.offset in [0..124]) and ((href.offset mod 4)=0) then
@@ -80,7 +80,7 @@ implementation
begin
list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0,RS_R1]));
{ create consts entry }
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -111,7 +111,7 @@ implementation
Internalerror(200006139);
if GenerateThumbCode then
begin
- reference_reset_base(href,voidpointertype,NR_R0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_R0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint),[]);
if (href.offset in [0..124]) and ((href.offset mod 4)=0) then
begin
list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0]));
@@ -124,7 +124,7 @@ implementation
begin
list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0,RS_R1]));
{ create consts entry }
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -144,7 +144,7 @@ implementation
end
else
begin
- reference_reset_base(href,voidpointertype,NR_R12,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_R12,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint),[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
end;
if not(CPUARM_HAS_BX in cpu_capabilities[current_settings.cputype]) then
@@ -203,7 +203,7 @@ implementation
list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0]));
{ create consts entry }
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -239,7 +239,7 @@ implementation
and which allows to switch the instruction set }
{ create const entry }
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
current_asmdata.getjumplabel(l);
tmpref.symbol:=l;
tmpref.base:=NR_PC;
diff --git a/compiler/arm/narmcal.pas b/compiler/arm/narmcal.pas
index 42aaab58fc..87f0c06b74 100644
--- a/compiler/arm/narmcal.pas
+++ b/compiler/arm/narmcal.pas
@@ -74,12 +74,12 @@ implementation
case libparaloc^.loc of
LOC_REGISTER:
- reference_reset_base(tmpref,libparaloc^.register,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,libparaloc^.register,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
LOC_REFERENCE:
begin
- reference_reset_base(tmpref,libparaloc^.reference.index,libparaloc^.reference.offset,sizeof(pint));
+ reference_reset_base(tmpref,libparaloc^.reference.index,libparaloc^.reference.offset,sizeof(pint),[]);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_R12);
- reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
end;
else
internalerror(2016110603);
@@ -124,7 +124,7 @@ implementation
(location.loc=LOC_REGISTER) and
(current_settings.fputype in [fpu_fpa,fpu_fpa10,fpu_fpa11]) then
begin
- location_reset_ref(location,LOC_REFERENCE,location.size,resultdef.alignment);
+ location_reset_ref(location,LOC_REFERENCE,location.size,resultdef.alignment,[]);
tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,location.reference);
end
else
diff --git a/compiler/arm/narmcnv.pas b/compiler/arm/narmcnv.pas
index d685785dd5..177c0edea3 100644
--- a/compiler/arm/narmcnv.pas
+++ b/compiler/arm/narmcnv.pas
@@ -209,7 +209,7 @@ implementation
current_asmdata.getglobaldatalabel(l1);
current_asmdata.getjumplabel(l2);
- reference_reset_symbol(href,l1,0,const_align(8));
+ reference_reset_symbol(href,l1,0,const_align(8),[]);
cg.a_reg_alloc(current_asmdata.CurrAsmList,NR_DEFAULTFLAGS);
current_asmdata.CurrAsmList.concat(Taicpu.op_reg_const(A_CMP,left.location.register,0));
diff --git a/compiler/arm/narmcon.pas b/compiler/arm/narmcon.pas
index 94abed8f42..667836aee5 100644
--- a/compiler/arm/narmcon.pas
+++ b/compiler/arm/narmcon.pas
@@ -61,7 +61,7 @@ interface
hiloswapped : boolean;
begin
- location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),4);
+ location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),4,[]);
lastlabel:=nil;
realait:=floattype2ait[tfloatdef(resultdef).floattype];
hiloswapped:=is_double_hilo_swapped;
diff --git a/compiler/arm/narminl.pas b/compiler/arm/narminl.pas
index a251556fed..50d710dd3c 100644
--- a/compiler/arm/narminl.pas
+++ b/compiler/arm/narminl.pas
@@ -397,7 +397,7 @@ implementation
begin
r:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,r);
- reference_reset_base(ref,r,0,left.location.reference.alignment);
+ reference_reset_base(ref,r,0,left.location.reference.alignment,location.reference.volatility);
{ since the address might be nil we can't use ldr for older cpus }
current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_PLD,ref));
end;
diff --git a/compiler/arm/narmset.pas b/compiler/arm/narmset.pas
index ca6fc8245a..3ac195566e 100644
--- a/compiler/arm/narmset.pas
+++ b/compiler/arm/narmset.pas
@@ -216,7 +216,7 @@ implementation
{ adjust index }
cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_,indexreg,indexreg);
{ create reference and generate jump table }
- reference_reset(href,4);
+ reference_reset(href,4,[]);
href.base:=NR_PC;
href.index:=indexreg;
href.shiftmode:=SM_LSL;
@@ -238,10 +238,10 @@ implementation
cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,indexreg);
basereg:=cg.getintregister(current_asmdata.CurrAsmList, OS_ADDR);
- reference_reset_symbol(href,tablelabel,0,4);
+ reference_reset_symbol(href,tablelabel,0,4,[]);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList, href, basereg);
- reference_reset(href,0);
+ reference_reset(href,0,[]);
href.base:=basereg;
href.index:=indexreg;
@@ -264,7 +264,7 @@ implementation
min_+ord(not(cs_create_pic in current_settings.moduleswitches)),
indexreg,indexreg);
{ create reference and generate jump table }
- reference_reset(href,4);
+ reference_reset(href,4,[]);
href.base:=NR_PC;
href.index:=indexreg;
href.shiftmode:=SM_LSL;
diff --git a/compiler/arm/raarmgas.pas b/compiler/arm/raarmgas.pas
index 7215b91d0c..fc1a1638fe 100644
--- a/compiler/arm/raarmgas.pas
+++ b/compiler/arm/raarmgas.pas
@@ -814,7 +814,7 @@ Unit raarmgas;
if symtype=AT_NONE then
sym:='';
- reference_reset(oper.opr.ref,4);
+ reference_reset(oper.opr.ref,4,[]);
oper.opr.ref.base:=NR_PC;
oper.opr.ref.symbol:=GetConstLabel(sym,val);
end;
diff --git a/compiler/arm/rgcpu.pas b/compiler/arm/rgcpu.pas
index a8e77e602c..e7be76d8c2 100644
--- a/compiler/arm/rgcpu.pas
+++ b/compiler/arm/rgcpu.pas
@@ -195,7 +195,7 @@ unit rgcpu;
{$endif}
cg.a_load_const_reg(helplist,OS_ADDR,spilltemp.offset,hreg);
cg.a_op_reg_reg(helplist,OP_ADD,OS_ADDR,current_procinfo.framepointer,hreg);
- reference_reset_base(tmpref,hreg,0,sizeof(aint));
+ reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
end
else if is_shifter_const(a and not($FFF), immshift) then
if spilltemp.offset > 0 then
@@ -205,7 +205,7 @@ unit rgcpu;
{$endif}
helplist.concat(taicpu.op_reg_reg_const(A_ADD, hreg, current_procinfo.framepointer,
a and not($FFF)));
- reference_reset_base(tmpref, hreg, a and $FFF, sizeof(aint));
+ reference_reset_base(tmpref, hreg, a and $FFF, sizeof(aint),[]);
end
else
begin
@@ -214,7 +214,7 @@ unit rgcpu;
{$endif}
helplist.concat(taicpu.op_reg_reg_const(A_SUB, hreg, current_procinfo.framepointer,
a and not($FFF)));
- reference_reset_base(tmpref, hreg, -(a and $FFF), sizeof(aint));
+ reference_reset_base(tmpref, hreg, -(a and $FFF), sizeof(aint),[]);
end
else
begin
@@ -222,7 +222,7 @@ unit rgcpu;
helplist.concat(tai_comment.create(strpnew('Spilling: Use a_load_const_reg to fix spill offset')));
{$endif}
cg.a_load_const_reg(helplist,OS_ADDR,spilltemp.offset,hreg);
- reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(aint));
+ reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(aint),[]);
tmpref.index:=hreg;
end;
@@ -464,7 +464,7 @@ unit rgcpu;
if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
begin
helplist:=TAsmList.create;
- reference_reset(tmpref,sizeof(aint));
+ reference_reset(tmpref,sizeof(aint),[]);
{ create consts entry }
current_asmdata.getjumplabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -482,7 +482,7 @@ unit rgcpu;
tmpref.base:=NR_R15;
helplist.concat(taicpu.op_reg_ref(A_LDR,hreg,tmpref));
- reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(aint));
+ reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(aint),[]);
tmpref.index:=hreg;
if spilltemp.index<>NR_NO then
@@ -522,7 +522,7 @@ unit rgcpu;
if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
begin
helplist:=TAsmList.create;
- reference_reset(tmpref,sizeof(aint));
+ reference_reset(tmpref,sizeof(aint),[]);
{ create consts entry }
current_asmdata.getjumplabel(l);
cg.a_label(current_procinfo.aktlocaldata,l);
@@ -542,7 +542,7 @@ unit rgcpu;
if spilltemp.index<>NR_NO then
internalerror(200401263);
- reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(pint));
+ reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(pint),[]);
tmpref.index:=hreg;
helplist.concat(spilling_create_store(tempreg,tmpref));
diff --git a/compiler/avr/cgcpu.pas b/compiler/avr/cgcpu.pas
index 85af97a8b4..b80459bab4 100644
--- a/compiler/avr/cgcpu.pas
+++ b/compiler/avr/cgcpu.pas
@@ -214,7 +214,7 @@ unit cgcpu;
a_load_reg_reg(list,paraloc^.size,paraloc^.size,r,paraloc^.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(ref,paraloc^.reference.index,paraloc^.reference.offset,2);
+ reference_reset_base(ref,paraloc^.reference.index,paraloc^.reference.offset,2,[]);
a_load_reg_ref(list,paraloc^.size,paraloc^.size,r,ref);
end;
else
@@ -334,7 +334,7 @@ unit cgcpu;
end;
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset(ref,paraloc.alignment);
+ reference_reset(ref,paraloc.alignment,[]);
ref.base:=hp^.reference.index;
ref.offset:=hp^.reference.offset;
a_load_const_ref(list,hp^.size,a shr (8*(i-1)),ref);
@@ -366,7 +366,7 @@ unit cgcpu;
a_load_ref_reg(list,location^.size,location^.size,tmpref,location^.register);
LOC_REFERENCE:
begin
- reference_reset_base(ref,location^.reference.index,location^.reference.offset,paraloc.alignment);
+ reference_reset_base(ref,location^.reference.index,location^.reference.offset,paraloc.alignment,[]);
{ doubles in softemu mode have a strange order of registers and references }
if location^.size=OS_32 then
g_concatcopy(list,tmpref,ref,4)
@@ -1041,7 +1041,7 @@ unit cgcpu;
end
else if assigned(ref.symbol) or (ref.offset<>0) then
begin
- reference_reset(tmpref,0);
+ reference_reset(tmpref,0,[]);
tmpref.symbol:=ref.symbol;
tmpref.offset:=ref.offset;
if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
@@ -1936,7 +1936,7 @@ unit cgcpu;
if assigned(ref.symbol) or (ref.offset<>0) then
begin
- reference_reset(tmpref,0);
+ reference_reset(tmpref,0,[]);
tmpref.symbol:=ref.symbol;
tmpref.offset:=ref.offset;
@@ -2027,8 +2027,8 @@ unit cgcpu;
begin
current_asmdata.getjumplabel(l);
- reference_reset(srcref,source.alignment);
- reference_reset(dstref,dest.alignment);
+ reference_reset(srcref,source.alignment,source.volatility);
+ reference_reset(dstref,dest.alignment,source.volatility);
srcref.base:=NR_R30;
srcref.addressmode:=AM_POSTINCREMENT;
dstref.base:=NR_R26;
diff --git a/compiler/avr/raavrgas.pas b/compiler/avr/raavrgas.pas
index d0bcb450fa..21f8c1ff4e 100644
--- a/compiler/avr/raavrgas.pas
+++ b/compiler/avr/raavrgas.pas
@@ -513,7 +513,7 @@ Unit raavrgas;
begin
oper.opr.typ:=OPR_REFERENCE;
- reference_reset_base(oper.opr.ref,tempreg,0,1);
+ reference_reset_base(oper.opr.ref,tempreg,0,1,[]);
oper.opr.ref.addressmode:=AM_POSTINCREMENT;
consume(AS_PLUS);
diff --git a/compiler/avr/rgcpu.pas b/compiler/avr/rgcpu.pas
index afb4a39de2..50e84ac160 100644
--- a/compiler/avr/rgcpu.pas
+++ b/compiler/avr/rgcpu.pas
@@ -104,7 +104,7 @@ unit rgcpu;
helplist.concat(taicpu.op_reg_reg(A_ADD,NR_R26,spilltemp.base));
helplist.concat(taicpu.op_reg_reg(A_ADC,NR_R27,GetNextReg(spilltemp.base)));
- reference_reset_base(tmpref,NR_R26,0,1);
+ reference_reset_base(tmpref,NR_R26,0,1,[]);
helpins:=spilling_create_load(tmpref,tempreg);
helplist.concat(helpins);
list.insertlistafter(pos,helplist);
@@ -130,7 +130,7 @@ unit rgcpu;
helplist.concat(taicpu.op_reg_reg(A_ADD,NR_R26,spilltemp.base));
helplist.concat(taicpu.op_reg_reg(A_ADC,NR_R27,GetNextReg(spilltemp.base)));
- reference_reset_base(tmpref,NR_R26,0,1);
+ reference_reset_base(tmpref,NR_R26,0,1,[]);
helplist.concat(spilling_create_store(tempreg,tmpref));
list.insertlistafter(pos,helplist);
helplist.free;
diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas
index 1ee8e96ad4..2e8e5c3263 100644
--- a/compiler/cgobj.pas
+++ b/compiler/cgobj.pas
@@ -854,7 +854,7 @@ implementation
a_load_reg_reg(list,size,cgpara.location^.size,r,cgpara.location^.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_load_reg_ref(list,size,cgpara.location^.size,r,ref);
end;
LOC_MMREGISTER,LOC_CMMREGISTER:
@@ -885,7 +885,7 @@ implementation
a_load_const_reg(list,cgpara.location^.size,a,cgpara.location^.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_load_const_ref(list,cgpara.location^.size,a,ref);
end
else
@@ -1014,7 +1014,7 @@ implementation
begin
if assigned(location^.next) then
internalerror(2010052906);
- reference_reset_base(ref,location^.reference.index,location^.reference.offset,newalignment(cgpara.alignment,cgpara.intsize-sizeleft));
+ reference_reset_base(ref,location^.reference.index,location^.reference.offset,newalignment(cgpara.alignment,cgpara.intsize-sizeleft),[]);
if (size <> OS_NO) and
(tcgsize2size[size] <= sizeof(aint)) then
a_load_ref_ref(list,size,location^.size,tmpref,ref)
@@ -1131,7 +1131,7 @@ implementation
a_loadfpu_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref);
LOC_REFERENCE :
begin
- reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset,align);
+ reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset,align,[]);
{ use concatcopy, because it can also be a float which fails when
load_ref_ref is used. Don't copy data when the references are equal }
if not((href.base=ref.base) and (href.offset=ref.offset)) then
@@ -1197,7 +1197,7 @@ implementation
end;
LOC_REFERENCE :
begin
- reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset,align);
+ reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset,align,[]);
case getregtype(reg) of
R_ADDRESSREGISTER,
R_INTREGISTER :
@@ -1603,7 +1603,7 @@ implementation
LOC_REFERENCE,LOC_CREFERENCE:
begin
cgpara.check_simple_location;
- reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_loadfpu_reg_ref(list,size,size,r,ref);
end;
LOC_REGISTER,LOC_CREGISTER:
@@ -1644,7 +1644,7 @@ implementation
LOC_REFERENCE,LOC_CREFERENCE:
begin
cgpara.check_simple_location;
- reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
{ concatcopy should choose the best way to copy the data }
g_concatcopy(list,ref,href,tcgsize2size[size]);
end;
@@ -1968,7 +1968,7 @@ implementation
a_loadmm_reg_reg(list,size,cgpara.location^.size,reg,cgpara.location^.register,shuffle);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_loadmm_reg_ref(list,size,cgpara.location^.size,reg,href,shuffle);
end;
LOC_REGISTER,LOC_CREGISTER:
@@ -2009,7 +2009,7 @@ implementation
begin
if not(cgpara.location^.next^.size in [OS_32,OS_S32]) then
internalerror(2009112911);
- reference_reset_base(href,cgpara.location^.next^.reference.index,cgpara.location^.next^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,cgpara.location^.next^.reference.index,cgpara.location^.next^.reference.offset,cgpara.alignment,[]);
a_load_reg_ref(list,OS_32,cgpara.location^.next^.size,tmpreg,href);
end;
end
@@ -2356,7 +2356,7 @@ implementation
begin
{ offset in the wrapper needs to be adjusted for the stored
return address }
- reference_reset_base(href,reference.index,reference.offset+sizeof(pint),sizeof(pint));
+ reference_reset_base(href,reference.index,reference.offset+sizeof(pint),sizeof(pint),[]);
a_op_const_ref(list,OP_SUB,size,ioffset,href);
end
else
@@ -2410,7 +2410,7 @@ implementation
{$endif cpu64bitaddr}
end;
result := getaddressregister(list);
- reference_reset_symbol(ref,l,0,sizeof(pint));
+ reference_reset_symbol(ref,l,0,sizeof(pint),[]);
{ a_load_ref_reg will turn this into a pic-load if needed }
a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,result);
end;
diff --git a/compiler/cgutils.pas b/compiler/cgutils.pas
index a8e7ae1fe6..e36642d8c5 100644
--- a/compiler/cgutils.pas
+++ b/compiler/cgutils.pas
@@ -43,6 +43,17 @@ unit cgutils;
{ Set type definition for cpuregisters }
tcpuregisterset = set of 0..maxcpuregister;
+{$packset 1}
+ { a reference may be volatile for reading, writing, or both. E.g., local variables
+ inside try-blocks are volatile for writes (writes must not be removed, because at
+ any point an exception may be triggered and then all previous writes to the
+ variable must have been performed), but not for reads (these variables' values
+ won't be changed behind the back of the current code just because they're in a
+ try-block) }
+ tvolatility = (vol_read,vol_write);
+ tvolatilityset = set of tvolatility;
+{$packset default}
+
{ reference record, reordered for best alignment }
preference = ^treference;
treference = record
@@ -84,6 +95,7 @@ unit cgutils;
indexoffset: aint;
checkcast: boolean;
{$endif jvm}
+ volatility: tvolatilityset;
alignment : byte;
end;
@@ -161,12 +173,12 @@ unit cgutils;
{ trerefence handling }
{# Clear to zero a treference }
- procedure reference_reset(var ref : treference; alignment: longint);
+ procedure reference_reset(var ref : treference; alignment: longint; volatility: tvolatilityset);
{# Clear to zero a treference, and set is base address
to base register.
}
- procedure reference_reset_base(var ref : treference;base : tregister;offset, alignment : longint);
- procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint);
+ procedure reference_reset_base(var ref : treference;base : tregister;offset, alignment : longint; volatility: tvolatilityset);
+ procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint; volatility: tvolatilityset);
{ This routine verifies if two references are the same, and
if so, returns TRUE, otherwise returns false.
}
@@ -177,7 +189,7 @@ unit cgutils;
{ cannot be used for loc_(c)reference, because that one requires an alignment }
procedure location_reset(var l : tlocation;lt:TCGNonRefLoc;lsize:TCGSize);
{ for loc_(c)reference }
- procedure location_reset_ref(var l : tlocation;lt:TCGRefLoc;lsize:TCGSize; alignment: longint);
+ procedure location_reset_ref(var l : tlocation;lt:TCGRefLoc;lsize:TCGSize; alignment: longint; volatility: tvolatilityset);
{ for loc_jump }
procedure location_reset_jump(out l: tlocation; truelab, falselab: tasmlabel);
procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
@@ -204,27 +216,28 @@ uses
TReference
****************************************************************************}
- procedure reference_reset(var ref : treference; alignment: longint);
+ procedure reference_reset(var ref: treference; alignment: longint; volatility: tvolatilityset);
begin
FillChar(ref,sizeof(treference),0);
{$ifdef arm}
ref.signindex:=1;
{$endif arm}
ref.alignment:=alignment;
+ ref.volatility:=volatility;
end;
- procedure reference_reset_base(var ref : treference;base : tregister;offset, alignment : longint);
+ procedure reference_reset_base(var ref: treference; base: tregister; offset, alignment: longint; volatility: tvolatilityset);
begin
- reference_reset(ref,alignment);
+ reference_reset(ref,alignment,volatility);
ref.base:=base;
ref.offset:=offset;
end;
- procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint);
+ procedure reference_reset_symbol(var ref: treference; sym: tasmsymbol; offset, alignment: longint; volatility: tvolatilityset);
begin
- reference_reset(ref,alignment);
+ reference_reset(ref,alignment,volatility);
ref.symbol:=sym;
ref.offset:=offset;
end;
@@ -257,8 +270,7 @@ uses
internalerror(2009020705);
end;
- procedure location_reset_ref(var l: tlocation; lt: tcgrefloc; lsize: tcgsize;
- alignment: longint);
+ procedure location_reset_ref(var l: tlocation; lt: TCGRefLoc; lsize: TCGSize; alignment: longint; volatility: tvolatilityset);
begin
FillChar(l,sizeof(tlocation),0);
l.loc:=lt;
@@ -267,6 +279,7 @@ uses
l.reference.signindex:=1;
{$endif arm}
l.reference.alignment:=alignment;
+ l.reference.volatility:=volatility;
end;
diff --git a/compiler/hlcg2ll.pas b/compiler/hlcg2ll.pas
index 576249f5cc..f0453ab7f4 100644
--- a/compiler/hlcg2ll.pas
+++ b/compiler/hlcg2ll.pas
@@ -1216,7 +1216,7 @@ implementation
record "size" parameters }
tg.gethltemp(list,size,size.size,tt_normal,r);
cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,r);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end;
LOC_MMREGISTER,
@@ -1224,7 +1224,7 @@ implementation
begin
tg.gethltemp(list,size,size.size,tt_normal,r);
cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,r,mms_movescalar);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end;
LOC_CONSTANT,
@@ -1242,7 +1242,7 @@ implementation
else
{$endif cpu64bitalu}
a_load_loc_ref(list,size,size,l,r);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end;
else
@@ -1264,7 +1264,7 @@ implementation
begin
tg.GetTemp(list,tcgsize2size[l.size],tcgsize2size[l.size],tt_normal,href);
cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,href);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=href;
end;
{$ifndef cpu64bitalu}
diff --git a/compiler/hlcgobj.pas b/compiler/hlcgobj.pas
index 9e82529837..6927d8fe87 100644
--- a/compiler/hlcgobj.pas
+++ b/compiler/hlcgobj.pas
@@ -122,7 +122,7 @@ unit hlcgobj;
@param(regsize the type of the pointer, contained in the reg parameter)
@param(reg register containing the value of a pointer)
}
- procedure reference_reset_base(var ref: treference; regsize: tdef; reg: tregister; offset, alignment: longint); virtual;
+ procedure reference_reset_base(var ref: treference; regsize: tdef; reg: tregister; offset, alignment: longint; volatility: tvolatilityset); virtual;
{# Returns a reference corresponding to a temp }
procedure temp_to_ref(p: ptemprecord; out ref: treference); virtual;
@@ -842,16 +842,16 @@ implementation
end;
procedure thlcgobj.reference_reset_base(var ref: treference; regsize: tdef;
- reg: tregister; offset, alignment: longint);
+ reg: tregister; offset, alignment: longint; volatility: tvolatilityset);
begin
- reference_reset(ref,alignment);
+ reference_reset(ref,alignment,volatility);
ref.base:=reg;
ref.offset:=offset;
end;
procedure thlcgobj.temp_to_ref(p: ptemprecord; out ref: treference);
begin
- reference_reset_base(ref,voidstackpointertype,current_procinfo.framepointer,p^.pos,p^.alignment);
+ reference_reset_base(ref,voidstackpointertype,current_procinfo.framepointer,p^.pos,p^.alignment,[]);
end;
procedure thlcgobj.a_label(list: TAsmList; l: tasmlabel); inline;
@@ -892,7 +892,7 @@ implementation
a_load_reg_reg(list,size,cgpara.location^.def,r,cgpara.location^.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(ref,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(ref,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_load_reg_ref(list,size,cgpara.location^.def,r,ref);
end;
LOC_MMREGISTER,LOC_CMMREGISTER:
@@ -922,7 +922,7 @@ implementation
a_load_const_reg(list,cgpara.location^.def,a,cgpara.location^.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(ref,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(ref,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_load_const_ref(list,cgpara.location^.def,a,ref);
end
else
@@ -1053,7 +1053,7 @@ implementation
begin
if assigned(location^.next) then
internalerror(2010052906);
- reference_reset_base(ref,voidstackpointertype,location^.reference.index,location^.reference.offset,newalignment(cgpara.alignment,cgpara.intsize-sizeleft));
+ reference_reset_base(ref,voidstackpointertype,location^.reference.index,location^.reference.offset,newalignment(cgpara.alignment,cgpara.intsize-sizeleft),[]);
if (def_cgsize(size)<>OS_NO) and
(size.size=sizeleft) and
(sizeleft<=sizeof(aint)) then
@@ -2453,7 +2453,7 @@ implementation
refptrdef:=cpointerdef.getreusable(refsize);
newbase:=getaddressregister(list,refptrdef);
a_loadaddr_ref_reg(list,refsize,refptrdef,ref,newbase);
- reference_reset_base(result.ref,refptrdef,newbase,0,result.ref.alignment);
+ reference_reset_base(result.ref,refptrdef,newbase,0,result.ref.alignment,[]);
end;
result.ref.index:=tmpreg;
tmpreg:=getintregister(list,ptruinttype);
@@ -2534,7 +2534,7 @@ implementation
LOC_REFERENCE,LOC_CREFERENCE:
begin
cgpara.check_simple_location;
- reference_reset_base(ref,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(ref,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_loadfpu_reg_ref(list,fromsize,cgpara.def,r,ref);
end;
LOC_REGISTER,LOC_CREGISTER:
@@ -2566,7 +2566,7 @@ implementation
LOC_REFERENCE,LOC_CREFERENCE:
begin
cgpara.check_simple_location;
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
{ concatcopy should choose the best way to copy the data }
g_concatcopy(list,fromsize,ref,href);
end;
@@ -2580,7 +2580,7 @@ implementation
intptrdef:=cpointerdef.getreusable(cgpara.location^.def);
hreg:=getaddressregister(list,intptrdef);
a_loadaddr_ref_reg(list,fromsize,intptrdef,ref,hreg);
- reference_reset_base(href,intptrdef,hreg,0,ref.alignment);
+ reference_reset_base(href,intptrdef,hreg,0,ref.alignment,[]);
a_load_ref_cgpara(list,cgpara.location^.def,ref,cgpara);
end
else
@@ -2676,7 +2676,7 @@ implementation
a_loadmm_reg_reg(list,fromsize,cgpara.def,reg,cgpara.location^.register,shuffle);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
a_loadmm_reg_ref(list,fromsize,cgpara.def,reg,href,shuffle);
end;
LOC_REGISTER,LOC_CREGISTER:
@@ -3292,7 +3292,7 @@ implementation
paramanager.getintparaloc(list,pd,2,cgpara2);
if is_open_array(t) then
InternalError(201103054);
- reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint));
+ reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint),[]);
if pd.is_pushleftright then
begin
a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
@@ -3340,7 +3340,7 @@ implementation
pd:=search_system_proc('fpc_initialize');
paramanager.getintparaloc(list,pd,1,cgpara1);
paramanager.getintparaloc(list,pd,2,cgpara2);
- reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint));
+ reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint),[]);
if pd.is_pushleftright then
begin
a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
@@ -3390,7 +3390,7 @@ implementation
pd:=search_system_proc('fpc_finalize');
paramanager.getintparaloc(list,pd,1,cgpara1);
paramanager.getintparaloc(list,pd,2,cgpara2);
- reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint));
+ reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint),[]);
if pd.is_pushleftright then
begin
a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
@@ -3432,7 +3432,7 @@ implementation
paramanager.getintparaloc(list,pd,2,cgpara2);
paramanager.getintparaloc(list,pd,3,cgpara3);
- reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint));
+ reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti,def_needs_indirect(t)),0,sizeof(pint),[]);
{ if calling convention is left to right, push parameters 1 and 2 }
if pd.is_pushleftright then
begin
@@ -4043,7 +4043,7 @@ implementation
begin
tg.gethltemp(list,size,size.size,tt_normal,r);
a_loadfpu_reg_ref(list,size,size,l.register,r);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end;
LOC_MMREGISTER,
@@ -4054,7 +4054,7 @@ implementation
internalerror(2012062301);
tg.gethltemp(list,size,size.size,tt_normal,r);
a_loadmm_reg_ref(list,size,size,l.register,r,mms_movescalar);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end;
LOC_CONSTANT,
@@ -4072,7 +4072,7 @@ implementation
forcesize:=sizeof(pint);
tg.gethltemp(list,size,forcesize,tt_normal,r);
a_load_loc_ref(list,size,size,l,r);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end;
LOC_CREFERENCE,
@@ -4096,7 +4096,7 @@ implementation
begin
tg.gethltemp(list,size,-1,tt_normal,href);
hlcg.a_loadfpu_reg_ref(list,size,size,l.register,href);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=href;
end;
{ on ARM, CFP values may be located in integer registers,
@@ -4141,7 +4141,7 @@ implementation
begin
if not loadref then
internalerror(200410231);
- reference_reset_base(ref,cpointerdef.getreusable(def),l.register,0,alignment);
+ reference_reset_base(ref,cpointerdef.getreusable(def),l.register,0,alignment,[]);
end;
LOC_REFERENCE,
LOC_CREFERENCE :
@@ -4149,7 +4149,7 @@ implementation
if loadref then
begin
pdef:=cpointerdef.getreusable(def);
- reference_reset_base(ref,pdef,getaddressregister(list,voidpointertype),0,alignment);
+ reference_reset_base(ref,pdef,getaddressregister(list,voidpointertype),0,alignment,[]);
{ it's a pointer to def }
a_load_ref_reg(list,pdef,pdef,l.reference,ref.base);
end
@@ -4591,7 +4591,7 @@ implementation
procedure thlcgobj.paravarsym_set_initialloc_to_paraloc(vs: tparavarsym);
begin
reference_reset_base(vs.initialloc.reference,voidstackpointertype,tparavarsym(vs).paraloc[calleeside].location^.reference.index,
- tparavarsym(vs).paraloc[calleeside].location^.reference.offset,tparavarsym(vs).paraloc[calleeside].alignment);
+ tparavarsym(vs).paraloc[calleeside].location^.reference.offset,tparavarsym(vs).paraloc[calleeside].alignment,[]);
end;
procedure thlcgobj.gen_entry_code(list: TAsmList);
@@ -4716,7 +4716,7 @@ implementation
{ initialize fpu regvar by loading from memory }
reference_reset_symbol(href,
current_asmdata.RefAsmSymbol(tstaticvarsym(p).mangledname,AT_DATA), 0,
- var_align(tstaticvarsym(p).vardef.alignment));
+ var_align(tstaticvarsym(p).vardef.alignment),[]);
a_loadfpu_ref_reg(TAsmList(arg), tstaticvarsym(p).vardef,
tstaticvarsym(p).vardef, href, tstaticvarsym(p).initialloc.register);
end;
@@ -5143,7 +5143,7 @@ implementation
case para.location^.loc of
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(href,voidstackpointertype,para.location^.reference.index,para.location^.reference.offset,para.alignment);
+ reference_reset_base(href,voidstackpointertype,para.location^.reference.index,para.location^.reference.offset,para.alignment,[]);
a_load_ref_ref(list,para.def,para.def,href,destloc.reference);
end;
else
diff --git a/compiler/i386/aoptcpu.pas b/compiler/i386/aoptcpu.pas
index 41aade3128..2553087369 100644
--- a/compiler/i386/aoptcpu.pas
+++ b/compiler/i386/aoptcpu.pas
@@ -305,7 +305,7 @@ begin
((taicpu(hp1).opcode=A_Jcc) and
(taicpu(hp1).condition in [C_O,C_NO])))) then
begin
- reference_reset(tmpref,1);
+ reference_reset(tmpref,1,[]);
case taicpu(p).oper[0]^.val Of
3: begin
{imul 3, reg1, reg2 to
@@ -361,7 +361,7 @@ begin
taicpu(p).oper[1]^.reg,taicpu(p).oper[1]^.reg);
end;
InsertLLItem(p, p.next, hp1);
- reference_reset(tmpref,2);
+ reference_reset(tmpref,2,[]);
TmpRef.index := taicpu(p).oper[1]^.reg;
TmpRef.ScaleFactor := 2;
if (taicpu(p).ops = 3) then
@@ -448,7 +448,7 @@ begin
hp1 := taicpu.op_ref_reg(A_LEA, S_L, TmpRef, taicpu(p).oper[1]^.reg);
end;
InsertLLItem(p, p.next, hp1);
- reference_reset(tmpref,2);
+ reference_reset(tmpref,2,[]);
TmpRef.index := taicpu(p).oper[1]^.reg;
if (taicpu(p).ops = 3) then
begin
@@ -1427,7 +1427,7 @@ begin
TmpBool1 := True; {should we check the next instruction?}
TmpBool2 := False; {have we found an add/sub which could be
integrated in the lea?}
- reference_reset(tmpref,2);
+ reference_reset(tmpref,2,[]);
TmpRef.index := taicpu(p).oper[1]^.reg;
TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
while TmpBool1 and
@@ -1518,7 +1518,7 @@ begin
{changes "shl $2, %reg" to "lea (,%reg,4), %reg"
"shl $3, %reg" to "lea (,%reg,8), %reg}
begin
- reference_reset(tmpref,2);
+ reference_reset(tmpref,2,[]);
TmpRef.index := taicpu(p).oper[1]^.reg;
TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
hp1 := taicpu.Op_ref_reg(A_LEA,S_L,TmpRef, taicpu(p).oper[1]^.reg);
diff --git a/compiler/i386/cgcpu.pas b/compiler/i386/cgcpu.pas
index ffbe956f1c..33b8c61648 100644
--- a/compiler/i386/cgcpu.pas
+++ b/compiler/i386/cgcpu.pas
@@ -186,7 +186,7 @@ unit cgcpu;
cgpara.check_simple_location;
len:=align(cgpara.intsize,cgpara.alignment);
g_stackpointer_alloc(list,len);
- reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,0,4,[]);
g_concatcopy(list,r,href,len);
end
else
@@ -257,7 +257,7 @@ unit cgcpu;
end
else
begin
- reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint));
+ reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint),[]);
tmpref.refaddr:=addr_pic;
tmpref.base:=current_procinfo.got;
{$ifdef EXTDEBUG}
@@ -299,7 +299,7 @@ unit cgcpu;
var
href : treference;
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,a,0);
+ reference_reset_base(href,NR_STACK_POINTER_REG,a,0,[]);
{ normally, lea is a better choice than an add }
list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
end;
diff --git a/compiler/i386/hlcgcpu.pas b/compiler/i386/hlcgcpu.pas
index 0d443b04f6..fb56b9c69a 100644
--- a/compiler/i386/hlcgcpu.pas
+++ b/compiler/i386/hlcgcpu.pas
@@ -90,10 +90,10 @@ implementation
(cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
begin
cg.g_stackpointer_alloc(list,stacksize);
- reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size);
+ reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size,[]);
end
else
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
cg.a_loadfpu_reg_ref(list,locsize,locsize,l.register,href);
end;
LOC_FPUREGISTER:
@@ -135,10 +135,10 @@ implementation
(cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
begin
cg.g_stackpointer_alloc(list,stacksize);
- reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size);
+ reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size,[]);
end
else
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
cg.a_loadmm_reg_ref(list,locsize,locsize,l.register,href,mms_movescalar);
end;
LOC_FPUREGISTER:
@@ -164,7 +164,7 @@ implementation
cg.a_load_ref_cgpara(list,locsize,l.reference,cgpara)
else
begin
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
cg.g_concatcopy(list,l.reference,href,stacksize);
end;
end;
@@ -334,7 +334,7 @@ implementation
selfoffsetfromsp:=2*sizeof(aint)
else
selfoffsetfromsp:=sizeof(aint);
- reference_reset_base(href,voidstackpointertype,NR_ESP,selfoffsetfromsp+offs,4);
+ reference_reset_base(href,voidstackpointertype,NR_ESP,selfoffsetfromsp+offs,4,[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
end;
end;
@@ -344,7 +344,7 @@ implementation
href : treference;
begin
{ mov 0(%eax),%reg ; load vmt}
- reference_reset_base(href,voidpointertype,NR_EAX,0,4);
+ reference_reset_base(href,voidpointertype,NR_EAX,0,4,[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,reg);
end;
@@ -355,7 +355,7 @@ implementation
if (procdef.extnumber=$ffff) then
Internalerror(200006139);
{ call/jmp vmtoffs(%reg) ; method offs }
- reference_reset_base(href,voidpointertype,reg,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4);
+ reference_reset_base(href,voidpointertype,reg,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4,[]);
list.concat(taicpu.op_ref(op,S_L,href));
end;
@@ -367,7 +367,7 @@ implementation
if (procdef.extnumber=$ffff) then
Internalerror(200006139);
{ mov vmtoffs(%eax),%eax ; method offs }
- reference_reset_base(href,voidpointertype,NR_EAX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4);
+ reference_reset_base(href,voidpointertype,NR_EAX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4,[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
end;
@@ -412,7 +412,7 @@ implementation
loadvmtto(NR_EAX);
loadmethodoffstoeax;
{ mov %eax,4(%esp) }
- reference_reset_base(href,voidstackpointertype,NR_ESP,4,4);
+ reference_reset_base(href,voidstackpointertype,NR_ESP,4,4,[]);
list.concat(taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
{ pop %eax }
list.concat(taicpu.op_reg(A_POP,S_L,NR_EAX));
diff --git a/compiler/i386/n386add.pas b/compiler/i386/n386add.pas
index 82e2792e90..8f7d746e8d 100644
--- a/compiler/i386/n386add.pas
+++ b/compiler/i386/n386add.pas
@@ -451,7 +451,7 @@ interface
begin
pass_left_right;
reg:=NR_NO;
- reference_reset(ref,sizeof(pint));
+ reference_reset(ref,sizeof(pint),[]);
{ Mul supports registers and references, so if not register/reference,
load the location into a register.
diff --git a/compiler/i386/n386cal.pas b/compiler/i386/n386cal.pas
index 77cdfd6fa7..e4608a2d85 100644
--- a/compiler/i386/n386cal.pas
+++ b/compiler/i386/n386cal.pas
@@ -77,10 +77,10 @@ implementation
libparaloc:=paralocs[procdefinition.paras.count-1]^.location;
if libparaloc^.loc <> LOC_REFERENCE then
internalerror(2016090203);
- reference_reset_base(tmpref,libparaloc^.reference.index,libparaloc^.reference.offset,sizeof(pint));
+ reference_reset_base(tmpref,libparaloc^.reference.index,libparaloc^.reference.offset,sizeof(pint),[]);
cg.getcpuregister(current_asmdata.CurrAsmList,NR_EAX);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_EAX);
- reference_reset_base(tmpref,NR_EAX,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,NR_EAX,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_CALL,S_NO,tmpref));
cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_EAX);
exit;
@@ -89,7 +89,7 @@ implementation
begin
current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall - RegBase in EAX')));
{ libbase must be in EAX already, so just piggyback that, and dereference it }
- reference_reset_base(tmpref,NR_EAX,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,NR_EAX,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_CALL,S_NO,tmpref));
exit;
end;
diff --git a/compiler/i386/n386flw.pas b/compiler/i386/n386flw.pas
index 819d4948e8..d6d5ea8745 100644
--- a/compiler/i386/n386flw.pas
+++ b/compiler/i386/n386flw.pas
@@ -260,7 +260,7 @@ procedure emit_scope_start(handler,data: TAsmSymbol);
hreg: tregister;
begin
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
- reference_reset_base(href,hreg,0,sizeof(pint));
+ reference_reset_base(href,hreg,0,sizeof(pint),[]);
href.segment:=NR_FS;
emit_reg_reg(A_XOR,S_L,hreg,hreg);
emit_sym(A_PUSH,S_L,data);
@@ -277,7 +277,7 @@ procedure emit_scope_end;
begin
hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
hreg2:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
- reference_reset_base(href,hreg,0,sizeof(pint));
+ reference_reset_base(href,hreg,0,sizeof(pint),[]);
href.segment:=NR_FS;
emit_reg_reg(A_XOR,S_L,hreg,hreg);
emit_reg(A_POP,S_L,hreg2);
diff --git a/compiler/i8086/cgcpu.pas b/compiler/i8086/cgcpu.pas
index 27ae5af959..26a1e2466c 100644
--- a/compiler/i8086/cgcpu.pas
+++ b/compiler/i8086/cgcpu.pas
@@ -825,7 +825,7 @@ unit cgcpu;
a_load_reg_reg(list,paraloc^.size,paraloc^.size,r,paraloc^.register);
LOC_REFERENCE,LOC_CREFERENCE:
begin
- reference_reset_base(ref,paraloc^.reference.index,paraloc^.reference.offset,2);
+ reference_reset_base(ref,paraloc^.reference.index,paraloc^.reference.offset,2,[]);
a_load_reg_ref(list,paraloc^.size,paraloc^.size,r,ref);
end;
else
@@ -1005,7 +1005,7 @@ unit cgcpu;
cgpara.check_simple_location;
len:=align(cgpara.intsize,cgpara.alignment);
g_stackpointer_alloc(list,len);
- reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,0,4,[]);
g_concatcopy(list,r,href,len);
end
else
@@ -1092,7 +1092,7 @@ unit cgcpu;
end
else if assigned(symbol) then
begin
- reference_reset_symbol(tmpref,r.symbol,0,0);
+ reference_reset_symbol(tmpref,r.symbol,0,r.alignment,r.volatility);
tmpref.refaddr:=addr_seg;
if current_settings.cputype < cpu_186 then
begin
@@ -1871,7 +1871,7 @@ unit cgcpu;
{ Restore SP position before SP change }
if current_settings.x86memorymodel=mm_huge then
stacksize:=stacksize + 2;
- reference_reset_base(ref,NR_BP,-stacksize,2);
+ reference_reset_base(ref,NR_BP,-stacksize,2,[]);
list.concat(Taicpu.op_ref_reg(A_LEA,S_W,ref,NR_SP));
sp_moved:=true;
end;
@@ -2237,16 +2237,16 @@ unit cgcpu;
list.concat(taicpu.op_reg_reg(A_MOV,S_W,reference.index,NR_DI));
if reference.index=NR_SP then
- reference_reset_base(href,NR_DI,reference.offset+return_address_size+2,sizeof(pint))
+ reference_reset_base(href,NR_DI,reference.offset+return_address_size+2,sizeof(pint),[])
else
- reference_reset_base(href,NR_DI,reference.offset+return_address_size,sizeof(pint));
+ reference_reset_base(href,NR_DI,reference.offset+return_address_size,sizeof(pint),[]);
href.segment:=NR_SS;
a_op_const_ref(list,OP_SUB,size,ioffset,href);
list.concat(taicpu.op_reg(A_POP,S_W,NR_DI));
end
else
begin
- reference_reset_base(href,reference.index,reference.offset+return_address_size,sizeof(pint));
+ reference_reset_base(href,reference.index,reference.offset+return_address_size,sizeof(pint),[]);
href.segment:=NR_SS;
a_op_const_ref(list,OP_SUB,size,ioffset,href);
end;
diff --git a/compiler/i8086/hlcgcpu.pas b/compiler/i8086/hlcgcpu.pas
index f8f7fe3f91..b8f98e768d 100644
--- a/compiler/i8086/hlcgcpu.pas
+++ b/compiler/i8086/hlcgcpu.pas
@@ -67,7 +67,7 @@ interface
public
function getaddressregister(list:TAsmList;size:tdef):Tregister;override;
- procedure reference_reset_base(var ref: treference; regsize: tdef; reg: tregister; offset, alignment: longint); override;
+ procedure reference_reset_base(var ref: treference; regsize: tdef; reg: tregister; offset, alignment: longint; volatility: tvolatilityset); override;
function a_call_name(list : TAsmList;pd : tprocdef;const s : TSymStr; const paras: array of pcgpara; forceresdef: tdef; weak: boolean): tcgpara;override;
@@ -149,10 +149,10 @@ implementation
(cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
begin
cg.g_stackpointer_alloc(list,stacksize);
- reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size);
+ reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size,[]);
end
else
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
cg.a_loadfpu_reg_ref(list,locsize,locsize,l.register,href);
end;
LOC_FPUREGISTER:
@@ -194,10 +194,10 @@ implementation
(cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
begin
cg.g_stackpointer_alloc(list,stacksize);
- reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size);
+ reference_reset_base(href,voidstackpointertype,NR_STACK_POINTER_REG,0,voidstackpointertype.size,[]);
end
else
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
cg.a_loadmm_reg_ref(list,locsize,locsize,l.register,href,mms_movescalar);
end;
LOC_FPUREGISTER:
@@ -223,7 +223,7 @@ implementation
cg.a_load_ref_cgpara(list,locsize,l.reference,cgpara)
else
begin
- reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
+ reference_reset_base(href,voidstackpointertype,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment,[]);
cg.g_concatcopy(list,l.reference,href,stacksize);
end;
end;
@@ -266,9 +266,9 @@ implementation
procedure thlcgcpu.reference_reset_base(var ref: treference; regsize: tdef;
- reg: tregister; offset, alignment: longint);
+ reg: tregister; offset, alignment: longint; volatility: tvolatilityset);
begin
- inherited reference_reset_base(ref, regsize, reg, offset, alignment);
+ inherited;
{ implicit pointer types on i8086 follow the default data pointer size for
the current memory model }
@@ -380,7 +380,7 @@ implementation
which can be obtained by the SEG directive }
else if assigned(ref.symbol) then
begin
- reference_reset_symbol(segref,ref.symbol,0,0);
+ reference_reset_symbol(segref,ref.symbol,0,ref.alignment,ref.volatility);
segref.refaddr:=addr_seg;
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,GetNextReg(r));
end
@@ -519,7 +519,7 @@ implementation
if current_settings.x86memorymodel in x86_far_code_models then
inc(selfoffsetfromsp,2);
list.concat(taicpu.op_reg_reg(A_mov,S_W,NR_SP,NR_DI));
- reference_reset_base(href,voidnearpointertype,NR_DI,selfoffsetfromsp+offs+2,2);
+ reference_reset_base(href,voidnearpointertype,NR_DI,selfoffsetfromsp+offs+2,2,[]);
if not segment_regs_equal(NR_SS,NR_DS) then
href.segment:=NR_SS;
if current_settings.x86memorymodel in x86_near_data_models then
@@ -540,12 +540,12 @@ implementation
{ mov 0(%bx),%bx ; load vmt}
if current_settings.x86memorymodel in x86_near_data_models then
begin
- reference_reset_base(href,voidnearpointertype,NR_BX,0,2);
+ reference_reset_base(href,voidnearpointertype,NR_BX,0,2,[]);
cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_BX);
end
else
begin
- reference_reset_base(href,voidnearpointertype,NR_BX,0,2);
+ reference_reset_base(href,voidnearpointertype,NR_BX,0,2,[]);
href.segment:=NR_ES;
list.concat(taicpu.op_ref_reg(A_LES,S_W,href,NR_BX));
end;
@@ -566,12 +566,12 @@ implementation
if current_settings.x86memorymodel in x86_far_code_models then
begin
{ mov vmtseg(%bx),%si ; method seg }
- reference_reset_base(href,voidnearpointertype,NR_BX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber)+2,2);
+ reference_reset_base(href,voidnearpointertype,NR_BX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber)+2,2,[]);
href.segment:=srcseg;
cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_SI);
end;
{ mov vmtoffs(%bx),%bx ; method offs }
- reference_reset_base(href,voidnearpointertype,NR_BX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),2);
+ reference_reset_base(href,voidnearpointertype,NR_BX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),2,[]);
href.segment:=srcseg;
cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_BX);
end;
@@ -625,9 +625,9 @@ implementation
{ set target address
"mov %bx,4(%sp)" }
if current_settings.x86memorymodel in x86_far_code_models then
- reference_reset_base(href,voidnearpointertype,NR_DI,6,2)
+ reference_reset_base(href,voidnearpointertype,NR_DI,6,2,[])
else
- reference_reset_base(href,voidnearpointertype,NR_DI,4,2);
+ reference_reset_base(href,voidnearpointertype,NR_DI,4,2,[]);
if not segment_regs_equal(NR_DS,NR_SS) then
href.segment:=NR_SS;
list.concat(taicpu.op_reg_reg(A_MOV,S_W,NR_SP,NR_DI));
@@ -689,7 +689,7 @@ implementation
else
internalerror(2014052202);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end
else if is_fourbyterecord(size) and (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
@@ -704,7 +704,7 @@ implementation
else
cg.a_load_reg_ref(list,OS_16,OS_16,GetNextReg(l.register),tmpref);
- location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment);
+ location_reset_ref(l,LOC_REFERENCE,l.size,size.alignment,[]);
l.reference:=r;
end
else
diff --git a/compiler/i8086/n8086add.pas b/compiler/i8086/n8086add.pas
index 165cc16fce..fc8ec9f667 100644
--- a/compiler/i8086/n8086add.pas
+++ b/compiler/i8086/n8086add.pas
@@ -998,7 +998,7 @@ interface
begin
reg:=NR_NO;
- reference_reset(ref,sizeof(pint));
+ reference_reset(ref,sizeof(pint),[]);
pass_left_right;
diff --git a/compiler/i8086/n8086inl.pas b/compiler/i8086/n8086inl.pas
index cb7d08ed8c..73d7828662 100644
--- a/compiler/i8086/n8086inl.pas
+++ b/compiler/i8086/n8086inl.pas
@@ -106,7 +106,7 @@ implementation
begin
location_reset(location,LOC_REGISTER,OS_16);
location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_16);
- reference_reset_symbol(segref,left.location.reference.symbol,0,0);
+ reference_reset_symbol(segref,left.location.reference.symbol,0,left.location.reference.alignment,left.location.reference.volatility);
segref.refaddr:=addr_seg;
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,location.register);
end
diff --git a/compiler/i8086/n8086ld.pas b/compiler/i8086/n8086ld.pas
index 073592497c..053ea15f1f 100644
--- a/compiler/i8086/n8086ld.pas
+++ b/compiler/i8086/n8086ld.pas
@@ -117,7 +117,7 @@ implementation
{ we don't know the size of all arrays }
newsize:=def_cgsize(resultdef);
{ alignment is overridden per case below }
- location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment);
+ location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment,[]);
{
Thread var loading is optimized to first check if
@@ -139,18 +139,18 @@ implementation
paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pvd);
segreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_16);
- reference_reset_symbol(segref,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE',AT_DATA),0,0);
+ reference_reset_symbol(segref,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE',AT_DATA),0,pvd.alignment,[]);
segref.refaddr:=addr_seg;
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,segreg);
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE',AT_DATA),0,pvd.alignment);
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE',AT_DATA),0,pvd.alignment,[]);
href.segment:=segreg;
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,pvd,pvd,href,hregister);
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,pvd,OC_EQ,0,hregister,norelocatelab);
{ don't save the allocated register else the result will be destroyed later }
if not(vo_is_weak_external in gvs.varoptions) then
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA),0,sizeof(pint))
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA),0,2,[])
else
- reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,sizeof(pint));
+ reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,2,[]);
cg.a_load_ref_cgpara(current_asmdata.CurrAsmList,OS_16,href,paraloc1);
paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
paraloc1.done;
@@ -168,12 +168,12 @@ implementation
0 - Threadvar index
4 - Threadvar value in single threading }
if not(vo_is_weak_external in gvs.varoptions) then
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA),sizeof(pint),sizeof(pint))
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA),sizeof(pint),2,[])
else
- reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),sizeof(pint),sizeof(pint));
+ reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),sizeof(pint),2,[]);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,voidpointertype,href,hregister);
cg.a_label(current_asmdata.CurrAsmList,endrelocatelab);
- hlcg.reference_reset_base(location.reference,voidpointertype,hregister,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,voidpointertype,hregister,0,location.reference.alignment,[]);
end
else
inherited generate_threadvar_access(gvs);
@@ -218,7 +218,7 @@ implementation
{ we don't know the size of all arrays }
newsize:=def_cgsize(resultdef);
{ alignment is overridden per case below }
- location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment);
+ location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment,[]);
if gvs.localloc.loc=LOC_INVALID then
begin
@@ -229,11 +229,11 @@ implementation
segreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_16);
- reference_reset_symbol(segref,refsym,0,0);
+ reference_reset_symbol(segref,refsym,0,0,[]);
segref.refaddr:=addr_seg;
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,segreg);
- reference_reset_symbol(location.reference,refsym,0,location.reference.alignment);
+ reference_reset_symbol(location.reference,refsym,0,location.reference.alignment,[]);
location.reference.segment:=segreg;
end
else
diff --git a/compiler/i8086/n8086mem.pas b/compiler/i8086/n8086mem.pas
index cb56867999..1bbcbd9caa 100644
--- a/compiler/i8086/n8086mem.pas
+++ b/compiler/i8086/n8086mem.pas
@@ -129,9 +129,9 @@ implementation
{ assume natural alignment, except for packed records }
if not(resultdef.typ in [recorddef,objectdef]) or
(tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),resultdef.alignment)
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),resultdef.alignment,[])
else
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1,[]);
if not(left.location.loc in [LOC_CREGISTER,LOC_REGISTER,LOC_CREFERENCE,LOC_REFERENCE,LOC_CONSTANT]) then
hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
case left.location.loc of
diff --git a/compiler/jvm/hlcgcpu.pas b/compiler/jvm/hlcgcpu.pas
index cc0692dd5b..72efc0fa87 100644
--- a/compiler/jvm/hlcgcpu.pas
+++ b/compiler/jvm/hlcgcpu.pas
@@ -940,7 +940,7 @@ implementation
a_load_loc_stack(list,tparavarsym(p).vardef,tparavarsym(p).initialloc);
a_op_const_stack(list,OP_AND,tparavarsym(p).vardef,(1 shl (tparavarsym(p).vardef.size*8))-1);
a_load_stack_ref(list,tparavarsym(p).vardef,tmpref,prepare_stack_for_ref(list,tmpref,false));
- location_reset_ref(tparavarsym(p).localloc,LOC_REFERENCE,def_cgsize(tparavarsym(p).vardef),4);
+ location_reset_ref(tparavarsym(p).localloc,LOC_REFERENCE,def_cgsize(tparavarsym(p).vardef),4,tmpref.volatility);
tparavarsym(p).localloc.reference:=tmpref;
end;
@@ -1033,7 +1033,7 @@ implementation
end;
art_indexref:
begin
- cgutils.reference_reset_base(href,ref.indexbase,ref.indexoffset,4);
+ cgutils.reference_reset_base(href,ref.indexbase,ref.indexoffset,4,ref.volatility);
href.symbol:=ref.indexsymbol;
a_load_ref_stack(list,s32inttype,href,prepare_stack_for_ref(list,href,false));
end;
@@ -1790,8 +1790,8 @@ implementation
begin
{ passed by reference in array of single element; l contains the
base address of the array }
- location_reset_ref(tmploc,LOC_REFERENCE,OS_ADDR,4);
- cgutils.reference_reset_base(tmploc.reference,getaddressregister(list,java_jlobject),0,4);
+ location_reset_ref(tmploc,LOC_REFERENCE,OS_ADDR,4,ref.volatility);
+ cgutils.reference_reset_base(tmploc.reference,getaddressregister(list,java_jlobject),0,4,ref.volatility);
tmploc.reference.arrayreftype:=art_indexconst;
tmploc.reference.indexoffset:=0;
a_load_loc_reg(list,java_jlobject,java_jlobject,l,tmploc.reference.base);
@@ -1834,7 +1834,7 @@ implementation
stackslots:=prepare_stack_for_ref(list,localref,false);
{ create the local copy of the array (lenloc is invalid, get length
directly from the array) }
- location_reset_ref(arrloc,LOC_REFERENCE,OS_ADDR,sizeof(pint));
+ location_reset_ref(arrloc,LOC_REFERENCE,OS_ADDR,sizeof(pint),ref.volatility);
arrloc.reference:=ref;
g_getarraylen(list,arrloc);
g_newarray(list,arrdef,1);
@@ -1858,7 +1858,7 @@ implementation
case current_procinfo.procdef.proctypeoption of
potype_unitinit:
begin
- cgutils.reference_reset_base(ref,NR_NO,0,1);
+ cgutils.reference_reset_base(ref,NR_NO,0,1,[]);
if assigned(current_module.globalsymtable) then
allocate_implicit_structs_for_st_with_base_ref(list,current_module.globalsymtable,ref,staticvarsym);
allocate_implicit_structs_for_st_with_base_ref(list,current_module.localsymtable,ref,staticvarsym);
@@ -1868,7 +1868,7 @@ implementation
{ also initialise local variables, if any }
inherited;
{ initialise class fields }
- cgutils.reference_reset_base(ref,NR_NO,0,1);
+ cgutils.reference_reset_base(ref,NR_NO,0,1,[]);
allocate_implicit_structs_for_st_with_base_ref(list,tabstractrecorddef(current_procinfo.procdef.owner.defowner).symtable,ref,staticvarsym);
end
else
@@ -2321,7 +2321,7 @@ implementation
{ no enum with ordinal value 0 -> exit }
if not assigned(sym) then
exit;
- reference_reset_symbol(ref,current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),0,4);
+ reference_reset_symbol(ref,current_asmdata.RefAsmSymbol(sym.mangledname,AT_DATA),0,4,[]);
result:=true;
end;
@@ -2418,7 +2418,7 @@ implementation
internalerror(2011033001);
selfreg:=getaddressregister(list,selfpara.vardef);
a_load_loc_reg(list,obj,obj,selfpara.localloc,selfreg);
- cgutils.reference_reset_base(ref,selfreg,0,1);
+ cgutils.reference_reset_base(ref,selfreg,0,1,[]);
allocate_implicit_structs_for_st_with_base_ref(list,obj.symtable,ref,fieldvarsym);
end;
diff --git a/compiler/jvm/njvmcal.pas b/compiler/jvm/njvmcal.pas
index 59a9530724..9a1e8a9c85 100644
--- a/compiler/jvm/njvmcal.pas
+++ b/compiler/jvm/njvmcal.pas
@@ -417,7 +417,7 @@ implementation
procedure tjvmcallnode.set_result_location(realresdef: tstoreddef);
begin
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(realresdef),1);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(realresdef),1,[]);
{ in case of jvmimplicitpointertype(), the function will have allocated
it already and we don't have to allocate it again here }
if not jvmimplicitpointertype(realresdef) then
diff --git a/compiler/jvm/njvmcnv.pas b/compiler/jvm/njvmcnv.pas
index ad76ffbc8b..e3d4c89150 100644
--- a/compiler/jvm/njvmcnv.pas
+++ b/compiler/jvm/njvmcnv.pas
@@ -711,7 +711,7 @@ implementation
begin
tg.gethltemp(current_asmdata.currasmlist,java_jlobject,java_jlobject.size,tt_normal,r);
hlcg.a_load_const_ref(current_asmdata.CurrAsmList,java_jlobject,0,r);
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1,[]);
location.reference:=r;
end;
@@ -830,11 +830,11 @@ implementation
{ store the data in the newly created array }
basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
thlcgjvm(hlcg).a_load_stack_reg(current_asmdata.CurrAsmList,java_jlobject,basereg);
- reference_reset_base(arrayref,basereg,0,4);
+ reference_reset_base(arrayref,basereg,0,4,[]);
arrayref.arrayreftype:=art_indexconst;
arrayref.indexoffset:=0;
hlcg.a_load_loc_ref(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,arrayref);
- location_reset_ref(location,LOC_REFERENCE,OS_ADDR,4);
+ location_reset_ref(location,LOC_REFERENCE,OS_ADDR,4,[]);
tg.gethltemp(current_asmdata.CurrAsmList,java_jlobject,4,tt_normal,location.reference);
hlcg.a_load_reg_ref(current_asmdata.CurrAsmList,java_jlobject,java_jlobject,basereg,location.reference);
end;
diff --git a/compiler/jvm/njvmflw.pas b/compiler/jvm/njvmflw.pas
index c4387c31a5..b8e1a9d38b 100644
--- a/compiler/jvm/njvmflw.pas
+++ b/compiler/jvm/njvmflw.pas
@@ -232,7 +232,7 @@ implementation
the exception code (in case of an anonymous "raise") }
current_asmdata.CurrAsmList.concat(tai_marker.create(mark_NoLineInfoStart));
prev_except_loc:=current_except_loc;
- location_reset_ref(current_except_loc,LOC_REFERENCE,OS_ADDR,4);
+ location_reset_ref(current_except_loc,LOC_REFERENCE,OS_ADDR,4,[]);
tg.GetLocal(current_asmdata.CurrAsmList,sizeof(pint),java_jlthrowable,current_except_loc.reference);
thlcgjvm(hlcg).incstack(current_asmdata.CurrAsmList,1);
thlcgjvm(hlcg).a_load_stack_loc(current_asmdata.CurrAsmList,java_jlthrowable,current_except_loc);
@@ -302,7 +302,7 @@ implementation
{ Retrieve exception variable }
{ 1) prepare the location where we'll store it }
- location_reset_ref(exceptvarsym.localloc,LOC_REFERENCE,OS_ADDR,sizeof(pint));
+ location_reset_ref(exceptvarsym.localloc,LOC_REFERENCE,OS_ADDR,sizeof(pint),[]);
tg.GetLocal(current_asmdata.CurrAsmList,sizeof(pint),exceptvarsym.vardef,exceptvarsym.localloc.reference);
prev_except_loc:=current_except_loc;
current_except_loc:=exceptvarsym.localloc;
diff --git a/compiler/jvm/njvmld.pas b/compiler/jvm/njvmld.pas
index 0b576f0eda..4707d6d96a 100644
--- a/compiler/jvm/njvmld.pas
+++ b/compiler/jvm/njvmld.pas
@@ -259,7 +259,7 @@ procedure tjvmloadnode.pass_generate_code;
{ in case of nested access, load address of field in nestedfpstruct }
if assigned(left) then
generate_nested_access(tabstractnormalvarsym(symtableentry));
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),4);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),4,[]);
location.reference.arrayreftype:=art_indexconst;
location.reference.base:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
location.reference.indexoffset:=0;
@@ -288,7 +288,7 @@ procedure tjvmarrayconstructornode.makearrayref(var ref: treference; eledef: tde
{ arrays are implicitly dereferenced }
basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,java_jlobject,java_jlobject,ref,basereg);
- reference_reset_base(ref,basereg,0,1);
+ reference_reset_base(ref,basereg,0,1,[]);
ref.arrayreftype:=art_indexconst;
ref.indexoffset:=0;
end;
diff --git a/compiler/jvm/njvmmem.pas b/compiler/jvm/njvmmem.pas
index 582eff4cbc..6f18c0481d 100644
--- a/compiler/jvm/njvmmem.pas
+++ b/compiler/jvm/njvmmem.pas
@@ -120,8 +120,8 @@ implementation
parameters stored in nestedfpstructs, and by programmers for any
kind of pointers) }
hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),4);
- reference_reset_base(location.reference,left.location.register,0,4);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),4,[]);
+ reference_reset_base(location.reference,left.location.register,0,4,[]);
location.reference.arrayreftype:=art_indexconst;
if (left.nodetype<>addrn) and
not(resultdef.typ in [orddef,floatdef]) and
@@ -431,9 +431,9 @@ implementation
secondpass(left);
newsize:=def_cgsize(resultdef);
if left.location.loc=LOC_CREFERENCE then
- location_reset_ref(location,LOC_CREFERENCE,newsize,left.location.reference.alignment)
+ location_reset_ref(location,LOC_CREFERENCE,newsize,left.location.reference.alignment,left.location.reference.volatility)
else
- location_reset_ref(location,LOC_REFERENCE,newsize,left.location.reference.alignment);
+ location_reset_ref(location,LOC_REFERENCE,newsize,left.location.reference.alignment,left.location.reference.volatility);
{ don't use left.resultdef, because it may be an open or regular array,
and then asking for the size doesn't make any sense }
hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,java_jlobject,java_jlobject,true);
diff --git a/compiler/llvm/hlcgllvm.pas b/compiler/llvm/hlcgllvm.pas
index 68b2778369..9d7d90543f 100644
--- a/compiler/llvm/hlcgllvm.pas
+++ b/compiler/llvm/hlcgllvm.pas
@@ -192,7 +192,7 @@ implementation
begin
{ on the LLVM target, every temp is independent and encoded via a
separate temp register whose superregister number is stored in p^.pos }
- reference_reset_base(ref,voidstackpointertype,newreg(R_TEMPREGISTER,p^.pos,R_SUBWHOLE),0,p^.alignment);
+ reference_reset_base(ref,voidstackpointertype,newreg(R_TEMPREGISTER,p^.pos,R_SUBWHOLE),0,p^.alignment,[]);
end;
@@ -252,7 +252,7 @@ implementation
begin
if assigned(location^.next) then
internalerror(2010052906);
- reference_reset_base(ref,cpointerdef.getreusable(size),location^.reference.index,location^.reference.offset,newalignment(cgpara.alignment,cgpara.intsize-sizeleft));
+ reference_reset_base(ref,cpointerdef.getreusable(size),location^.reference.index,location^.reference.offset,newalignment(cgpara.alignment,cgpara.intsize-sizeleft),[]);
if (def_cgsize(size)<>OS_NO) and
(size.size=sizeleft) and
(sizeleft<=sizeof(aint)) then
@@ -317,7 +317,7 @@ implementation
begin
reg:=getaddressregister(list,cpointerdef.getreusable(newrefsize));
a_loadaddr_ref_reg(list,refsize,cpointerdef.getreusable(newrefsize),initialref,reg);
- reference_reset_base(newref,cpointerdef.getreusable(newrefsize),reg,0,initialref.alignment);
+ reference_reset_base(newref,cpointerdef.getreusable(newrefsize),reg,0,initialref.alignment,initialref.volatility);
refsize:=newrefsize;
end
else
@@ -468,7 +468,7 @@ implementation
internalerror(2014012307)
else
begin
- reference_reset_base(href, cpointerdef.getreusable(callpara^.def), paraloc^.reference.index, paraloc^.reference.offset, paraloc^.def.alignment);
+ reference_reset_base(href, cpointerdef.getreusable(callpara^.def), paraloc^.reference.index, paraloc^.reference.offset, paraloc^.def.alignment, []);
res:=getregisterfordef(list, paraloc^.def);
load_ref_anyreg(callpara^.def, href, res, callpara);
end;
@@ -621,7 +621,7 @@ implementation
{ typecast pointer to memory into pointer to integer type }
hreg:=getaddressregister(list,cpointerdef.getreusable(tosize));
a_loadaddr_ref_reg(list,fromsize,cpointerdef.getreusable(tosize),tmpref,hreg);
- reference_reset_base(sref,cpointerdef.getreusable(tosize),hreg,0,tmpref.alignment);
+ reference_reset_base(sref,cpointerdef.getreusable(tosize),hreg,0,tmpref.alignment,tmpref.volatility);
{ load the integer from the temp into the destination }
a_load_ref_ref(list,tosize,tosize,sref,ref);
tg.ungettemp(list,tmpref);
@@ -643,7 +643,7 @@ implementation
begin
hreg2:=getaddressregister(list,cpointerdef.getreusable(fromsize));
a_loadaddr_ref_reg(list,tosize,cpointerdef.getreusable(fromsize),sref,hreg2);
- reference_reset_base(sref,cpointerdef.getreusable(fromsize),hreg2,0,sref.alignment);
+ reference_reset_base(sref,cpointerdef.getreusable(fromsize),hreg2,0,sref.alignment,sref.volatility);
tosize:=fromsize;
end;
end
@@ -1418,7 +1418,7 @@ implementation
begin
hreg:=getaddressregister(list,todef);
a_loadaddr_ref_reg_intern(list,fromdef,todef,ref,hreg,false);
- reference_reset_base(ref,todef,hreg,0,ref.alignment);
+ reference_reset_base(ref,todef,hreg,0,ref.alignment,ref.volatility);
end;
@@ -1455,7 +1455,7 @@ implementation
subscriptdef:=cpointerdef.getreusable(currentstructdef);
{ recurse into the first field }
list.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,subscriptdef,recref,s32inttype,0,true));
- reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,newalignment(recref.alignment,field.fieldoffset));
+ reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,newalignment(recref.alignment,field.fieldoffset),recref.volatility);
{ go to the parent }
currentstructdef:=parentdef;
end;
@@ -1469,7 +1469,7 @@ implementation
newbase:=getaddressregister(list,cpointerdef.getreusable(llvmfield.def));
recref:=make_simple_ref(list,recref,recdef);
list.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,subscriptdef,recref,s32inttype,field.llvmfieldnr,true));
- reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,newalignment(recref.alignment,llvmfield.fieldoffset+field.offsetfromllvmfield));
+ reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,newalignment(recref.alignment,llvmfield.fieldoffset+field.offsetfromllvmfield),recref.volatility);
{ in case of an 80 bits extended type, typecast from an array of 10
bytes (used because otherwise llvm will allocate the ABI-defined
size for extended, which is usually larger) into an extended }
@@ -1676,7 +1676,7 @@ implementation
begin
hreg:=getaddressregister(list,cpointerdef.getreusable(llvmparadef));
a_loadaddr_ref_reg(list,vardef,cpointerdef.getreusable(llvmparadef),destloc.reference,hreg);
- reference_reset_base(href,cpointerdef.getreusable(llvmparadef),hreg,0,destloc.reference.alignment);
+ reference_reset_base(href,cpointerdef.getreusable(llvmparadef),hreg,0,destloc.reference.alignment,destloc.reference.volatility);
end;
index:=0;
ploc:=para.location;
@@ -1846,11 +1846,11 @@ implementation
begin
ptrindex:=ref.offset div pointedsize;
if assigned(ref.symbol) then
- reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment)
+ reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment,ref.volatility)
else
- reference_reset_base(tmpref,ptrdef,ref.base,0,ref.alignment);
+ reference_reset_base(tmpref,ptrdef,ref.base,0,ref.alignment,ref.volatility);
list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg2,ptrdef,tmpref,ptruinttype,ptrindex,assigned(ref.symbol)));
- reference_reset_base(result,ptrdef,hreg2,0,ref.alignment);
+ reference_reset_base(result,ptrdef,hreg2,0,ref.alignment,ref.volatility);
exit;
end;
{ for now, perform all calculations using plain pointer arithmetic. Later
@@ -1865,7 +1865,7 @@ implementation
begin
if ref.base<>NR_NO then
internalerror(2012111301);
- reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment);
+ reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment,ref.volatility);
list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg1,ptrdef,tmpref,ptruinttype,0,true));
end
else if ref.base<>NR_NO then
@@ -1890,7 +1890,7 @@ implementation
end;
hreg2:=getaddressregister(list,ptrdef);
a_load_reg_reg(list,ptruinttype,ptrdef,hreg1,hreg2);
- reference_reset_base(result,ptrdef,hreg2,0,ref.alignment);
+ reference_reset_base(result,ptrdef,hreg2,0,ref.alignment,ref.volatility);
end;
@@ -1954,7 +1954,7 @@ implementation
case paraloc^.llvmloc.loc of
LOC_REFERENCE:
begin
- location_reset_ref(hloc,LOC_REFERENCE,def_cgsize(paraloc^.def),paraloc^.def.alignment);
+ location_reset_ref(hloc,LOC_REFERENCE,def_cgsize(paraloc^.def),paraloc^.def.alignment,[]);
hloc.reference.symbol:=paraloc^.llvmloc.sym;
if paraloc^.llvmvalueloc then
hloc.reference.refaddr:=addr_full;
@@ -1970,7 +1970,7 @@ implementation
begin
if getregtype(paraloc^.llvmloc.reg)<>R_TEMPREGISTER then
internalerror(2014011903);
- location_reset_ref(hloc,LOC_REFERENCE,def_cgsize(paraloc^.def),paraloc^.def.alignment);
+ location_reset_ref(hloc,LOC_REFERENCE,def_cgsize(paraloc^.def),paraloc^.def.alignment,[]);
hloc.reference.base:=paraloc^.llvmloc.reg;
end;
end;
@@ -2018,7 +2018,7 @@ implementation
if vs.paraloc[calleeside].location^.llvmloc.loc<>LOC_REFERENCE then
internalerror(2014010708);
parasym:=vs.paraloc[calleeside].location^.llvmloc.sym;
- reference_reset_symbol(vs.initialloc.reference,parasym,0,vs.paraloc[calleeside].alignment);
+ reference_reset_symbol(vs.initialloc.reference,parasym,0,vs.paraloc[calleeside].alignment,[]);
if vs.paraloc[calleeside].location^.llvmvalueloc then
vs.initialloc.reference.refaddr:=addr_full;
end;
diff --git a/compiler/llvm/nllvmcnv.pas b/compiler/llvm/nllvmcnv.pas
index 40023e961a..3f41308818 100644
--- a/compiler/llvm/nllvmcnv.pas
+++ b/compiler/llvm/nllvmcnv.pas
@@ -122,7 +122,7 @@ procedure tllvmtypeconvnode.second_pointer_to_array;
{ insert type conversion }
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef));
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,tpointerdef(left.resultdef).pointeddef,cpointerdef.getreusable(resultdef),location.reference,hreg);
- reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+ reference_reset_base(location.reference,hreg,0,location.reference.alignment,location.reference.volatility);
end;
@@ -168,7 +168,7 @@ procedure tllvmtypeconvnode.second_nil_to_methodprocvar;
href: treference;
begin
tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,href);
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),href.alignment);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),href.alignment,href.volatility);
location.reference:=href;
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef),cpointerdef.getreusable(methodpointertype),href);
hlcg.g_load_const_field_by_name(current_asmdata.CurrAsmList,trecorddef(methodpointertype),0,'proc',href);
@@ -241,8 +241,8 @@ procedure tllvmtypeconvnode.second_nothing;
hlcg.location_force_mem(current_asmdata.CurrAsmList,left.location,left.resultdef);
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef));
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,cpointerdef.getreusable(resultdef),left.location.reference,hreg);
- location_reset_ref(location,left.location.loc,left.location.size,left.location.reference.alignment);
- reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+ location_reset_ref(location,left.location.loc,left.location.size,left.location.reference.alignment,left.location.reference.volatility);
+ reference_reset_base(location.reference,hreg,0,location.reference.alignment,location.reference.volatility);
end
else
location_copy(location,left.location);
diff --git a/compiler/llvm/nllvmcon.pas b/compiler/llvm/nllvmcon.pas
index 89d6e40668..3e6f90b206 100644
--- a/compiler/llvm/nllvmcon.pas
+++ b/compiler/llvm/nllvmcon.pas
@@ -86,7 +86,7 @@ implementation
resptrdef:=cpointerdef.getreusable(resultdef);
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resptrdef);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,datadef,resptrdef,location.reference,hreg);
- hlcg.reference_reset_base(location.reference,resptrdef,hreg,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,resptrdef,hreg,0,location.reference.alignment,location.reference.volatility);
end;
end;
@@ -125,7 +125,7 @@ implementation
dataptrdef:=cpointerdef.getreusable(field.vardef);
{ load the address of the string data }
reg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,dataptrdef);
- reference_reset_symbol(href,lab_str,0,const_align(strpointerdef.size));
+ reference_reset_symbol(href,lab_str,0,const_align(strpointerdef.size),[]);
current_asmdata.CurrAsmList.concat(
taillvm.getelementptr_reg_size_ref_size_const(reg,cpointerdef.getreusable(strrecdef),href,
s32inttype,field.llvmfieldnr,true));
diff --git a/compiler/llvm/nllvminl.pas b/compiler/llvm/nllvminl.pas
index a79e1ebc5b..a12fc514e0 100644
--- a/compiler/llvm/nllvminl.pas
+++ b/compiler/llvm/nllvminl.pas
@@ -140,10 +140,10 @@ implementation
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
internalerror(2014080806);
{ typecast the shortstring reference into a length byte reference }
- location_reset_ref(location,left.location.loc,def_cgsize(resultdef),left.location.reference.alignment);
+ location_reset_ref(location,left.location.loc,def_cgsize(resultdef),left.location.reference.alignment,left.location.reference.volatility);
hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef));
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,cpointerdef.getreusable(resultdef),left.location.reference,hregister);
- hlcg.reference_reset_base(location.reference,cpointerdef.getreusable(resultdef),hregister,0,left.location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,cpointerdef.getreusable(resultdef),hregister,0,left.location.reference.alignment,left.location.reference.volatility);
end
else
begin
@@ -159,7 +159,9 @@ implementation
current_asmdata.getjumplabel(nillab);
current_asmdata.getjumplabel(lengthlab);
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,cpointerdef.getreusable(lendef),OC_EQ,0,left.location.register,nillab);
- hlcg.reference_reset_base(href,cpointerdef.getreusable(lendef),left.location.register,-lendef.size,lendef.alignment);
+ { volatility of the ansistring/widestring refers to the volatility of the
+ string pointer, not of the string data }
+ hlcg.reference_reset_base(href,cpointerdef.getreusable(lendef),left.location.register,-lendef.size,lendef.alignment,[]);
hregister:=hlcg.getintregister(current_asmdata.CurrAsmList,resultdef);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,lendef,resultdef,href,hregister);
if is_widestring(left.resultdef) then
diff --git a/compiler/llvm/nllvmld.pas b/compiler/llvm/nllvmld.pas
index 7a60cb0fb5..684bd91d24 100644
--- a/compiler/llvm/nllvmld.pas
+++ b/compiler/llvm/nllvmld.pas
@@ -117,7 +117,7 @@ procedure tllvmloadnode.pass_generate_code;
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,cpointerdef.getreusable(pvdef),cpointerdef.getreusable(methodpointertype),mpref);
hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,cprocvardef.getreusableprocaddr(procdef),trecorddef(methodpointertype),procreg,'proc',mpref);
hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,selfdef,trecorddef(methodpointertype),selfreg,'self',mpref);
- location_reset_ref(location,LOC_REFERENCE,location.size,href.alignment);
+ location_reset_ref(location,LOC_REFERENCE,location.size,href.alignment,href.volatility);
location.reference:=href;
end;
end;
diff --git a/compiler/llvm/nllvmmem.pas b/compiler/llvm/nllvmmem.pas
index 096382ee54..eb02b34854 100644
--- a/compiler/llvm/nllvmmem.pas
+++ b/compiler/llvm/nllvmmem.pas
@@ -88,7 +88,7 @@ implementation
left.resultdef,
cpointerdef.getreusable(fielddef),
location.reference,newbase);
- reference_reset_base(location.reference,newbase,0,location.reference.alignment);
+ reference_reset_base(location.reference,newbase,0,location.reference.alignment,location.reference.volatility);
result:=false;
end
else
@@ -157,7 +157,7 @@ implementation
else
current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,left.resultdef,
locref^,ptruinttype,constarrayoffset,false));
- reference_reset_base(locref^,hreg,0,locref^.alignment);
+ reference_reset_base(locref^,hreg,0,locref^.alignment,locref^.volatility);
end;
{ see comment in getarrelementptrdef }
@@ -216,7 +216,7 @@ implementation
{ the array is already a pointer -> just index }
current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,left.resultdef,
location.reference,ptruinttype,maybe_const_reg,false));
- reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+ reference_reset_base(location.reference,hreg,0,location.reference.alignment,location.reference.volatility);
location.reference.alignment:=newalignment(location.reference.alignment,l);
end;
@@ -278,7 +278,7 @@ implementation
current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(basereg,cpointerdef.getreusable(left.resultdef),
sref.ref,ptruinttype,offsetreg,true));
arraytopointerconverted:=true;
- reference_reset_base(sref.ref,basereg,0,sref.ref.alignment);
+ reference_reset_base(sref.ref,basereg,0,sref.ref.alignment,sref.ref.volatility);
{ calculate the bit index inside that chunk: mask out
the chunk index part }
hreg2:=hlcg.getintregister(current_asmdata.CurrAsmList,ptruinttype);
diff --git a/compiler/llvm/tgllvm.pas b/compiler/llvm/tgllvm.pas
index 48ee213218..3463173565 100644
--- a/compiler/llvm/tgllvm.pas
+++ b/compiler/llvm/tgllvm.pas
@@ -91,7 +91,7 @@ implementation
tl: ptemprecord;
oldfileinfo: tfileposinfo;
begin
- reference_reset_base(ref,cg.gettempregister(list),0,alignment);
+ reference_reset_base(ref,cg.gettempregister(list),0,alignment,[]);
new(tl);
tl^.temptype:=temptype;
diff --git a/compiler/m68k/aoptcpu.pas b/compiler/m68k/aoptcpu.pas
index 742662de22..1a504495fa 100644
--- a/compiler/m68k/aoptcpu.pas
+++ b/compiler/m68k/aoptcpu.pas
@@ -288,9 +288,9 @@ unit aoptcpu;
begin
DebugMsg('Optimizer: SUB/ADD #val,Ax to LEA val(Ax),Ax',p);
if taicpu(p).opcode in [A_SUB,A_SUBA] then
- reference_reset_base(tmpref,taicpu(p).oper[1]^.reg,-taicpu(p).oper[0]^.val,0)
+ reference_reset_base(tmpref,taicpu(p).oper[1]^.reg,-taicpu(p).oper[0]^.val,0,[])
else
- reference_reset_base(tmpref,taicpu(p).oper[1]^.reg,taicpu(p).oper[0]^.val,0);
+ reference_reset_base(tmpref,taicpu(p).oper[1]^.reg,taicpu(p).oper[0]^.val,0,[]);
taicpu(p).opcode:=A_LEA;
taicpu(p).loadref(0,tmpref);
result:=true;
diff --git a/compiler/m68k/cgcpu.pas b/compiler/m68k/cgcpu.pas
index 448368d198..2bc16699c9 100644
--- a/compiler/m68k/cgcpu.pas
+++ b/compiler/m68k/cgcpu.pas
@@ -301,7 +301,7 @@ unit cgcpu;
else
pushsize:=int_cgsize(cgpara.alignment);
- reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment);
+ reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment, []);
ref.direction := dir_dec;
list.concat(taicpu.op_reg_ref(A_MOVE,tcgsize2opsize[pushsize],makeregsize(list,r,pushsize),ref));
end
@@ -323,7 +323,7 @@ unit cgcpu;
else
pushsize:=int_cgsize(cgpara.alignment);
- reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment);
+ reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment, []);
ref.direction := dir_dec;
a_load_const_ref(list, pushsize, a, ref);
end
@@ -364,7 +364,7 @@ unit cgcpu;
else
pushsize:=int_cgsize(cgpara.alignment);
- reference_reset_base(ref, NR_STACK_POINTER_REG, 0, tcgsize2size[pushsize]);
+ reference_reset_base(ref, NR_STACK_POINTER_REG, 0, tcgsize2size[pushsize], []);
ref.direction := dir_dec;
a_load_ref_ref(list,int_cgsize(tcgsize2size[paraloc^.size]),pushsize,href,ref);
@@ -384,7 +384,7 @@ unit cgcpu;
cgpara.check_simple_location;
len:=align(cgpara.intsize,cgpara.alignment);
g_stackpointer_alloc(list,len);
- reference_reset_base(href,NR_STACK_POINTER_REG,0,cgpara.alignment);
+ reference_reset_base(href,NR_STACK_POINTER_REG,0,cgpara.alignment,[]);
g_concatcopy(list,r,href,len);
end
else
@@ -439,7 +439,7 @@ unit cgcpu;
//list.concat(tai_comment.create(strpnew('fixref: symbol with base or index')));
hreg:=getaddressregister(list);
- reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment);
+ reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment,ref.volatility);
list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
ref.offset:=0;
ref.symbol:=nil;
@@ -469,7 +469,7 @@ unit cgcpu;
begin
//list.concat(tai_comment.create(strpnew('fixref: base is dX, resolving with reverse regs')));
- reference_reset_base(href,ref.index,0,ref.alignment);
+ reference_reset_base(href,ref.index,0,ref.alignment,ref.volatility);
href.index:=ref.base;
{ we can fold in an 8 bit offset "for free" }
if isvalue8bit(ref.offset) then
@@ -507,7 +507,7 @@ unit cgcpu;
if isvalue16bit(ref.offset) then
begin
- reference_reset_base(href,ref.base,ref.offset,ref.alignment);
+ reference_reset_base(href,ref.base,ref.offset,ref.alignment,ref.volatility);
list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
end
else
@@ -622,13 +622,13 @@ unit cgcpu;
if isaddressregister(reg) then
begin
{ if we have an address register, we can jump to the address directly }
- reference_reset_base(tmpref,reg,0,4);
+ reference_reset_base(tmpref,reg,0,4,[]);
end
else
begin
{ if we have a data register, we need to move it to an address register first }
tmpreg:=getaddressregister(list);
- reference_reset_base(tmpref,tmpreg,0,4);
+ reference_reset_base(tmpref,tmpreg,0,4,[]);
instr:=taicpu.op_reg_reg(A_MOVE,S_L,reg,tmpreg);
add_move_instruction(instr);
list.concat(instr);
@@ -797,7 +797,7 @@ unit cgcpu;
tmpref:=ref;
inc(tmpref.offset,tcgsize2size[tosize]-1);
a_loadaddr_ref_reg(list,tmpref,tmpreg2);
- reference_reset_base(tmpref,tmpreg2,0,1);
+ reference_reset_base(tmpref,tmpreg2,0,1,ref.volatility);
tmpref.direction:=dir_none;
tmpreg:=getintregister(list,tosize);
@@ -976,7 +976,7 @@ unit cgcpu;
tmpreg2:=getaddressregister(list);
a_loadaddr_ref_reg(list,ref,tmpreg2);
- reference_reset_base(tmpref,tmpreg2,0,1);
+ reference_reset_base(tmpref,tmpreg2,0,1,ref.volatility);
tmpref.direction:=dir_inc;
if isaddressregister(register) then
@@ -1069,7 +1069,7 @@ unit cgcpu;
if use_push(cgpara) and (current_settings.fputype in [fpu_68881,fpu_coldfire]) then
begin
cgpara.check_simple_location;
- reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment);
+ reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment, []);
ref.direction := dir_dec;
list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],reg,ref));
end
@@ -1104,7 +1104,7 @@ unit cgcpu;
{ fmove can't do <ea> -> <ea>, so move it to an fpreg first }
freg:=getfpuregister(list,size);
a_loadfpu_ref_reg(list,size,size,ref,freg);
- reference_reset_base(href, NR_STACK_POINTER_REG, 0, cgpara.alignment);
+ reference_reset_base(href, NR_STACK_POINTER_REG, 0, cgpara.alignment, []);
href.direction := dir_dec;
list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],freg,href));
end
@@ -1703,12 +1703,12 @@ unit cgcpu;
hregister := getintregister(list,OS_INT);
iregister:=getaddressregister(list);
- reference_reset_base(srcref,iregister,0,source.alignment);
+ reference_reset_base(srcref,iregister,0,source.alignment,source.volatility);
srcrefp:=srcref;
srcrefp.direction := dir_inc;
jregister:=getaddressregister(list);
- reference_reset_base(dstref,jregister,0,dest.alignment);
+ reference_reset_base(dstref,jregister,0,dest.alignment,dest.volatility);
dstrefp:=dstref;
dstrefp.direction := dir_inc;
@@ -1860,7 +1860,7 @@ unit cgcpu;
hregister:=NR_A0;
cg.a_reg_alloc(list,hregister);
- reference_reset_base(ref,NR_STACK_POINTER_REG,0,4);
+ reference_reset_base(ref,NR_STACK_POINTER_REG,0,4,[]);
list.concat(taicpu.op_ref_reg(A_MOVE,S_L,ref,hregister));
{ instead of using a postincrement above (which also writes the }
@@ -1875,11 +1875,11 @@ unit cgcpu;
list.concat(taicpu.op_const_reg(A_ADDQ,S_L,parasize,r))
else { nope ... }
begin
- reference_reset_base(ref2,NR_STACK_POINTER_REG,parasize,4);
+ reference_reset_base(ref2,NR_STACK_POINTER_REG,parasize,4,[]);
list.concat(taicpu.op_ref_reg(A_LEA,S_NO,ref2,r));
end;
- reference_reset_base(ref,hregister,0,4);
+ reference_reset_base(ref,hregister,0,4,[]);
list.concat(taicpu.op_ref(A_JMP,S_NO,ref));
end;
end
@@ -1979,7 +1979,7 @@ unit cgcpu;
begin
list.concat(taicpu.op_reg_reg(A_MOVE,S_L,href.base,NR_A0));
list.concat(taicpu.op_const_reg(A_ADDA,S_L,href.offset,NR_A0));
- reference_reset_base(href,NR_A0,0,sizeof(pint));
+ reference_reset_base(href,NR_A0,0,sizeof(pint),[]);
end;
if size > 0 then
@@ -2067,7 +2067,7 @@ unit cgcpu;
begin
list.concat(taicpu.op_reg_reg(A_MOVE,S_L,href.base,NR_A0));
list.concat(taicpu.op_const_reg(A_ADDA,S_L,href.offset,NR_A0));
- reference_reset_base(href,NR_A0,0,sizeof(pint));
+ reference_reset_base(href,NR_A0,0,sizeof(pint),[]);
end;
if size > 0 then
@@ -2234,7 +2234,7 @@ unit cgcpu;
begin
{ offset in the wrapper needs to be adjusted for the stored
return address }
- reference_reset_base(href,reference.index,reference.offset+sizeof(pint),sizeof(pint));
+ reference_reset_base(href,reference.index,reference.offset+sizeof(pint),sizeof(pint),[]);
{ plain 68k could use SUBI on href directly, but this way it works on Coldfire too
and it's probably smaller code for the majority of cases (if ioffset small, the
load will use MOVEQ) (KB) }
diff --git a/compiler/m68k/hlcgcpu.pas b/compiler/m68k/hlcgcpu.pas
index baa2663e38..6ea7f4eb16 100644
--- a/compiler/m68k/hlcgcpu.pas
+++ b/compiler/m68k/hlcgcpu.pas
@@ -126,7 +126,7 @@ implementation
selfoffsetfromsp:=sizeof(aint)
else
selfoffsetfromsp:=0;
- reference_reset_base(href, voidstackpointertype, NR_SP,selfoffsetfromsp+offs,4);
+ reference_reset_base(href, voidstackpointertype, NR_SP,selfoffsetfromsp+offs,4,[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_A0);
end;
@@ -135,7 +135,7 @@ implementation
href : treference;
begin
{ move.l (%a0),%a0 ; load vmt}
- reference_reset_base(href, voidpointertype, NR_A0,0,4);
+ reference_reset_base(href, voidpointertype, NR_A0,0,4,[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_A0);
end;
@@ -145,9 +145,9 @@ implementation
begin
if (procdef.extnumber=$ffff) then
Internalerror(2013100701);
- reference_reset_base(href,voidpointertype,NR_A0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4);
+ reference_reset_base(href,voidpointertype,NR_A0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4,[]);
list.concat(taicpu.op_ref_reg(A_MOVE,S_L,href,NR_A0));
- reference_reset_base(href,voidpointertype,NR_A0,0,4);
+ reference_reset_base(href,voidpointertype,NR_A0,0,4,[]);
list.concat(taicpu.op_ref(A_JMP,S_NO,href));
end;
diff --git a/compiler/m68k/n68kcal.pas b/compiler/m68k/n68kcal.pas
index bf6bcc1443..bd5f6219c0 100644
--- a/compiler/m68k/n68kcal.pas
+++ b/compiler/m68k/n68kcal.pas
@@ -74,7 +74,7 @@ implementation
begin
if po_syscall in tprocdef(procdefinition).procoptions then
begin
- reference_reset_base(tmpref,NR_SP,0,2);
+ reference_reset_base(tmpref,NR_SP,0,2,[]);
tmpref.direction:=dir_dec;
current_asmdata.CurrAsmList.concat(taicpu.op_const_ref(A_MOVE,S_W,tprocdef(procdefinition).import_nr,tmpref));
current_asmdata.CurrAsmList.concat(taicpu.op_const(A_TRAP,S_NO,tprocdef(procdefinition).extnumber));
@@ -92,7 +92,7 @@ implementation
not used as FP on Amiga any more (we use A5), so we don't need to
save it. (KB)
http://amigadev.elowar.com/read/ADCD_2.1/Libraries_Manual_guide/node0290.html }
- reference_reset_base(tmpref,NR_A6,-tprocdef(procdefinition).extnumber,4);
+ reference_reset_base(tmpref,NR_A6,-tprocdef(procdefinition).extnumber,4,[]);
current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_JSR,S_NO,tmpref));
end
else
diff --git a/compiler/m68k/n68kmem.pas b/compiler/m68k/n68kmem.pas
index af702b850d..914e577c95 100644
--- a/compiler/m68k/n68kmem.pas
+++ b/compiler/m68k/n68kmem.pas
@@ -112,7 +112,7 @@ implementation
begin
hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
- reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+ reference_reset_base(location.reference,hreg,0,location.reference.alignment,location.reference.volatility);
{ insert new index register }
location.reference.index:=maybe_const_reg;
if (scaled) then
diff --git a/compiler/m68k/rgcpu.pas b/compiler/m68k/rgcpu.pas
index 0d3fc2d74d..9b7f981c3c 100644
--- a/compiler/m68k/rgcpu.pas
+++ b/compiler/m68k/rgcpu.pas
@@ -73,7 +73,7 @@ unit rgcpu;
{$endif}
helplist.concat(taicpu.op_const_reg(A_MOVE,S_L,spilltemp.offset,hreg));
- reference_reset_base(tmpref,spilltemp.base,0,sizeof(aint));
+ reference_reset_base(tmpref,spilltemp.base,0,sizeof(aint),[]);
tmpref.index:=hreg;
helpins:=spilling_create_load(tmpref,tempreg);
@@ -105,7 +105,7 @@ unit rgcpu;
{$endif}
helplist.concat(taicpu.op_const_reg(A_MOVE,S_L,spilltemp.offset,hreg));
- reference_reset_base(tmpref,spilltemp.base,0,sizeof(aint));
+ reference_reset_base(tmpref,spilltemp.base,0,sizeof(aint),[]);
tmpref.index:=hreg;
helplist.concat(spilling_create_store(tempreg,tmpref));
diff --git a/compiler/mips/cgcpu.pas b/compiler/mips/cgcpu.pas
index 8365957615..32bbb02d84 100644
--- a/compiler/mips/cgcpu.pas
+++ b/compiler/mips/cgcpu.pas
@@ -162,7 +162,7 @@ begin
if assigned(ref.symbol) then
begin
ref.base:=getintregister(list,OS_ADDR);
- reference_reset_symbol(tmpref,ref.symbol,ref.offset,ref.alignment);
+ reference_reset_symbol(tmpref,ref.symbol,ref.offset,ref.alignment,ref.volatility);
if (cs_create_pic in current_settings.moduleswitches) then
begin
if not (pi_needs_got in current_procinfo.flags) then
@@ -320,7 +320,7 @@ begin
LOC_REFERENCE:
begin
paraloc.check_simple_location;
- reference_reset_base(href2,paraloc.location^.reference.index,paraloc.location^.reference.offset,paraloc.alignment);
+ reference_reset_base(href2,paraloc.location^.reference.index,paraloc.location^.reference.offset,paraloc.alignment,[]);
{ concatcopy should choose the best way to copy the data }
g_concatcopy(list,ref,href2,tcgsize2size[size]);
end;
@@ -353,7 +353,7 @@ procedure TCGMIPS.a_call_sym_pic(list: tasmlist; sym: tasmsymbol);
var
href: treference;
begin
- reference_reset_symbol(href,sym,0,sizeof(aint));
+ reference_reset_symbol(href,sym,0,sizeof(aint),[]);
if (sym.bind=AB_LOCAL) then
href.refaddr:=addr_pic
else
@@ -608,7 +608,7 @@ begin
exit;
end;
- reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment);
+ reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment,ref.volatility);
if (cs_create_pic in current_settings.moduleswitches) then
begin
if not (pi_needs_got in current_procinfo.flags) then
@@ -1275,7 +1275,7 @@ begin
helplist:=TAsmList.Create;
- reference_reset(href,0);
+ reference_reset(href,0,[]);
href.base:=NR_STACK_POINTER_REG;
fmask:=0;
@@ -1419,7 +1419,7 @@ begin
begin
if TMIPSProcinfo(current_procinfo).save_gp_ref.offset<>0 then
tg.ungettemp(list,TMIPSProcinfo(current_procinfo).save_gp_ref);
- reference_reset(href,0);
+ reference_reset(href,0,[]);
href.base:=NR_STACK_POINTER_REG;
nextoffset:=TMIPSProcInfo(current_procinfo).floatregstart;
@@ -1537,7 +1537,7 @@ begin
src:=source
else
begin
- reference_reset(src,sizeof(aint));
+ reference_reset(src,sizeof(aint),source.volatility);
{ load the address of source into src.base }
src.base := GetAddressRegister(list);
a_loadaddr_ref_reg(list, Source, src.base);
@@ -1546,7 +1546,7 @@ begin
dst:=dest
else
begin
- reference_reset(dst,sizeof(aint));
+ reference_reset(dst,sizeof(aint),dest.volatility);
{ load the address of dest into dst.base }
dst.base := GetAddressRegister(list);
a_loadaddr_ref_reg(list, dest, dst.base);
@@ -1622,8 +1622,8 @@ begin
g_concatcopy_move(list, Source, dest, len)
else
begin
- reference_reset(src,sizeof(aint));
- reference_reset(dst,sizeof(aint));
+ reference_reset(src,sizeof(aint),source.volatility);
+ reference_reset(dst,sizeof(aint),dest.volatility);
{ load the address of source into src.base }
src.base := GetAddressRegister(list);
a_loadaddr_ref_reg(list, Source, src.base);
@@ -1667,7 +1667,7 @@ procedure TCGMIPS.g_profilecode(list:TAsmList);
begin
if not (cs_create_pic in current_settings.moduleswitches) then
begin
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol('_gp',AT_DATA),0,sizeof(pint));
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol('_gp',AT_DATA),0,sizeof(pint),[]);
a_loadaddr_ref_reg(list,href,NR_GP);
end;
list.concat(taicpu.op_reg_reg(A_MOVE,NR_R1,NR_RA));
diff --git a/compiler/mips/hlcgcpu.pas b/compiler/mips/hlcgcpu.pas
index 8eca1d924a..48ca385cf4 100644
--- a/compiler/mips/hlcgcpu.pas
+++ b/compiler/mips/hlcgcpu.pas
@@ -75,7 +75,7 @@ implementation
begin
if not (cs_create_pic in current_settings.moduleswitches) then
begin
- reference_reset_symbol(ref,current_asmdata.RefAsmSymbol('_gp',AT_DATA),0,sizeof(aint));
+ reference_reset_symbol(ref,current_asmdata.RefAsmSymbol('_gp',AT_DATA),0,sizeof(aint),[]);
list.concat(tai_comment.create(strpnew('Using PIC code for a_call_name')));
cg.a_loadaddr_ref_reg(list,ref,NR_GP);
end;
@@ -152,7 +152,7 @@ implementation
var
href: treference;
begin
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(externalname,AT_DATA),0,sizeof(aint));
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(externalname,AT_DATA),0,sizeof(aint),[]);
{ Always do indirect jump using $t9, it won't harm in non-PIC mode }
if (cs_create_pic in current_settings.moduleswitches) then
begin
@@ -245,7 +245,7 @@ implementation
if IsVirtual then
begin
{ load VMT pointer }
- reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(aint));
+ reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(aint),[]);
list.concat(taicpu.op_reg_ref(A_LW,NR_VMT,href));
if (procdef.extnumber=$ffff) then
@@ -253,7 +253,7 @@ implementation
{ TODO: case of large VMT is not handled }
{ We have no reason not to use $t9 even in non-PIC mode. }
- reference_reset_base(href, voidpointertype, NR_VMT, tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber), sizeof(aint));
+ reference_reset_base(href, voidpointertype, NR_VMT, tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber), sizeof(aint), []);
list.concat(taicpu.op_reg_ref(A_LW,NR_PIC_FUNC,href));
list.concat(taicpu.op_reg(A_JR, NR_PIC_FUNC));
end
@@ -262,7 +262,7 @@ implementation
else
begin
{ GAS does not expand "J symbol" into PIC sequence }
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname,AT_FUNCTION),0,sizeof(pint));
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname,AT_FUNCTION),0,sizeof(pint),[]);
href.base:=NR_GP;
href.refaddr:=addr_pic_call16;
list.concat(taicpu.op_reg_ref(A_LW,NR_PIC_FUNC,href));
diff --git a/compiler/mips/ncpucnv.pas b/compiler/mips/ncpucnv.pas
index fb928972be..ca85bd532f 100644
--- a/compiler/mips/ncpucnv.pas
+++ b/compiler/mips/ncpucnv.pas
@@ -155,7 +155,7 @@ begin
begin
current_asmdata.getglobaldatalabel(l1);
current_asmdata.getjumplabel(l2);
- reference_reset_symbol(href, l1, 0, sizeof(aint));
+ reference_reset_symbol(href, l1, 0, sizeof(aint), []);
hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
{ Always load into 64-bit FPU register }
diff --git a/compiler/mips/ncpuset.pas b/compiler/mips/ncpuset.pas
index c93e88949a..fb4839ff57 100644
--- a/compiler/mips/ncpuset.pas
+++ b/compiler/mips/ncpuset.pas
@@ -105,7 +105,7 @@ begin
indexreg := cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_ADDR, 2, hregister, indexreg);
{ create reference }
- reference_reset_symbol(href, table, 0, sizeof(aint));
+ reference_reset_symbol(href, table, 0, sizeof(aint), []);
href.offset := (-aint(min_)) * 4;
href.base:=indexreg;
jmpreg := cg.getaddressregister(current_asmdata.CurrAsmList);
diff --git a/compiler/mips/rgcpu.pas b/compiler/mips/rgcpu.pas
index 3f554b7e4e..f7d6d896fe 100644
--- a/compiler/mips/rgcpu.pas
+++ b/compiler/mips/rgcpu.pas
@@ -81,7 +81,7 @@ implementation
helplist.concat(taicpu.op_reg_reg_const(A_ORI,hreg,hreg,spilltemp.offset and $FFFF));
helplist.concat(taicpu.op_reg_reg_reg(A_ADDU,hreg,hreg,spilltemp.base));
- reference_reset_base(tmpref,hreg,0,sizeof(aint));
+ reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
helpins:=spilling_create_load(tmpref,tempreg);
helplist.concat(helpins);
@@ -112,7 +112,7 @@ implementation
helplist.concat(taicpu.op_reg_reg_const(A_ORI,hreg,hreg,spilltemp.offset and $FFFF));
helplist.concat(taicpu.op_reg_reg_reg(A_ADDU,hreg,hreg,spilltemp.base));
- reference_reset_base(tmpref,hreg,0,sizeof(aint));
+ reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
helplist.concat(spilling_create_store(tempreg,tmpref));
if getregtype(tempreg)=R_INTREGISTER then
diff --git a/compiler/ncgbas.pas b/compiler/ncgbas.pas
index cdcae4feb6..91e1e10ef5 100644
--- a/compiler/ncgbas.pas
+++ b/compiler/ncgbas.pas
@@ -160,7 +160,7 @@ interface
op.typ:=top_ref;
new(op.ref);
reference_reset_base(op.ref^,indexreg,sym.localloc.reference.offset+sofs,
- newalignment(sym.localloc.reference.alignment,sofs));
+ newalignment(sym.localloc.reference.alignment,sofs),[]);
end;
end
else
@@ -168,7 +168,7 @@ interface
op.typ:=top_ref;
new(op.ref);
reference_reset_base(op.ref^,sym.localloc.reference.base,sym.localloc.reference.offset+sofs,
- newalignment(sym.localloc.reference.alignment,sofs));
+ newalignment(sym.localloc.reference.alignment,sofs),[]);
op.ref^.index:=indexreg;
{$ifdef x86}
op.ref^.scalefactor:=scale;
@@ -186,7 +186,7 @@ interface
op.typ:=top_ref;
new(op.ref);
{ no idea about the actual alignment }
- reference_reset_base(op.ref^,sym.localloc.register,sofs,1);
+ reference_reset_base(op.ref^,sym.localloc.register,sofs,1,[]);
op.ref^.index:=indexreg;
{$ifdef x86}
op.ref^.scalefactor:=scale;
@@ -436,7 +436,7 @@ interface
if is_managed_type(tempinfo^.typedef) and
not(ti_const in tempflags) then
begin
- location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0);
+ location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0,[]);
tg.gethltempmanaged(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.temptype,tempinfo^.location.reference);
if not(ti_nofini in tempflags) then
hlcg.g_finalize(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.location.reference);
@@ -447,7 +447,7 @@ interface
end
else
begin
- location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0);
+ location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0,[]);
tg.gethltemp(current_asmdata.CurrAsmList,tempinfo^.typedef,size,tempinfo^.temptype,tempinfo^.location.reference);
end;
end;
diff --git a/compiler/ncgcal.pas b/compiler/ncgcal.pas
index 7a56009253..ddacb09a89 100644
--- a/compiler/ncgcal.pas
+++ b/compiler/ncgcal.pas
@@ -465,7 +465,7 @@ implementation
literaldef:=get_block_literal_type_for_proc(tabstractprocdef(right.resultdef));
hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,cpointerdef.getreusable(literaldef),true);
{ load the invoke pointer }
- hlcg.reference_reset_base(href,right.resultdef,right.location.register,0,right.resultdef.alignment);
+ hlcg.reference_reset_base(href,right.resultdef,right.location.register,0,right.resultdef.alignment,[]);
callprocdef:=cprocvardef.getreusableprocaddr(procdefinition);
toreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,callprocdef);
hlcg.g_load_field_reg_by_name(current_asmdata.CurrAsmList,literaldef,callprocdef,'INVOKE',href,toreg);
@@ -499,7 +499,7 @@ implementation
location_allocate_register(current_asmdata.CurrAsmList,location,realresdef,false)
else
begin
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(realresdef),0);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(realresdef),0,[]);
tg.gethltemp(current_asmdata.CurrAsmList,realresdef,retloc.intsize,tt_normal,location.reference);
end;
end;
@@ -763,12 +763,12 @@ implementation
((tmpparaloc^.loc<>LOC_REFERENCE) or
assigned(tmpparaloc^.next)) then
internalerror(200501281);
- reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset,calleralignment);
+ reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset,calleralignment,[]);
{ copy parameters in case they were moved to a temp. location because we've a fixed stack }
case tmpparaloc^.loc of
LOC_REFERENCE:
begin
- reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset,tmpalignment);
+ reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset,tmpalignment,[]);
{ use concatcopy, because it can also be a float which fails when
load_ref_ref is used }
if (ppn.tempcgpara.size <> OS_NO) then
diff --git a/compiler/ncgcnv.pas b/compiler/ncgcnv.pas
index d9d26b5ec1..6dca127543 100644
--- a/compiler/ncgcnv.pas
+++ b/compiler/ncgcnv.pas
@@ -316,7 +316,7 @@ interface
if tstringconstnode(left).len=0 then
begin
{ FPC_EMPTYCHAR is a widechar -> 2 bytes }
- reference_reset(hr,2);
+ reference_reset(hr,2,[]);
hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR',AT_DATA,needs_indirect);
current_module.add_extern_asmsym('FPC_EMPTYCHAR',AB_EXTERNAL,AT_DATA);
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resultdef);
@@ -370,8 +370,9 @@ interface
procedure tcgtypeconvnode.second_pointer_to_array;
begin
- { assume natural alignment }
- location_reset_ref(location,LOC_REFERENCE,OS_NO,resultdef.alignment);
+ { assume natural alignment, volatility of pointer has no effect on the volatility
+ of the data it points to }
+ location_reset_ref(location,LOC_REFERENCE,OS_NO,resultdef.alignment,[]);
case left.location.loc of
LOC_CREGISTER,
LOC_REGISTER :
@@ -385,7 +386,7 @@ interface
end
else
{$endif}
- hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment,location.reference.volatility);
end;
LOC_REFERENCE,
LOC_CREFERENCE,
@@ -396,7 +397,7 @@ interface
LOC_CSUBSETREF:
begin
hlcg.reference_reset_base(location.reference,left.resultdef,
- hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment);
+ hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment,[]);
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,
location.reference.base);
if left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
@@ -416,7 +417,7 @@ interface
var
tmpref: treference;
begin
- location_reset_ref(location,LOC_REFERENCE,OS_NO,2);
+ location_reset_ref(location,LOC_REFERENCE,OS_NO,2,[]);
case tstringdef(resultdef).stringtype of
st_shortstring :
begin
@@ -455,7 +456,7 @@ interface
{ round them down to the proper precision }
tg.gethltemp(current_asmdata.currasmlist,resultdef,resultdef.size,tt_normal,tr);
hlcg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.register,tr);
- location_reset_ref(left.location,LOC_REFERENCE,location.size,tr.alignment);
+ location_reset_ref(left.location,LOC_REFERENCE,location.size,tr.alignment,tr.volatility);
left.location.reference:=tr;
left.resultdef:=resultdef;
end;
@@ -596,7 +597,7 @@ interface
tmethodpointer record and set the "frame pointer" to nil }
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
internalerror(2013031503);
- location_reset_ref(location,LOC_REFERENCE,int_cgsize(resultdef.size),sizeof(pint));
+ location_reset_ref(location,LOC_REFERENCE,int_cgsize(resultdef.size),sizeof(pint),[]);
tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,location.reference);
href:=location.reference;
if is_nested_pd(tabstractprocdef(resultdef)) then
@@ -702,7 +703,7 @@ interface
left.location,location.register);
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,resultdef,OC_NE,0,location.register,l1);
{ FPC_EMPTYCHAR is a widechar -> 2 bytes }
- reference_reset(hr,2);
+ reference_reset(hr,2,[]);
hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR',AT_DATA,needs_indirect);
current_module.add_extern_asmsym('FPC_EMPTYCHAR',AB_EXTERNAL,AT_DATA);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,cwidechartype,resultdef,hr,location.register);
diff --git a/compiler/ncgcon.pas b/compiler/ncgcon.pas
index c69c38463d..6d67c746d9 100644
--- a/compiler/ncgcon.pas
+++ b/compiler/ncgcon.pas
@@ -111,7 +111,7 @@ implementation
{$endif ARM}
begin
- location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),const_align(resultdef.alignment));
+ location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),const_align(resultdef.alignment),[]);
lastlabel:=nil;
realait:=floattype2ait[tfloatdef(resultdef).floattype];
{$ifdef ARM}
@@ -393,7 +393,7 @@ implementation
end
else
begin
- location_reset_ref(location, LOC_CREFERENCE, def_cgsize(resultdef), const_align(strpointerdef.size));
+ location_reset_ref(location, LOC_CREFERENCE, def_cgsize(resultdef), const_align(strpointerdef.size), []);
location.reference.symbol:=lab_str;
end;
end;
@@ -405,7 +405,7 @@ implementation
begin
reference_reset_symbol(href, lab_str,
ctai_typedconstbuilder.get_string_symofs(tstringdef(resultdef).stringtype, winlikewidestring),
- const_align(strpointerdef.size));
+ const_align(strpointerdef.size),[]);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList, elementdef, strpointerdef, href, location.register)
end;
@@ -445,7 +445,7 @@ implementation
var
entry : PHashSetItem;
begin
- location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(8));
+ location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(8),[]);
{ const already used ? }
if not assigned(lab_set) then
begin
@@ -522,7 +522,7 @@ implementation
entry : PHashSetItem;
datatcb : ttai_typedconstbuilder;
begin
- location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(16));
+ location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(16),[]);
lastlabel:=nil;
{ const already used ? }
if not assigned(lab_set) then
diff --git a/compiler/ncgflw.pas b/compiler/ncgflw.pas
index cb9c6cb70f..c66154a06b 100644
--- a/compiler/ncgflw.pas
+++ b/compiler/ncgflw.pas
@@ -813,7 +813,7 @@ implementation
{ send the vmt parameter }
pd:=search_system_proc('fpc_catches');
- reference_reset_symbol(href2,current_asmdata.RefAsmSymbol(excepttype.vmt_mangledname,AT_DATA,indirect),0,sizeof(pint));
+ reference_reset_symbol(href2,current_asmdata.RefAsmSymbol(excepttype.vmt_mangledname,AT_DATA,indirect),0,sizeof(pint),[]);
if otherunit then
current_module.add_extern_asmsym(excepttype.vmt_mangledname,AB_EXTERNAL,AT_DATA);
paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
@@ -835,7 +835,7 @@ implementation
if assigned(exceptvarsym) then
begin
- location_reset_ref(exceptvarsym.localloc,LOC_REFERENCE,def_cgsize(voidpointertype),voidpointertype.alignment);
+ location_reset_ref(exceptvarsym.localloc,LOC_REFERENCE,def_cgsize(voidpointertype),voidpointertype.alignment,[]);
tg.GetLocal(current_asmdata.CurrAsmList,exceptvarsym.vardef.size,exceptvarsym.vardef,exceptvarsym.localloc.reference);
hlcg.a_load_reg_ref(current_asmdata.CurrAsmList,fpc_catches_res.def,exceptvarsym.vardef,fpc_catches_resloc.register,exceptvarsym.localloc.reference);
end;
diff --git a/compiler/ncginl.pas b/compiler/ncginl.pas
index 034d09a6ae..b5f86af02a 100644
--- a/compiler/ncginl.pas
+++ b/compiler/ncginl.pas
@@ -250,7 +250,9 @@ implementation
lendef:=u32inttype
else
lendef:=ossinttype;
- hlcg.reference_reset_base(href,left.resultdef,left.location.register,-lendef.size,lendef.alignment);
+ { volatility of the ansistring/widestring refers to the volatility of the
+ string pointer, not of the string data }
+ hlcg.reference_reset_base(href,left.resultdef,left.location.register,-lendef.size,lendef.alignment,[]);
{ if the string pointer is nil, the length is 0 -> reuse the register
that originally held the string pointer for the length, so that we
can keep the original nil/0 as length in that case }
@@ -601,7 +603,7 @@ implementation
end
else
begin
- location_reset_ref(location,LOC_REFERENCE,OS_ADDR,sizeof(pint));
+ location_reset_ref(location,LOC_REFERENCE,OS_ADDR,sizeof(pint),[]);
location.reference.base:=frame_reg;
end;
end;
@@ -614,14 +616,14 @@ implementation
begin
location_reset(location,LOC_REGISTER,OS_ADDR);
location.register:=cg.getaddressregister(current_asmdata.currasmlist);
- reference_reset_base(frame_ref,NR_STACK_POINTER_REG,{current_procinfo.calc_stackframe_size}tg.lasttemp,sizeof(pint));
+ reference_reset_base(frame_ref,NR_STACK_POINTER_REG,{current_procinfo.calc_stackframe_size}tg.lasttemp,sizeof(pint),[]);
cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
end
else
begin
location_reset(location,LOC_REGISTER,OS_ADDR);
location.register:=cg.getaddressregister(current_asmdata.currasmlist);
- reference_reset_base(frame_ref,current_procinfo.framepointer,sizeof(pint),sizeof(pint));
+ reference_reset_base(frame_ref,current_procinfo.framepointer,sizeof(pint),sizeof(pint),[]);
cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
end;
end;
diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas
index 53b550ec5e..8638e5cfaf 100644
--- a/compiler/ncgld.pas
+++ b/compiler/ncgld.pas
@@ -244,13 +244,14 @@ implementation
internalerror(200309286);
if lvs.localloc.loc<>LOC_REFERENCE then
internalerror(200409241);
- hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,lvs.localloc.reference.offset,lvs.localloc.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,lvs.localloc.reference.offset,lvs.localloc.reference.alignment,lvs.localloc.reference.volatility);
end;
procedure tcgloadnode.generate_absaddr_access(vs: tabsolutevarsym);
begin
location.reference.offset:=asizeint(vs.addroffset);
+ location.reference.volatility:=[vol_read,vol_write];
end;
@@ -276,9 +277,9 @@ implementation
begin
if gvs.localloc.loc=LOC_INVALID then
if not(vo_is_weak_external in gvs.varoptions) then
- reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,location.reference.alignment)
+ reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,location.reference.alignment,[])
else
- reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,location.reference.alignment)
+ reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,location.reference.alignment,[])
else
location:=gvs.localloc;
end
@@ -316,16 +317,16 @@ implementation
paraloc1.init;
paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pvd);
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE',AT_DATA,indirect),0,pvd.alignment);
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE',AT_DATA,indirect),0,pvd.alignment,[]);
if not issystemunit then
current_module.add_extern_asmsym('FPC_THREADVAR_RELOCATE',AB_EXTERNAL,AT_DATA);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,pvd,pvd,href,hregister);
hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,pvd,OC_EQ,0,hregister,norelocatelab);
{ no, call it with the index of the threadvar as parameter }
if not(vo_is_weak_external in gvs.varoptions) then
- reference_reset_symbol(tvref,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,sizeof(pint))
+ reference_reset_symbol(tvref,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,sizeof(pint),[])
else
- reference_reset_symbol(tvref,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,sizeof(pint));
+ reference_reset_symbol(tvref,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,sizeof(pint),[]);
href:=tvref;
hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,
tv_rec,
@@ -360,7 +361,7 @@ implementation
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,fieldptrdef,href,hregister);
hlcg.a_label(current_asmdata.CurrAsmList,endrelocatelab);
- hlcg.reference_reset_base(location.reference,fieldptrdef,hregister,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,fieldptrdef,hregister,0,location.reference.alignment,[]);
end;
end;
@@ -402,7 +403,7 @@ implementation
{ we don't know the size of all arrays }
newsize:=def_cgsize(resultdef);
{ alignment is overridden per case below }
- location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment);
+ location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment,[]);
case symtableentry.typ of
absolutevarsym :
begin
@@ -420,7 +421,7 @@ implementation
begin
if tconstsym(symtableentry).consttyp=constresourcestring then
begin
- location_reset_ref(location,LOC_CREFERENCE,def_cgsize(cansistringtype),cansistringtype.size);
+ location_reset_ref(location,LOC_CREFERENCE,def_cgsize(cansistringtype),cansistringtype.size,[]);
indirect:=(tf_supports_packages in target_info.flags) and
(target_info.system in systems_indirect_var_imports) and
(cs_imported_data in current_settings.localswitches) and
@@ -452,7 +453,7 @@ implementation
else
location.reference.symbol:=current_asmdata.WeakRefAsmSymbol(tstaticvarsym(symtableentry).mangledname,AT_DATA);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,location.reference,hregister);
- reference_reset_base(location.reference,hregister,0,location.reference.alignment);
+ reference_reset_base(location.reference,hregister,0,location.reference.alignment,[]);
end
{ Thread variable }
else if (vo_is_thread_var in gvs.varoptions) then
@@ -462,10 +463,11 @@ implementation
begin
if gvs.localloc.loc=LOC_INVALID then
begin
+ { static data is currently always volatile }
if not(vo_is_weak_external in gvs.varoptions) then
- reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,location.reference.alignment)
+ reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,location.reference.alignment,[])
else
- reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,location.reference.alignment)
+ reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,location.reference.alignment,[])
end
else
location:=gvs.localloc;
@@ -504,10 +506,10 @@ implementation
{ assume packed records may always be unaligned }
if not(resultdef.typ in [recorddef,objectdef]) or
(tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
- location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment)
+ location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment,[])
else
- location_reset_ref(location,LOC_REFERENCE,newsize,1);
- hlcg.reference_reset_base(location.reference,voidpointertype,hregister,0,location.reference.alignment);
+ location_reset_ref(location,LOC_REFERENCE,newsize,1,[]);
+ hlcg.reference_reset_base(location.reference,voidpointertype,hregister,0,location.reference.alignment,[]);
end;
{ make const a LOC_CREFERENCE }
@@ -582,7 +584,7 @@ implementation
assigned(tobjectdef(left.resultdef).vmt_field) then
begin
{ vmt pointer is a pointer to the vmt record }
- hlcg.reference_reset_base(href,vd,location.registerhi,0,vd.alignment);
+ hlcg.reference_reset_base(href,vd,location.registerhi,0,vd.alignment,[]);
vmtdef:=cpointerdef.getreusable(tobjectdef(left.resultdef).vmt_def);
hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,tobjectdef(left.resultdef),tfieldvarsym(tobjectdef(left.resultdef).vmt_field),href);
hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,vmtdef);
@@ -598,7 +600,7 @@ implementation
else if is_any_interface_kind(left.resultdef) then
begin
{ an interface is a pointer to a pointer to a vmt }
- hlcg.reference_reset_base(href,vd,location.registerhi,0,vd.alignment);
+ hlcg.reference_reset_base(href,vd,location.registerhi,0,vd.alignment,[]);
vmtdef:=cpointerdef.getreusable(tobjectdef(left.resultdef).vmt_def);
hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,vmtdef);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,vmtdef,vmtdef,href,hregister);
@@ -608,7 +610,7 @@ implementation
{ load method address }
vmtentry:=tabstractrecordsymtable(trecorddef(vmtdef.pointeddef).symtable).findfieldbyoffset(
tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber));
- hlcg.reference_reset_base(href,vmtdef,hregister,0,vmtdef.alignment);
+ hlcg.reference_reset_base(href,vmtdef,hregister,0,vmtdef.alignment,[]);
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,vmtentry.vardef);
hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,tabstractrecorddef(vmtdef.pointeddef),vmtentry,href);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,vmtentry.vardef,vmtentry.vardef,href,location.register);
@@ -616,7 +618,7 @@ implementation
else
begin
{ load address of the function }
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname,AT_FUNCTION),0,procdef.address_type.alignment);
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname,AT_FUNCTION),0,procdef.address_type.alignment,[]);
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cprocvardef.getreusableprocaddr(procdef));
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,procdef,cprocvardef.getreusableprocaddr(procdef),href,location.register);
end;
@@ -904,7 +906,7 @@ implementation
if releaseright then
location_freetemp(current_asmdata.CurrAsmList,right.location);
releaseright:=true;
- location_reset_ref(right.location,LOC_REFERENCE,left.location.size,0);
+ location_reset_ref(right.location,LOC_REFERENCE,left.location.size,0,[]);
right.location.reference:=href;
right.resultdef:=left.resultdef;
end;
@@ -1000,7 +1002,7 @@ implementation
{ extended into a double/single, since sse doesn't support extended) }
tg.gethltemp(current_asmdata.CurrAsmList,left.resultdef,left.resultdef.size,tt_normal,href);
cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,right.location.size,left.location.size,right.location.register,href);
- location_reset_ref(right.location,LOC_REFERENCE,left.location.size,0);
+ location_reset_ref(right.location,LOC_REFERENCE,left.location.size,0,[]);
right.location.reference:=href;
right.resultdef:=left.resultdef;
end;
@@ -1219,7 +1221,7 @@ implementation
else
varvtypefield:=nil;
{ alignment is filled in by tg.gethltemp below }
- location_reset_ref(location,LOC_CREFERENCE,OS_NO,0);
+ location_reset_ref(location,LOC_CREFERENCE,OS_NO,0,[]);
fillchar(paraloc,sizeof(paraloc),0);
{ Allocate always a temp, also if no elements are required, to
be sure that location is valid (PFV) }
@@ -1485,7 +1487,7 @@ implementation
(cs_imported_data in current_settings.localswitches) and
(rttidef.owner.moduleid<>current_module.moduleid);
- location_reset_ref(location,LOC_CREFERENCE,OS_NO,sizeof(pint));
+ location_reset_ref(location,LOC_CREFERENCE,OS_NO,sizeof(pint),[]);
case rttidatatype of
rdt_normal:
location.reference.symbol:=RTTIWriter.get_rtti_label(rttidef,rttitype,indirect);
diff --git a/compiler/ncgmem.pas b/compiler/ncgmem.pas
index 0f6b56fcb7..40f7e9bc67 100644
--- a/compiler/ncgmem.pas
+++ b/compiler/ncgmem.pas
@@ -127,7 +127,7 @@ implementation
vmtname:=tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname;
reference_reset_symbol(href,
current_asmdata.RefAsmSymbol(vmtname,AT_DATA,indirect),0,
- resultdef.alignment);
+ resultdef.alignment,[]);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,resultdef,href,location.register);
if otherunit then
current_module.add_extern_asmsym(vmtname,AB_EXTERNAL,AT_DATA);
@@ -146,7 +146,7 @@ implementation
{ find/add necessary classref/classname pool entries }
objcfinishstringrefpoolentry(entry,sp_objcclassnames,sec_objc_cls_refs,sec_objc_class_names);
end;
- reference_reset_symbol(href,tasmlabel(entry^.Data),0,objc_idtype.alignment);
+ reference_reset_symbol(href,tasmlabel(entry^.Data),0,objc_idtype.alignment,[]);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,objc_idtype,objc_idtype,href,location.register);
end;
end
@@ -194,7 +194,7 @@ implementation
if hsym.localloc.loc<>LOC_REFERENCE then
internalerror(200309283);
- hlcg.reference_reset_base(href,parentfpvoidpointertype,location.register,hsym.localloc.reference.offset,parentfpvoidpointertype.alignment);
+ hlcg.reference_reset_base(href,parentfpvoidpointertype,location.register,hsym.localloc.reference.offset,parentfpvoidpointertype.alignment,[]);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,href,location.register);
end;
end;
@@ -242,9 +242,9 @@ implementation
{ assume natural alignment, except for packed records }
if not(resultdef.typ in [recorddef,objectdef]) or
(tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),resultdef.alignment)
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),resultdef.alignment,[])
else
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1,[]);
{ can we fold an add/sub node into the offset of the deref node? }
extraoffset:=0;
@@ -357,7 +357,7 @@ implementation
(target_info.system in systems_garbage_collected_managed_types) then
begin
{ the contents of a class are aligned to a sizeof(pointer) }
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),voidpointertype.size);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),voidpointertype.size,[]);
case left.location.loc of
LOC_CREGISTER,
LOC_REGISTER:
@@ -371,7 +371,7 @@ implementation
end
else
{$endif}
- hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment,location.reference.volatility);
end;
LOC_CREFERENCE,
LOC_REFERENCE,
@@ -382,7 +382,7 @@ implementation
LOC_CSUBSETREF:
begin
hlcg.reference_reset_base(location.reference,left.resultdef,
- hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment);
+ hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment,location.reference.volatility);
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,location.reference.base);
end;
LOC_CONSTANT:
@@ -544,7 +544,7 @@ implementation
earlier versions)
}
asmsym:=current_asmdata.RefAsmSymbol(vs.mangledname,AT_DATA);
- reference_reset_symbol(tmpref,asmsym,0,voidpointertype.alignment);
+ reference_reset_symbol(tmpref,asmsym,0,voidpointertype.alignment,[]);
hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,left.resultdef,cpointerdef.getreusable(resultdef),location.reference);
location.reference.index:=hlcg.getintregister(current_asmdata.CurrAsmList,ptruinttype);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,ptruinttype,ptruinttype,tmpref,location.reference.index);
@@ -652,7 +652,7 @@ implementation
begin
hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
- reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+ reference_reset_base(location.reference,hreg,0,location.reference.alignment,location.reference.volatility);
{ insert new index register }
location.reference.index:=maybe_const_reg;
end;
@@ -870,9 +870,9 @@ implementation
newsize:=def_cgsize(resultdef);
secondpass(left);
if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
- location_reset_ref(location,left.location.loc,newsize,left.location.reference.alignment)
+ location_reset_ref(location,left.location.loc,newsize,left.location.reference.alignment,left.location.reference.volatility)
else
- location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment);
+ location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment,[]);
{ an ansistring needs to be dereferenced }
if is_ansistring(left.resultdef) or
@@ -886,17 +886,17 @@ implementation
LOC_REGISTER,
LOC_CREGISTER :
begin
- hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment,[]);
end;
LOC_CREFERENCE,
LOC_REFERENCE :
begin
- hlcg.reference_reset_base(location.reference,left.resultdef,hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment,[]);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location.reference,location.reference.base);
end;
LOC_CONSTANT:
begin
- hlcg.reference_reset_base(location.reference,left.resultdef,NR_NO,left.location.value,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,NR_NO,left.location.value,location.reference.alignment,[]);
end;
else
internalerror(2002032218);
@@ -907,6 +907,7 @@ implementation
else
offsetdec:=2;
location.reference.alignment:=offsetdec;
+ location.reference.volatility:=[];
{ in ansistrings/widestrings S[1] is p<w>char(S)[0] }
if not(cs_zerobasedstrings in current_settings.localswitches) then
@@ -917,11 +918,11 @@ implementation
case left.location.loc of
LOC_REGISTER,
LOC_CREGISTER :
- hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment,[]);
LOC_REFERENCE,
LOC_CREFERENCE :
begin
- hlcg.reference_reset_base(location.reference,left.resultdef,hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment);
+ hlcg.reference_reset_base(location.reference,left.resultdef,hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,location.reference.alignment,[]);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,
left.location.reference,location.reference.base);
end;
@@ -933,6 +934,7 @@ implementation
pointer size
}
location.reference.alignment:=voidpointertype.size;
+ location.reference.volatility:=[];
end
else
begin
diff --git a/compiler/ncgobjc.pas b/compiler/ncgobjc.pas
index 39a063c86e..5e3c995c13 100644
--- a/compiler/ncgobjc.pas
+++ b/compiler/ncgobjc.pas
@@ -80,7 +80,7 @@ procedure tcgobjcselectornode.pass_generate_code;
objcfinishstringrefpoolentry(entry,sp_objcvarnames,sec_objc_message_refs,sec_objc_meth_var_names);
- location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),sizeof(pint));
+ location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),sizeof(pint),[]);
location.reference.symbol:=tasmlabel(entry^.Data);
end;
diff --git a/compiler/ncgopt.pas b/compiler/ncgopt.pas
index 57572ccd7f..d067a75981 100644
--- a/compiler/ncgopt.pas
+++ b/compiler/ncgopt.pas
@@ -95,7 +95,7 @@ begin
hlcg.g_copyshortstring(current_asmdata.CurrAsmList,left.location.reference,href,tstringdef(cshortstringtype));
location_freetemp(current_asmdata.CurrAsmList,left.location);
{ return temp reference }
- location_reset_ref(left.location,LOC_REFERENCE,def_cgsize(resultdef),1);
+ location_reset_ref(left.location,LOC_REFERENCE,def_cgsize(resultdef),1,[]);
left.location.reference:=href;
end;
secondpass(right);
diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas
index 9e83bc59d1..aa75c75852 100644
--- a/compiler/ncgutil.pas
+++ b/compiler/ncgutil.pas
@@ -896,7 +896,7 @@ implementation
LOC_REFERENCE:
begin
gen_alloc_regloc(list,destloc,vardef);
- reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset,para.alignment);
+ reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset,para.alignment,[]);
cg128.a_load128_ref_reg(list,href,destloc.register128);
unget_para(paraloc^);
end;
@@ -1027,7 +1027,7 @@ implementation
LOC_REFERENCE:
begin
gen_alloc_regloc(list,destloc,vardef);
- reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset,para.alignment);
+ reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset,para.alignment,[]);
cg64.a_load64_ref_reg(list,href,destloc.register64);
unget_para(paraloc^);
end;
diff --git a/compiler/powerpc/cgcpu.pas b/compiler/powerpc/cgcpu.pas
index 03d4632a0c..8f1ac17136 100644
--- a/compiler/powerpc/cgcpu.pas
+++ b/compiler/powerpc/cgcpu.pas
@@ -222,7 +222,7 @@ const
the transition vector.}
//TODO: Support cross-TOC calls.
tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
- reference_reset(tmpref,4);
+ reference_reset(tmpref,4,[]);
tmpref.offset := 0;
//tmpref.symaddr := refs_full;
tmpref.base:= reg;
@@ -804,9 +804,9 @@ const
case target_info.abi of
abi_powerpc_aix,
abi_powerpc_darwin:
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4,[]);
abi_powerpc_sysv:
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4,[]);
end;
list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
if not(cs_profile in current_settings.moduleswitches) then
@@ -820,7 +820,7 @@ const
begin
a_reg_alloc(list,NR_R0);
list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_CR));
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,[]);
list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
a_reg_dealloc(list,NR_R0);
end;
@@ -837,7 +837,7 @@ const
if usesfpr then
begin
- reference_reset_base(href,NR_R1,-8,8);
+ reference_reset_base(href,NR_R1,-8,8,[]);
for regcounter:=firstregfpu to RS_F31 do
begin
a_loadfpu_reg_ref(list,OS_F64,OS_F64,newreg(R_FPUREGISTER,regcounter,R_SUBNONE),href);
@@ -848,7 +848,7 @@ const
end
else
{ compute start of gpr save area }
- reference_reset_base(href,NR_R1,-4,4);
+ reference_reset_base(href,NR_R1,-4,4,[]);
{ save gprs and fetch GOT pointer }
if usesgpr then
@@ -881,12 +881,12 @@ const
begin
if (localsize <= high(smallint)) then
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,-localsize,8);
+ reference_reset_base(href,NR_STACK_POINTER_REG,-localsize,8,[]);
a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
end
else
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,0,4,[]);
{ can't use getregisterint here, the register colouring }
{ is already done when we get here }
{ R12 may hold previous stack pointer, R11 may be in }
@@ -958,7 +958,7 @@ const
genret:=true;
if usesfpr then
begin
- reference_reset_base(href,NR_R1,-8,8);
+ reference_reset_base(href,NR_R1,-8,8,[]);
for regcounter := firstregfpu to RS_F31 do
begin
a_loadfpu_ref_reg(list,OS_F64,OS_F64,href,newreg(R_FPUREGISTER,regcounter,R_SUBNONE));
@@ -967,7 +967,7 @@ const
inc(href.offset,4);
end
else
- reference_reset_base(href,NR_R1,-4,4);
+ reference_reset_base(href,NR_R1,-4,4,[]);
if (usesgpr) then
begin
@@ -1017,9 +1017,9 @@ const
case target_info.abi of
abi_powerpc_aix,
abi_powerpc_darwin:
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4,[]);
abi_powerpc_sysv:
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4,[]);
end;
a_reg_alloc(list,NR_R0);
list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
@@ -1032,7 +1032,7 @@ const
if target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin] then
if false then { Not needed at the moment. }
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,[]);
list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
a_reg_dealloc(list,NR_R0);
@@ -1099,7 +1099,7 @@ const
for regcounter := firstregfpu to RS_F31 do
begin
offset:= offset - 8;
- reference_reset_base(href, NR_STACK_POINTER_REG, offset, 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, offset, 8, []);
list.concat(taicpu.op_reg_ref(A_STFD, tregister(regcounter), href));
end;
(* Optimiztion in the future: a_call_name(list,'_savefXX'); *)
@@ -1109,7 +1109,7 @@ const
if firstreggpr < RS_R30 then
begin
offset:= offset - 4 * (RS_R31 - firstreggpr + 1);
- reference_reset_base(href,NR_STACK_POINTER_REG,offset,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,offset,4,[]);
list.concat(taicpu.op_reg_ref(A_STMW,tregister(firstreggpr),href));
{STMW stores multiple registers}
end
@@ -1118,7 +1118,7 @@ const
for regcounter := firstreggpr to RS_R31 do
begin
offset:= offset - 4;
- reference_reset_base(href, NR_STACK_POINTER_REG, offset, 4);
+ reference_reset_base(href, NR_STACK_POINTER_REG, offset, 4, []);
list.concat(taicpu.op_reg_ref(A_STW, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
end;
end;
@@ -1185,7 +1185,7 @@ const
for regcounter := firstregfpu to RS_F31 do
begin
offset:= offset - 8;
- reference_reset_base(href, NR_STACK_POINTER_REG, offset, 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, offset, 8, []);
list.concat(taicpu.op_reg_ref(A_LFD, newreg(R_FPUREGISTER,regcounter,R_SUBWHOLE), href));
end;
(* Optimiztion in the future: a_call_name(list,'_restfXX'); *)
@@ -1195,7 +1195,7 @@ const
if firstreggpr < RS_R30 then
begin
offset:= offset - 4 * (RS_R31 - firstreggpr + 1);
- reference_reset_base(href,NR_STACK_POINTER_REG,offset, 4); //-220
+ reference_reset_base(href,NR_STACK_POINTER_REG,offset,4,[]); //-220
list.concat(taicpu.op_reg_ref(A_LMW,tregister(firstreggpr),href));
{LMW loads multiple registers}
end
@@ -1204,7 +1204,7 @@ const
for regcounter := firstreggpr to RS_R31 do
begin
offset:= offset - 4;
- reference_reset_base(href, NR_STACK_POINTER_REG, offset, 4);
+ reference_reset_base(href, NR_STACK_POINTER_REG, offset, 4, []);
list.concat(taicpu.op_reg_ref(A_LWZ, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
end;
end;
@@ -1241,7 +1241,7 @@ const
{ save return address in callers frame}
list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_LR));
{ ... in caller's frame }
- reference_reset_base(href,NR_STACK_POINTER_REG,8, 8);
+ reference_reset_base(href,NR_STACK_POINTER_REG,8,8,[]);
list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
a_reg_dealloc(list,NR_R0);
@@ -1251,7 +1251,7 @@ const
{ save the CR if necessary in callers frame ( !!! always done currently ) }
a_reg_alloc(list,NR_R0);
list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_CR));
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,4,[]);
list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
a_reg_dealloc(list,NR_R0);
@@ -1285,12 +1285,12 @@ const
begin
if (localsize <= high(smallint)) then
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,-localsize,8);
+ reference_reset_base(href,NR_STACK_POINTER_REG,-localsize,8,[]);
a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
end
else
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,0,8);
+ reference_reset_base(href,NR_STACK_POINTER_REG,0,8,[]);
href.index := NR_R11;
a_reg_alloc(list,href.index);
a_load_const_reg(list,OS_S32,-localsize,href.index);
@@ -1309,7 +1309,7 @@ const
a_reg_alloc(list,NR_R0);
{ restore stack pointer }
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_SP,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_SP,4,[]);
list.concat(taicpu.op_reg_ref(A_LWZ,NR_STACK_POINTER_REG,href));
(*
list.concat(taicpu.op_reg_reg_const(A_ORI,NR_STACK_POINTER_REG,R_31,0));
@@ -1317,14 +1317,14 @@ const
{ restore the CR if necessary from callers frame
( !!! always done currently ) }
- reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,4);
+ reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,4,[]);
list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
a_reg_dealloc(list,NR_R0);
(*
{ restore return address from callers frame }
- reference_reset_base(href,STACK_POINTER_REG,8);
+ reference_reset_base(href,STACK_POINTER_REG,8,[]);
list.concat(taicpu.op_reg_ref(A_LWZ,R_0,href));
*)
@@ -1338,7 +1338,7 @@ const
*)
{ restore return address from callers frame }
- reference_reset_base(href,NR_STACK_POINTER_REG,8,8);
+ reference_reset_base(href,NR_STACK_POINTER_REG,8,8,[]);
list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
{ return to caller }
@@ -1396,8 +1396,8 @@ const
count := len div maxmoveunit;
- reference_reset(src,source.alignment);
- reference_reset(dst,dest.alignment);
+ reference_reset(src,source.alignment,source.volatility);
+ reference_reset(dst,dest.alignment,dest.volatility);
{ load the address of source into src.base }
if (count > 4) or
not issimpleref(source) or
diff --git a/compiler/powerpc/nppccal.pas b/compiler/powerpc/nppccal.pas
index d8f1ca28b6..c290d802d0 100644
--- a/compiler/powerpc/nppccal.pas
+++ b/compiler/powerpc/nppccal.pas
@@ -91,7 +91,7 @@ implementation
begin
{ one syscall convention for AmigaOS/PowerPC
which is very similar to basesysv (a.k.a basefirst) on MorphOS }
- reference_reset_base(tmpref,NR_R3,tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,NR_R3,tprocdef(procdefinition).extnumber,sizeof(pint),[]);
do_call_ref(tmpref);
end;
system_powerpc_morphos:
@@ -111,13 +111,13 @@ implementation
case libparaloc^.loc of
LOC_REGISTER:
- reference_reset_base(tmpref,libparaloc^.register,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,libparaloc^.register,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
LOC_REFERENCE:
begin
{ this can happen for sysvbase; if we run out of regs, the libbase will be passed on the stack }
- reference_reset_base(tmpref,libparaloc^.reference.index,libparaloc^.reference.offset,sizeof(pint));
+ reference_reset_base(tmpref,libparaloc^.reference.index,libparaloc^.reference.offset,sizeof(pint),[]);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_R12);
- reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
end;
else
internalerror(2016090202);
@@ -132,7 +132,7 @@ implementation
{ R3 must contain the call offset }
current_asmdata.CurrAsmList.concat(taicpu.op_reg_const(A_LI,NR_R3,-tprocdef(procdefinition).extnumber));
- reference_reset_base(tmpref,NR_R2,100,4); { 100 ($64) is EmulDirectCallOS offset }
+ reference_reset_base(tmpref,NR_R2,100,4,[]); { 100 ($64) is EmulDirectCallOS offset }
do_call_ref(tmpref);
cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_R3);
diff --git a/compiler/powerpc64/cgcpu.pas b/compiler/powerpc64/cgcpu.pas
index 1118db289f..93fef36f01 100644
--- a/compiler/powerpc64/cgcpu.pas
+++ b/compiler/powerpc64/cgcpu.pas
@@ -334,22 +334,22 @@ begin
tempreg := getintregister(list, OS_INT);
{ load actual function entry (reg contains the reference to the function descriptor)
into tempreg }
- reference_reset_base(tmpref, reg, 0, sizeof(pint));
+ reference_reset_base(tmpref, reg, 0, sizeof(pint), []);
a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, tempreg);
{ save TOC pointer in stackframe }
- reference_reset_base(tmpref, NR_STACK_POINTER_REG, get_rtoc_offset, 8);
+ reference_reset_base(tmpref, NR_STACK_POINTER_REG, get_rtoc_offset, 8, []);
a_load_reg_ref(list, OS_ADDR, OS_ADDR, NR_RTOC, tmpref);
{ move actual function pointer to CTR register }
list.concat(taicpu.op_reg(A_MTCTR, tempreg));
{ load new TOC pointer from function descriptor into RTOC register }
- reference_reset_base(tmpref, reg, tcgsize2size[OS_ADDR], 8);
+ reference_reset_base(tmpref, reg, tcgsize2size[OS_ADDR], 8, []);
a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_RTOC);
{ load new environment pointer from function descriptor into R11 register }
- reference_reset_base(tmpref, reg, 2*tcgsize2size[OS_ADDR], 8);
+ reference_reset_base(tmpref, reg, 2*tcgsize2size[OS_ADDR], 8, []);
a_reg_alloc(list, NR_R11);
a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_R11);
{ call function }
@@ -365,7 +365,7 @@ begin
end;
{ we need to load the old RTOC from stackframe because we changed it}
- reference_reset_base(tmpref, NR_STACK_POINTER_REG, get_rtoc_offset, 8);
+ reference_reset_base(tmpref, NR_STACK_POINTER_REG, get_rtoc_offset, 8, []);
a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_RTOC);
include(current_procinfo.flags, pi_do_call);
@@ -1155,7 +1155,7 @@ var
mayNeedLRStore := true;
end else begin
{ save registers, FPU first, then GPR }
- reference_reset_base(href, NR_STACK_POINTER_REG, -8, 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, -8, 8, []);
if (fprcount > 0) then
for regcount := RS_F31 downto firstregfpu do begin
a_loadfpu_reg_ref(list, OS_FLOAT, OS_FLOAT, newreg(R_FPUREGISTER,
@@ -1176,7 +1176,7 @@ var
{ we may need to store R0 (=LR) ourselves }
if ((cs_profile in init_settings.moduleswitches) or (mayNeedLRStore)) and (needslinkreg) then begin
- reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_SYSV, 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_SYSV, 8, []);
list.concat(taicpu.op_reg_ref(A_STD, NR_R0, href));
end;
end;
@@ -1201,7 +1201,7 @@ begin
getcpuregister(list,NR_R12);
getcpuregister(list,NR_R2);
cg.a_label(list,lab);
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol('.TOC.',AT_DATA),0,sizeof(PInt));
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol('.TOC.',AT_DATA),0,sizeof(PInt),[]);
href.relsymbol:=lab;
href.refaddr:=addr_higha;
list.concat(taicpu.op_reg_reg_ref(a_addis,NR_R2,NR_R12,href));
@@ -1242,10 +1242,10 @@ begin
if (not nostackframe) and (localsize > 0) and
tppcprocinfo(current_procinfo).needstackframe then begin
if (localsize <= high(smallint)) then begin
- reference_reset_base(href, NR_STACK_POINTER_REG, -localsize, 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, -localsize, 8, []);
a_load_store(list, A_STDU, NR_STACK_POINTER_REG, href);
end else begin
- reference_reset_base(href, NR_NO, -localsize, 8);
+ reference_reset_base(href, NR_NO, -localsize, 8, []);
{ Use R0 for loading the constant (which is definitely > 32k when entering
this branch).
@@ -1327,7 +1327,7 @@ var
end else begin
needsExitCode := true;
{ restore registers, FPU first, GPR next }
- reference_reset_base(href, NR_STACK_POINTER_REG, -tcgsize2size[OS_FLOAT], 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, -tcgsize2size[OS_FLOAT], 8, []);
if (fprcount > 0) then
for regcount := RS_F31 downto firstregfpu do begin
a_loadfpu_ref_reg(list, OS_FLOAT, OS_FLOAT, href, newreg(R_FPUREGISTER, regcount,
@@ -1348,7 +1348,7 @@ var
{ restore LR (if needed) }
if (needslinkreg) then begin
- reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_SYSV, 8);
+ reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_SYSV, 8, []);
list.concat(taicpu.op_reg_ref(A_LD, NR_R0, href));
list.concat(taicpu.op_reg(A_MTLR, NR_R0));
end;
@@ -1385,7 +1385,7 @@ begin
if (localsize <= high(smallint)) then begin
list.concat(taicpu.op_reg_reg_const(A_ADDI, NR_STACK_POINTER_REG, NR_STACK_POINTER_REG, localsize));
end else begin
- reference_reset_base(href, NR_NO, localsize, 8);
+ reference_reset_base(href, NR_NO, localsize, 8, []);
{ use R0 for loading the constant (which is definitely > 32k when entering
this branch)
@@ -1434,7 +1434,7 @@ begin
if (assigned(ref2.symbol) or (hasLargeOffset(ref2))) then begin
{ add the symbol's value to the base of the reference, and if the }
{ reference doesn't have a base, create one }
- reference_reset(tmpref, ref2.alignment);
+ reference_reset(tmpref, ref2.alignment, ref2.volatility);
tmpref.offset := ref2.offset;
tmpref.symbol := ref2.symbol;
tmpref.relsymbol := ref2.relsymbol;
@@ -1570,8 +1570,8 @@ begin
end;
tempreg:=getintregister(list,size);
- reference_reset(src,source.alignment);
- reference_reset(dst,dest.alignment);
+ reference_reset(src,source.alignment,source.volatility);
+ reference_reset(dst,dest.alignment,dest.volatility);
{ load the address of source into src.base }
if (count > 4) or
not issimpleref(source) or
@@ -1758,7 +1758,7 @@ begin
ref.offset := 0;
end;
- reference_reset(tmpref, ref.alignment);
+ reference_reset(tmpref, ref.alignment, ref.volatility);
tmpref.symbol := ref.symbol;
tmpref.relsymbol := ref.relsymbol;
tmpref.offset := ref.offset;
@@ -1794,7 +1794,7 @@ begin
end else
a_load_const_reg(list, OS_ADDR, tmpref.offset, tmpreg2);
- reference_reset(tmpref, ref.alignment);
+ reference_reset(tmpref, ref.alignment, ref.volatility);
tmpref.base := ref.base;
tmpref.index := tmpreg2;
case op of
@@ -1863,7 +1863,7 @@ begin
current_asmdata.asmlists[al_picdata].concat(tai_symbol.create_global(l,0));
current_asmdata.asmlists[al_picdata].concat(tai_directive.create(asd_toc_entry, symname + '[TC], ' + inttostr(a)));
end;
- reference_reset_symbol(ref,l,0, 8);
+ reference_reset_symbol(ref,l,0,8,[]);
ref.base := NR_R2;
ref.refaddr := addr_no;
diff --git a/compiler/powerpc64/nppccnv.pas b/compiler/powerpc64/nppccnv.pas
index 7eeeffd51f..eeb46cfd95 100644
--- a/compiler/powerpc64/nppccnv.pas
+++ b/compiler/powerpc64/nppccnv.pas
@@ -106,7 +106,7 @@ var
signed: boolean;
begin
location_reset(location, LOC_FPUREGISTER, def_cgsize(resultdef));
- reference_reset(disp2,0);
+ reference_reset(disp2,0,[]);
tempconst:=nil;
{ the code here comes from the PowerPC Compiler Writer's Guide }
diff --git a/compiler/ppcgen/cgppc.pas b/compiler/ppcgen/cgppc.pas
index 1128129249..bc7911c562 100644
--- a/compiler/ppcgen/cgppc.pas
+++ b/compiler/ppcgen/cgppc.pas
@@ -203,7 +203,7 @@ unit cgppc;
a_loadaddr_ref_reg(list,r,paraloc.location^.register);
LOC_REFERENCE:
begin
- reference_reset(ref,paraloc.alignment);
+ reference_reset(ref,paraloc.alignment,[]);
ref.base := paraloc.location^.reference.index;
ref.offset := paraloc.location^.reference.offset;
tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
@@ -349,7 +349,7 @@ unit cgppc;
current_asmdata.weakrefasmsymbol(s,AT_FUNCTION);
current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
l1 := current_asmdata.DefineAsmSymbol('L'+s+'$lazy_ptr',AB_LOCAL,AT_DATA,voidpointertype);
- reference_reset_symbol(href,l1,0,sizeof(pint));
+ reference_reset_symbol(href,l1,0,sizeof(pint),[]);
href.refaddr := addr_higha;
if (cs_create_pic in current_settings.moduleswitches) then
begin
@@ -401,7 +401,7 @@ unit cgppc;
begin
if macos_direct_globals then
begin
- reference_reset(tmpref,ref2.alignment);
+ reference_reset(tmpref,ref2.alignment,ref2.volatility);
tmpref.offset := ref2.offset;
tmpref.symbol := ref2.symbol;
tmpref.base := NR_NO;
@@ -409,7 +409,7 @@ unit cgppc;
end
else
begin
- reference_reset(tmpref,ref2.alignment);
+ reference_reset(tmpref,ref2.alignment,ref2.volatility);
tmpref.symbol := ref2.symbol;
tmpref.offset := 0;
tmpref.base := NR_RTOC;
@@ -429,7 +429,7 @@ unit cgppc;
{ add the symbol's value to the base of the reference, and if the }
{ reference doesn't have a base, create one }
- reference_reset(tmpref,ref2.alignment);
+ reference_reset(tmpref,ref2.alignment,ref2.volatility);
tmpref.offset := ref2.offset;
tmpref.symbol := ref2.symbol;
tmpref.relsymbol := ref2.relsymbol;
@@ -477,21 +477,21 @@ unit cgppc;
if target_info.system in systems_aix then
begin
{ load function address in R0, and swap "reg" for R0 }
- reference_reset_base(tmpref,reg,0,sizeof(pint));
+ reference_reset_base(tmpref,reg,0,sizeof(pint),[]);
a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_R0);
tmpreg:=reg;
{ no need to allocate/free R0, is already allocated by call node
because it's a volatile register }
reg:=NR_R0;
{ save current TOC }
- reference_reset_base(tmpref,NR_STACK_POINTER_REG,LA_RTOC_AIX,sizeof(pint));
+ reference_reset_base(tmpref,NR_STACK_POINTER_REG,LA_RTOC_AIX,sizeof(pint),[]);
a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_RTOC,tmpref);
end;
list.concat(taicpu.op_reg(A_MTCTR,reg));
if target_info.system in systems_aix then
begin
{ load target TOC and possible link register }
- reference_reset_base(tmpref,tmpreg,sizeof(pint),sizeof(pint));
+ reference_reset_base(tmpref,tmpreg,sizeof(pint),sizeof(pint),[]);
a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_RTOC);
tmpref.offset:=2*sizeof(pint);
a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_R11);
@@ -499,7 +499,7 @@ unit cgppc;
else if target_info.abi=abi_powerpc_elfv2 then
begin
{ save current TOC }
- reference_reset_base(tmpref,NR_STACK_POINTER_REG,LA_RTOC_ELFV2,sizeof(pint));
+ reference_reset_base(tmpref,NR_STACK_POINTER_REG,LA_RTOC_ELFV2,sizeof(pint),[]);
a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_RTOC,tmpref);
{ functions must be called via R12 for this ABI }
if reg<>NR_R12 then
@@ -520,7 +520,7 @@ unit cgppc;
toc_offset:=LA_RTOC_AIX
else
toc_offset:=LA_RTOC_ELFV2;
- reference_reset_base(tmpref,NR_STACK_POINTER_REG,toc_offset,sizeof(pint));
+ reference_reset_base(tmpref,NR_STACK_POINTER_REG,toc_offset,sizeof(pint),[]);
a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_RTOC);
end;
include(current_procinfo.flags,pi_do_call);
@@ -762,7 +762,7 @@ unit cgppc;
if target_info.system=system_powerpc64_linux then
begin
l:=current_asmdata.getasmsymbol(symbol);
- reference_reset_symbol(ref,l,0,sizeof(pint));
+ reference_reset_symbol(ref,l,0,sizeof(pint),[]);
ref.base:=NR_RTOC;
ref.refaddr:=addr_pic;
end
@@ -803,7 +803,7 @@ unit cgppc;
begin
{ all global symbol accesses always must be done via the TOC }
nlsymname:='LC..'+symname;
- reference_reset_symbol(ref,current_asmdata.getasmsymbol(nlsymname),0,sizeof(pint));
+ reference_reset_symbol(ref,current_asmdata.getasmsymbol(nlsymname),0,sizeof(pint),[]);
if (assigned(ref.symbol) and
not(ref.symbol is TTOCAsmSymbol)) or
(not(ts_small_toc in current_settings.targetswitches) and
@@ -1103,7 +1103,7 @@ unit cgppc;
begin {Load symbol's value}
tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
- reference_reset(tmpref,sizeof(pint));
+ reference_reset(tmpref,sizeof(pint),[]);
tmpref.symbol := ref.symbol;
tmpref.base := NR_RTOC;
tmpref.refaddr := addr_pic_no_got;
@@ -1120,7 +1120,7 @@ unit cgppc;
if largeOffset then
begin {Add hi part of offset}
- reference_reset(tmpref,ref.alignment);
+ reference_reset(tmpref,ref.alignment,[]);
{$ifdef cpu64bitaddr}
if (ref.offset < low(longint)) or
@@ -1175,7 +1175,7 @@ unit cgppc;
begin
// TODO: offsets > 32 bit
tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
- reference_reset(tmpref,ref.alignment);
+ reference_reset(tmpref,ref.alignment,[]);
tmpref.symbol := ref.symbol;
tmpref.relsymbol := ref.relsymbol;
tmpref.offset := ref.offset;
diff --git a/compiler/ppcgen/hlcgppc.pas b/compiler/ppcgen/hlcgppc.pas
index c66d711efa..7723fe1566 100644
--- a/compiler/ppcgen/hlcgppc.pas
+++ b/compiler/ppcgen/hlcgppc.pas
@@ -103,7 +103,7 @@ implementation
var
href : treference;
begin
- reference_reset_base(href,voidpointertype,NR_R3,0,sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_R3,0,sizeof(pint),[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
end;
@@ -115,7 +115,7 @@ implementation
if (procdef.extnumber=$ffff) then
Internalerror(200006139);
{ call/jmp vmtoffs(%eax) ; method offs }
- reference_reset_base(href,voidpointertype,NR_R11,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_R11,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint),[]);
if tcgppcgen(cg).hasLargeOffset(href) then
begin
{$ifdef cpu64}
@@ -134,7 +134,7 @@ implementation
((target_info.system = system_powerpc64_linux) and
(target_info.abi=abi_powerpc_sysv)) then
begin
- reference_reset_base(href, voidpointertype, NR_R12, 0, sizeof(pint));
+ reference_reset_base(href, voidpointertype, NR_R12, 0, sizeof(pint),[]);
cg.a_load_ref_reg(list, OS_ADDR, OS_ADDR, href, NR_R12);
end;
list.concat(taicpu.op_reg(A_MTCTR,NR_R12));
@@ -221,11 +221,11 @@ implementation
}
list.concat(taicpu.op_reg(A_MFLR, NR_R0));
if target_info.abi=abi_powerpc_sysv then
- reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_SYSV, 8)
+ reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_SYSV, 8, [])
else
- reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_AIX, 8);
+ reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_AIX, 8, []);
cg.a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_R0,href);
- reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, -MINIMUM_STACKFRAME_SIZE, 8);
+ reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, -MINIMUM_STACKFRAME_SIZE, 8, []);
list.concat(taicpu.op_reg_ref({$ifdef cpu64bitaddr}A_STDU{$else}A_STWU{$endif}, NR_STACK_POINTER_REG, href));
cg.a_call_name(list,externalname,false);
@@ -234,9 +234,9 @@ implementation
if target_info.abi=abi_powerpc_sysv then
- reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_SYSV, 8)
+ reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_SYSV, 8, [])
else
- reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_AIX, 8);
+ reference_reset_base(href, voidstackpointertype, NR_STACK_POINTER_REG, LA_LR_AIX, 8, []);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R0);
list.concat(taicpu.op_reg(A_MTLR, NR_R0));
list.concat(taicpu.op_none(A_BLR));
diff --git a/compiler/ppcgen/ngppcinl.pas b/compiler/ppcgen/ngppcinl.pas
index 828294c53f..1e4c8ae4da 100644
--- a/compiler/ppcgen/ngppcinl.pas
+++ b/compiler/ppcgen/ngppcinl.pas
@@ -182,7 +182,7 @@ implementation
tmpreg:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,tmpreg,
left.location.register));
- location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),0);
+ location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),0,[]);
tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,
tt_normal,location.reference);
cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,OS_F64,OS_F64,tmpreg,
diff --git a/compiler/ppcgen/ngppcset.pas b/compiler/ppcgen/ngppcset.pas
index 97c3f612d3..394cc7daa9 100644
--- a/compiler/ppcgen/ngppcset.pas
+++ b/compiler/ppcgen/ngppcset.pas
@@ -117,11 +117,11 @@ implementation
current_asmdata.getjumplabel(table);
{ create reference, indexreg := indexreg * sizeof(jtentry) (= 4) }
cg.a_op_const_reg(current_asmdata.CurrAsmList, OP_MUL, OS_INT, 4, indexreg);
- reference_reset_symbol(href, table, 0, 4);
+ reference_reset_symbol(href, table, 0, 4, []);
hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
- reference_reset_base(href,hregister,0,4);
+ reference_reset_base(href,hregister,0,4,[]);
href.index:=indexreg;
indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
{ load table entry }
diff --git a/compiler/ppcgen/rgcpu.pas b/compiler/ppcgen/rgcpu.pas
index 8570e39c66..df48898b80 100644
--- a/compiler/ppcgen/rgcpu.pas
+++ b/compiler/ppcgen/rgcpu.pas
@@ -77,7 +77,7 @@ unit rgcpu;
else
hreg:=cg.getintregister(helplist,OS_ADDR);
- reference_reset(tmpref,sizeof(aint));
+ reference_reset(tmpref,sizeof(aint),[]);
tmpref.offset:=spilltemp.offset;
tmpref.refaddr := addr_higha;
ins:=taicpu.op_reg_reg_ref(A_ADDIS,hreg,spilltemp.base,tmpref);
@@ -127,7 +127,7 @@ unit rgcpu;
end
else
hreg:=cg.getintregister(helplist,OS_ADDR);
- reference_reset(tmpref,sizeof(aint));
+ reference_reset(tmpref,sizeof(aint),[]);
tmpref.offset:=spilltemp.offset;
tmpref.refaddr := addr_higha;
ins:=taicpu.op_reg_reg_ref(A_ADDIS,hreg,spilltemp.base,tmpref);
diff --git a/compiler/procinfo.pas b/compiler/procinfo.pas
index 88eca2a4da..9f03c8f0b4 100644
--- a/compiler/procinfo.pas
+++ b/compiler/procinfo.pas
@@ -202,7 +202,7 @@ implementation
{ asmlists }
aktproccode:=TAsmList.Create;
aktlocaldata:=TAsmList.Create;
- reference_reset(save_regs_ref,sizeof(aint));
+ reference_reset(save_regs_ref,sizeof(aint),[]);
{ labels }
current_asmdata.getjumplabel(CurrExitLabel);
current_asmdata.getjumplabel(CurrGOTLabel);
diff --git a/compiler/sparc/cgcpu.pas b/compiler/sparc/cgcpu.pas
index a9242c83ff..008844b8f5 100644
--- a/compiler/sparc/cgcpu.pas
+++ b/compiler/sparc/cgcpu.pas
@@ -182,7 +182,7 @@ implementation
exit;
end;
- reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment);
+ reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment,ref.volatility);
hreg:=getintregister(list,OS_INT);
if not (cs_create_pic in current_settings.moduleswitches) then
begin
@@ -214,7 +214,7 @@ implementation
list.concat(taicpu.op_ref_reg(A_SETHI,href,hreg));
href.refaddr:=addr_low;
list.concat(taicpu.op_reg_ref_reg(A_OR,hreg,href,hreg));
- reference_reset_base(href,hreg,0,sizeof(pint));
+ reference_reset_base(href,hreg,0,sizeof(pint),[]);
href.index:=current_procinfo.got;
end
else
@@ -340,7 +340,7 @@ implementation
a_load_ref_reg(list,hloc^.size,hloc^.size,href,hloc^.register);
LOC_REFERENCE :
begin
- reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,paraloc.alignment);
+ reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,paraloc.alignment,[]);
a_load_ref_ref(list,hloc^.size,hloc^.size,href,href2);
end;
LOC_FPUREGISTER,LOC_CFPUREGISTER :
@@ -580,7 +580,7 @@ implementation
exit;
end;
- reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment);
+ reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment,ref.volatility);
if (cs_create_pic in current_settings.moduleswitches) then
begin
include(current_procinfo.flags,pi_needs_got);
@@ -591,7 +591,7 @@ implementation
list.concat(taicpu.op_ref_reg(A_SETHI,href,r));
href.refaddr:=addr_low;
list.concat(taicpu.op_reg_ref_reg(A_OR,r,href,r));
- reference_reset_base(href,r,0,sizeof(pint));
+ reference_reset_base(href,r,0,sizeof(pint),[]);
href.index:=current_procinfo.got;
end
else
@@ -1022,7 +1022,7 @@ implementation
sethi %hi(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
add %l7, %o7, %l7 }
- reference_reset_symbol(ref,current_asmdata.RefAsmSymbol('_GLOBAL_OFFSET_TABLE_',AT_DATA),4,sizeof(pint));
+ reference_reset_symbol(ref,current_asmdata.RefAsmSymbol('_GLOBAL_OFFSET_TABLE_',AT_DATA),4,sizeof(pint),[]);
ref.refaddr:=addr_high;
list.concat(taicpu.op_ref_reg(A_SETHI,ref,NR_L7));
cg.a_label(list,hl);
@@ -1048,7 +1048,7 @@ implementation
begin
if paramanager.ret_in_param(current_procinfo.procdef.returndef,current_procinfo.procdef) then
begin
- reference_reset(hr,sizeof(pint));
+ reference_reset(hr,sizeof(pint),[]);
hr.offset:=12;
hr.refaddr:=addr_full;
if nostackframe then
@@ -1151,14 +1151,14 @@ implementation
src:=source
else
begin
- reference_reset_base(src,getintregister(list,OS_ADDR),0,sizeof(aint));
+ reference_reset_base(src,getintregister(list,OS_ADDR),0,sizeof(aint),source.volatility);
a_loadaddr_ref_reg(list,source,src.base);
end;
if (count<=4) and reference_is_reusable(dest) then
dst:=dest
else
begin
- reference_reset_base(dst,getintregister(list,OS_ADDR),0,sizeof(aint));
+ reference_reset_base(dst,getintregister(list,OS_ADDR),0,sizeof(aint),dest.volatility);
a_loadaddr_ref_reg(list,dest,dst.base);
end;
{ generate a loop }
@@ -1230,8 +1230,8 @@ implementation
g_concatcopy_move(list,source,dest,len)
else
begin
- reference_reset(src,source.alignment);
- reference_reset(dst,dest.alignment);
+ reference_reset(src,source.alignment,source.volatility);
+ reference_reset(dst,dest.alignment,dest.volatility);
{ load the address of source into src.base }
src.base:=GetAddressRegister(list);
a_loadaddr_ref_reg(list,source,src.base);
diff --git a/compiler/sparc/hlcgcpu.pas b/compiler/sparc/hlcgcpu.pas
index b777bd5561..5f3967004a 100644
--- a/compiler/sparc/hlcgcpu.pas
+++ b/compiler/sparc/hlcgcpu.pas
@@ -109,10 +109,10 @@ implementation
if (procdef.extnumber=$ffff) then
Internalerror(200006139);
{ mov 0(%rdi),%rax ; load vmt}
- reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(pint));
+ reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(pint),[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_G1);
{ jmp *vmtoffs(%eax) ; method offs }
- reference_reset_base(href,voidpointertype,NR_G1,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_G1,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint),[]);
list.concat(taicpu.op_ref_reg(A_LD,href,NR_G1));
list.concat(taicpu.op_reg(A_JMP,NR_G1));
{ Delay slot }
diff --git a/compiler/sparc/ncpucnv.pas b/compiler/sparc/ncpucnv.pas
index 50ef3d6773..52d42827aa 100644
--- a/compiler/sparc/ncpucnv.pas
+++ b/compiler/sparc/ncpucnv.pas
@@ -154,7 +154,7 @@ implementation
begin
current_asmdata.getglobaldatalabel(l1);
current_asmdata.getjumplabel(l2);
- reference_reset_symbol(href,l1,0,8);
+ reference_reset_symbol(href,l1,0,8,[]);
hregister:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,u32inttype,left.location,hregister);
diff --git a/compiler/sparc/ncpuset.pas b/compiler/sparc/ncpuset.pas
index 4e648fbe9d..7fbd4ad51c 100644
--- a/compiler/sparc/ncpuset.pas
+++ b/compiler/sparc/ncpuset.pas
@@ -105,7 +105,7 @@ unit ncpuset;
{ create reference }
current_asmdata.getjumplabel(base);
cg.a_label(current_asmdata.CurrAsmList,base);
- reference_reset_symbol(href,table,(-aint(min_))*4,sizeof(pint));
+ reference_reset_symbol(href,table,(-aint(min_))*4,sizeof(pint),[]);
href.relsymbol:=base;
{ Generate the following code:
.Lbase:
@@ -129,7 +129,7 @@ unit ncpuset;
cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,OP_ADD,OS_ADDR,basereg,indexreg,basereg);
jmpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
- reference_reset_base(href,NR_O7,0,sizeof(pint));
+ reference_reset_base(href,NR_O7,0,sizeof(pint),[]);
href.index:=basereg;
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,jmpreg);
href.index:=jmpreg;
diff --git a/compiler/sparc/rgcpu.pas b/compiler/sparc/rgcpu.pas
index 01c18d3f77..285d9a3c9f 100644
--- a/compiler/sparc/rgcpu.pas
+++ b/compiler/sparc/rgcpu.pas
@@ -104,7 +104,7 @@ implementation
else
hreg:=cg.getintregister(helplist,OS_ADDR);
- reference_reset(tmpref,sizeof(pint));
+ reference_reset(tmpref,sizeof(pint),[]);
tmpref.offset:=spilltemp.offset;
tmpref.refaddr:=addr_high;
helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
@@ -112,7 +112,7 @@ implementation
tmpref.refaddr:=addr_low;
helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
- reference_reset_base(tmpref,hreg,0,sizeof(aint));
+ reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
tmpref.index:=spilltemp.base;
helpins:=spilling_create_load(tmpref,tempreg);
@@ -140,7 +140,7 @@ implementation
else
hreg:=cg.getintregister(helplist,OS_ADDR);
- reference_reset(tmpref,sizeof(aint));
+ reference_reset(tmpref,sizeof(aint),[]);
tmpref.offset:=spilltemp.offset;
tmpref.refaddr:=addr_high;
helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
@@ -148,7 +148,7 @@ implementation
tmpref.refaddr:=addr_low;
helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
- reference_reset_base(tmpref,hreg,0,sizeof(aint));
+ reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
tmpref.index:=spilltemp.base;
helplist.concat(spilling_create_store(tempreg,tmpref));
diff --git a/compiler/systems/t_win.pas b/compiler/systems/t_win.pas
index db1a84c639..720afc32e4 100644
--- a/compiler/systems/t_win.pas
+++ b/compiler/systems/t_win.pas
@@ -525,15 +525,15 @@ implementation
current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(ExtractFileName(ImportLibrary.Name)+'_index_'+tostr(ImportSymbol.ordnr),AT_FUNCTION,0,voidcodepointertype));
current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
{$ifdef ARM}
- reference_reset_symbol(href,l5,0,sizeof(pint));
+ reference_reset_symbol(href,l5,0,sizeof(pint),[]);
current_asmdata.asmlists[al_imports].concat(Taicpu.op_reg_ref(A_LDR,NR_R12,href));
- reference_reset_base(href,NR_R12,0,sizeof(pint));
+ reference_reset_base(href,NR_R12,0,sizeof(pint),[]);
current_asmdata.asmlists[al_imports].concat(Taicpu.op_reg_ref(A_LDR,NR_R15,href));
current_asmdata.asmlists[al_imports].concat(Tai_label.Create(l5));
- reference_reset_symbol(href,l4,0,sizeof(pint));
+ reference_reset_symbol(href,l4,0,sizeof(pint),[]);
current_asmdata.asmlists[al_imports].concat(tai_const.create_sym_offset(href.symbol,href.offset));
{$else ARM}
- reference_reset_symbol(href,l4,0,sizeof(pint));
+ reference_reset_symbol(href,l4,0,sizeof(pint),[]);
{$ifdef X86_64}
href.base:=NR_RIP;
{$endif X86_64}
diff --git a/compiler/tgobj.pas b/compiler/tgobj.pas
index df69deed64..c6d91eb324 100644
--- a/compiler/tgobj.pas
+++ b/compiler/tgobj.pas
@@ -446,7 +446,7 @@ implementation
{$else}
list.concat(tai_tempalloc.alloc(tl^.pos,tl^.size));
{$endif}
- reference_reset_base(ref,current_procinfo.framepointer,tl^.pos,alignment);
+ reference_reset_base(ref,current_procinfo.framepointer,tl^.pos,alignment,[]);
end;
diff --git a/compiler/x86/aasmcpu.pas b/compiler/x86/aasmcpu.pas
index da5a9d773d..7a4a0ceca1 100644
--- a/compiler/x86/aasmcpu.pas
+++ b/compiler/x86/aasmcpu.pas
@@ -3664,7 +3664,7 @@ implementation
var
r: treference;
begin
- reference_reset_symbol(r,s,0,1);
+ reference_reset_symbol(r,s,0,1,[]);
r.refaddr:=addr_seg;
loadref(opidx,r);
end;
diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas
index 82431f532a..444600593f 100644
--- a/compiler/x86/cgx86.pas
+++ b/compiler/x86/cgx86.pas
@@ -467,7 +467,7 @@ unit cgx86;
else
begin
{ don't use add, as the flags may contain a value }
- reference_reset_base(href,hreg,0,ref.alignment);
+ reference_reset_base(href,hreg,0,ref.alignment,[]);
href.index:=ref.index;
href.scalefactor:=ref.scalefactor;
list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,hreg));
@@ -487,7 +487,7 @@ unit cgx86;
if (ref.base<>NR_NO) or
(ref.index<>NR_NO) then
begin
- reference_reset_symbol(href,ref.symbol,0,ref.alignment);
+ reference_reset_symbol(href,ref.symbol,0,ref.alignment,[]);
hreg:=getaddressregister(list);
href.refaddr:=addr_pic_no_got;
href.base:=NR_RIP;
@@ -503,7 +503,7 @@ unit cgx86;
end
else
begin
- reference_reset_symbol(href,ref.symbol,0,ref.alignment);
+ reference_reset_symbol(href,ref.symbol,0,ref.alignment,[]);
hreg:=getaddressregister(list);
href.refaddr:=addr_pic;
href.base:=NR_RIP;
@@ -521,7 +521,7 @@ unit cgx86;
else
begin
{ don't use add, as the flags may contain a value }
- reference_reset_base(href,ref.base,0,ref.alignment);
+ reference_reset_base(href,ref.base,0,ref.alignment,[]);
href.index:=hreg;
ref.base:=getaddressregister(list);
list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,ref.base));
@@ -540,7 +540,7 @@ unit cgx86;
else
begin
{ Use temp register to load calculated 64-bit symbol address for complex references }
- reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+ reference_reset_symbol(href,ref.symbol,0,sizeof(pint),[]);
href.base:=NR_RIP;
href.refaddr:=addr_pic_no_got;
hreg:=GetAddressRegister(list);
@@ -556,7 +556,7 @@ unit cgx86;
else
begin
{ don't use add, as the flags may contain a value }
- reference_reset_base(href,ref.base,0,ref.alignment);
+ reference_reset_base(href,ref.base,0,ref.alignment,[]);
href.index:=hreg;
ref.base:=getaddressregister(list);
list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,ref.base));
@@ -593,7 +593,7 @@ unit cgx86;
else if (cs_create_pic in current_settings.moduleswitches) and
assigned(ref.symbol) then
begin
- reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+ reference_reset_symbol(href,ref.symbol,0,sizeof(pint),[]);
href.base:=current_procinfo.got;
href.refaddr:=addr_pic;
include(current_procinfo.flags,pi_needs_got);
@@ -615,7 +615,7 @@ unit cgx86;
else
begin
{ don't use add, as the flags may contain a value }
- reference_reset_base(href,ref.base,0,ref.alignment);
+ reference_reset_base(href,ref.base,0,ref.alignment,[]);
href.index:=hreg;
list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
ref.base:=hreg;
@@ -663,14 +663,14 @@ unit cgx86;
begin
{ load the symbol into a register }
hreg:=getaddressregister(list);
- reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
+ reference_reset_symbol(href,ref.symbol,0,sizeof(pint),[]);
{ tell make_simple_ref that we are loading the symbol address via an indirect
symbol and that hence it should not call make_direct_ref() again }
a_load_ref_reg_internal(list,OS_ADDR,OS_ADDR,href,hreg,true);
if ref.base<>NR_NO then
begin
{ fold symbol register into base register }
- reference_reset_base(href,hreg,0,sizeof(pint));
+ reference_reset_base(href,hreg,0,ref.alignment,[]);
href.index:=ref.base;
hreg:=getaddressregister(list);
a_loadaddr_ref_reg(list,href,hreg);
@@ -799,7 +799,7 @@ unit cgx86;
list.concat(taicpu.op_sym(A_JMP,S_NO,current_asmdata.RefAsmSymbol(s,AT_FUNCTION)))
else
begin
- reference_reset_symbol(r,get_darwin_call_stub(s,false),0,sizeof(pint));
+ reference_reset_symbol(r,get_darwin_call_stub(s,false),0,sizeof(pint),[]);
r.refaddr:=addr_full;
list.concat(taicpu.op_ref(A_JMP,S_NO,r));
end;
@@ -857,7 +857,7 @@ unit cgx86;
sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
else
sym:=current_asmdata.WeakRefAsmSymbol(s,AT_FUNCTION);
- reference_reset_symbol(r,sym,0,sizeof(pint));
+ reference_reset_symbol(r,sym,0,sizeof(pint),[]);
if (cs_create_pic in current_settings.moduleswitches) and
{ darwin's assembler doesn't want @PLT after call symbols }
not(target_info.system in [system_x86_64_darwin,system_i386_iphonesim,system_x86_64_iphonesim]) then
@@ -872,7 +872,7 @@ unit cgx86;
end
else
begin
- reference_reset_symbol(r,get_darwin_call_stub(s,weak),0,sizeof(pint));
+ reference_reset_symbol(r,get_darwin_call_stub(s,weak),0,sizeof(pint),[]);
r.refaddr:=addr_full;
end;
list.concat(taicpu.op_ref(A_CALL,S_NO,r));
@@ -891,7 +891,7 @@ unit cgx86;
r : treference;
begin
sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION);
- reference_reset_symbol(r,sym,0,sizeof(pint));
+ reference_reset_symbol(r,sym,0,sizeof(pint),[]);
r.refaddr:=addr_full;
list.concat(taicpu.op_ref(A_CALL,S_NO,r));
end;
@@ -1076,13 +1076,13 @@ unit cgx86;
begin
reference_reset_base(tmpref,
g_indirect_sym_load(list,dirref.symbol.name,asmsym2indsymflags(dirref.symbol)),
- offset,sizeof(pint));
+ offset,sizeof(pint),[]);
a_loadaddr_ref_reg(list,tmpref,r);
end
else
begin
include(current_procinfo.flags,pi_needs_got);
- reference_reset_base(tmpref,current_procinfo.got,offset,dirref.alignment);
+ reference_reset_base(tmpref,current_procinfo.got,offset,dirref.alignment,[]);
tmpref.symbol:=symbol;
tmpref.relsymbol:=current_procinfo.CurrGOTLabel;
list.concat(Taicpu.op_ref_reg(A_LEA,tcgsize2opsize[OS_ADDR],tmpref,r));
@@ -1095,12 +1095,12 @@ unit cgx86;
then
begin
{$ifdef x86_64}
- reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint));
+ reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint),[]);
tmpref.refaddr:=addr_pic;
tmpref.base:=NR_RIP;
list.concat(taicpu.op_ref_reg(A_MOV,S_Q,tmpref,r));
{$else x86_64}
- reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint));
+ reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint),[]);
tmpref.refaddr:=addr_pic;
tmpref.base:=current_procinfo.got;
include(current_procinfo.flags,pi_needs_got);
@@ -1159,7 +1159,7 @@ unit cgx86;
system_i386_linux,system_i386_android:
if segment=NR_GS then
begin
- reference_reset_symbol(tmpref,current_asmdata.RefAsmSymbol('___fpc_threadvar_offset',AT_DATA),0,sizeof(pint));
+ reference_reset_symbol(tmpref,current_asmdata.RefAsmSymbol('___fpc_threadvar_offset',AT_DATA),0,sizeof(pint),[]);
tmpref.segment:=NR_GS;
list.concat(Taicpu.op_ref_reg(A_ADD,tcgsize2opsize[OS_ADDR],tmpref,r));
end
@@ -1666,7 +1666,7 @@ unit cgx86;
not(cs_check_overflow in current_settings.localswitches) and
(a>1) and ispowerof2(int64(a-1),power) and (power in [1..3]) then
begin
- reference_reset_base(href,src,0,0);
+ reference_reset_base(href,src,0,0,[]);
href.index:=src;
href.scalefactor:=a-1;
list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
@@ -1675,7 +1675,7 @@ unit cgx86;
not(cs_check_overflow in current_settings.localswitches) and
(a>1) and ispowerof2(int64(a),power) and (power in [1..3]) then
begin
- reference_reset_base(href,NR_NO,0,0);
+ reference_reset_base(href,NR_NO,0,0,[]);
href.index:=src;
href.scalefactor:=a;
list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
@@ -1702,7 +1702,7 @@ unit cgx86;
{$push} {$R-}{$Q-}
al := longint (a);
{$pop}
- reference_reset_base(href,src,al,0);
+ reference_reset_base(href,src,al,0,[]);
list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
end
else if (op=OP_SUB) and
@@ -1713,7 +1713,7 @@ unit cgx86;
) and
not(cs_check_overflow in current_settings.localswitches) then
begin
- reference_reset_base(href,src,-a,0);
+ reference_reset_base(href,src,-a,0,[]);
list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
end
else if (op in [OP_ROR,OP_ROL]) and
@@ -1742,7 +1742,7 @@ unit cgx86;
if (op=OP_ADD) and (size in [OS_32,OS_S32,OS_64,OS_S64]) and
not(cs_check_overflow in current_settings.localswitches) then
begin
- reference_reset_base(href,src1,0,0);
+ reference_reset_base(href,src1,0,0,[]);
href.index:=src2;
list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
end
@@ -2773,7 +2773,7 @@ unit cgx86;
var
href : treference;
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,-a,0);
+ reference_reset_base(href,NR_STACK_POINTER_REG,-a,0,[]);
{ normally, lea is a better choice than a sub to adjust the stack pointer }
list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
end;
@@ -2801,7 +2801,7 @@ unit cgx86;
decrease_sp(localsize-4);
for i:=1 to localsize div winstackpagesize do
begin
- reference_reset_base(href,NR_ESP,localsize-i*winstackpagesize,4);
+ reference_reset_base(href,NR_ESP,localsize-i*winstackpagesize,4,[]);
list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
end;
list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
@@ -2825,7 +2825,7 @@ unit cgx86;
list.concat(Taicpu.op_const_reg(A_SUB,S_L,1,NR_EDI));
a_jmp_cond(list,OC_NE,again);
decrease_sp(localsize mod winstackpagesize-4);
- reference_reset_base(href,NR_ESP,localsize-4,4);
+ reference_reset_base(href,NR_ESP,localsize-4,4,[]);
list.concat(Taicpu.op_ref_reg(A_MOV,S_L,href,NR_EDI));
a_reg_dealloc(list,NR_EDI);
end
@@ -2845,10 +2845,10 @@ unit cgx86;
decrease_sp(localsize);
for i:=1 to localsize div winstackpagesize do
begin
- reference_reset_base(href,NR_RSP,localsize-i*winstackpagesize+4,4);
+ reference_reset_base(href,NR_RSP,localsize-i*winstackpagesize+4,4,[]);
list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
end;
- reference_reset_base(href,NR_RSP,0,4);
+ reference_reset_base(href,NR_RSP,0,4,[]);
list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
end
else
@@ -2858,7 +2858,7 @@ unit cgx86;
list.concat(Taicpu.op_const_reg(A_MOV,S_Q,localsize div winstackpagesize,NR_R10));
a_label(list,again);
decrease_sp(winstackpagesize);
- reference_reset_base(href,NR_RSP,0,4);
+ reference_reset_base(href,NR_RSP,0,4,[]);
list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
if UseIncDec then
list.concat(Taicpu.op_reg(A_DEC,S_Q,NR_R10))
@@ -2986,14 +2986,14 @@ unit cgx86;
end
else if current_settings.x86memorymodel=mm_huge then
begin
- reference_reset(fardataseg,0);
+ reference_reset(fardataseg,0,[]);
fardataseg.refaddr:=addr_fardataseg;
list.concat(Taicpu.Op_ref_reg(A_MOV,S_W,fardataseg,NR_AX));
list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
end
else
begin
- reference_reset(dgroup,0);
+ reference_reset(dgroup,0,[]);
dgroup.refaddr:=addr_dgroup;
list.concat(Taicpu.Op_ref_reg(A_MOV,S_W,dgroup,NR_AX));
list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
@@ -3101,7 +3101,7 @@ unit cgx86;
not (po_interrupt in current_procinfo.procdef.procoptions) then
begin
list.concat(Taicpu.op_reg(A_PUSH,S_W,NR_DS));
- reference_reset(fardataseg,0);
+ reference_reset(fardataseg,0,[]);
fardataseg.refaddr:=addr_fardataseg;
if current_procinfo.procdef.proccalloption=pocall_register then
begin
@@ -3137,7 +3137,7 @@ unit cgx86;
push_regs;
reference_reset_base(current_procinfo.save_regs_ref,
current_procinfo.framepointer,
- -(localsize+regsize),sizeof(aint));
+ -(localsize+regsize),sizeof(aint),[]);
end;
{$endif i386}
end;
diff --git a/compiler/x86/hlcgx86.pas b/compiler/x86/hlcgx86.pas
index 7ab04a8228..b38ed19ff1 100644
--- a/compiler/x86/hlcgx86.pas
+++ b/compiler/x86/hlcgx86.pas
@@ -77,7 +77,7 @@ implementation
end;
sym:=current_asmdata.RefAsmSymbol(externalname,AT_FUNCTION);
- reference_reset_symbol(ref,sym,0,sizeof(pint));
+ reference_reset_symbol(ref,sym,0,sizeof(pint),[]);
{ create pic'ed? }
if (cs_create_pic in current_settings.moduleswitches) and
diff --git a/compiler/x86/nx86add.pas b/compiler/x86/nx86add.pas
index 06427431d8..c590949af8 100644
--- a/compiler/x86/nx86add.pas
+++ b/compiler/x86/nx86add.pas
@@ -174,7 +174,7 @@ unit nx86add;
(power in [1..3]) and
not(cs_check_overflow in current_settings.localswitches) then
begin
- reference_reset_base(href,left.location.register,0,0);
+ reference_reset_base(href,left.location.register,0,0,[]);
href.index:=left.location.register;
href.scalefactor:=int64(right.location.value)-1;
left.location.register:=cg.getintregister(current_asmdata.CurrAsmList,opsize);
diff --git a/compiler/x86/nx86cnv.pas b/compiler/x86/nx86cnv.pas
index 8b51b57f54..8c82e77d85 100644
--- a/compiler/x86/nx86cnv.pas
+++ b/compiler/x86/nx86cnv.pas
@@ -424,7 +424,7 @@ implementation
current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
{ I got this constant from a test program (FK) }
current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit($5f800000));
- reference_reset_symbol(href,l1,0,4);
+ reference_reset_symbol(href,l1,0,4,[]);
tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,href);
current_asmdata.CurrAsmList.concat(Taicpu.Op_ref(A_FADD,S_FS,href));
cg.a_label(current_asmdata.CurrAsmList,l2);
diff --git a/compiler/x86/nx86inl.pas b/compiler/x86/nx86inl.pas
index 033b7e3c48..c455232998 100644
--- a/compiler/x86/nx86inl.pas
+++ b/compiler/x86/nx86inl.pas
@@ -341,7 +341,7 @@ 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);
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_SINGLE',AT_DATA),0,4,[]);
tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList, href);
if UseAVX then
current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
@@ -351,7 +351,7 @@ implementation
end;
s64real:
begin
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_DOUBLE',AT_DATA),0,4);
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(target_info.cprefix+'FPC_ABSMASK_DOUBLE',AT_DATA),0,4,[]);
tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList, href);
if UseAVX then
current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
@@ -403,7 +403,7 @@ implementation
{$endif x86_64}
begin
load_fpu_location(left);
- location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
+ location_reset_ref(location,LOC_REFERENCE,OS_S64,0,[]);
tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
emit_ref(A_FISTP,S_IQ,location.reference);
tcgx86(cg).dec_fpu_stack;
@@ -449,7 +449,7 @@ implementation
if (current_settings.fputype>=fpu_sse3) then
begin
load_fpu_location(left);
- location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
+ location_reset_ref(location,LOC_REFERENCE,OS_S64,0,[]);
tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
emit_ref(A_FISTTP,S_IQ,location.reference);
tcgx86(cg).dec_fpu_stack;
@@ -474,7 +474,7 @@ implementation
emit_const_ref(A_OR,S_W,$0f00,newcw);
load_fpu_location(left);
emit_ref(A_FLDCW,S_NO,newcw);
- location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
+ location_reset_ref(location,LOC_REFERENCE,OS_S64,0,[]);
tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
emit_ref(A_FISTP,S_IQ,location.reference);
tcgx86(cg).dec_fpu_stack;
@@ -610,7 +610,7 @@ implementation
begin
r:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,r);
- reference_reset_base(ref,r,0,left.location.reference.alignment);
+ reference_reset_base(ref,r,0,left.location.reference.alignment,left.location.reference.volatility);
current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_PREFETCHNTA,S_NO,ref));
end;
else
diff --git a/compiler/x86/nx86ld.pas b/compiler/x86/nx86ld.pas
index 2857247fb3..91bb3b3282 100644
--- a/compiler/x86/nx86ld.pas
+++ b/compiler/x86/nx86ld.pas
@@ -65,9 +65,9 @@ implementation
pd:=search_system_proc('fpc_tls_add');
paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
if not(vo_is_weak_external in gvs.varoptions) then
- reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,sizeof(pint))
+ reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname,AT_DATA,use_indirect_symbol(gvs)),0,sizeof(pint),[])
else
- reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,sizeof(pint));
+ reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),0,sizeof(pint),[]);
cg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,href,paraloc1);
paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
paraloc1.done;
diff --git a/compiler/x86/nx86mat.pas b/compiler/x86/nx86mat.pas
index ba6f737385..473ace1ba8 100644
--- a/compiler/x86/nx86mat.pas
+++ b/compiler/x86/nx86mat.pas
@@ -183,7 +183,7 @@ interface
internalerror(2004110215);
end;
- reference_reset_symbol(href,l1,0,resultdef.alignment);
+ reference_reset_symbol(href,l1,0,resultdef.alignment,[]);
if UseAVX then
cg.a_opmm_ref_reg_reg(current_asmdata.CurrAsmList,OP_XOR,left.location.size,href,left.location.register,location.register,nil)
diff --git a/compiler/x86/nx86mem.pas b/compiler/x86/nx86mem.pas
index f4a371e11d..523c35fca1 100644
--- a/compiler/x86/nx86mem.pas
+++ b/compiler/x86/nx86mem.pas
@@ -120,7 +120,7 @@ implementation
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
{ reference_reset_base kills the segment, so make sure we preserve it }
saveseg:=location.reference.segment;
- reference_reset_base(location.reference,hreg,0,location.reference.alignment);
+ reference_reset_base(location.reference,hreg,0,location.reference.alignment,location.reference.volatility);
location.reference.segment:=saveseg;
end;
{ insert the new index register and scalefactor or
diff --git a/compiler/x86/nx86set.pas b/compiler/x86/nx86set.pas
index dd98fb54fb..0edcabba8c 100644
--- a/compiler/x86/nx86set.pas
+++ b/compiler/x86/nx86set.pas
@@ -120,7 +120,7 @@ implementation
indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_INT);
cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_INT,hregister,indexreg);
{ create reference }
- reference_reset_symbol(href,table,0,sizeof(pint));
+ reference_reset_symbol(href,table,0,sizeof(pint),[]);
href.offset:=(-aint(min_))*sizeof(aint);
href.index:=indexreg;
{$ifdef i8086}
diff --git a/compiler/x86_64/cgcpu.pas b/compiler/x86_64/cgcpu.pas
index f128bb8278..288b1ea921 100644
--- a/compiler/x86_64/cgcpu.pas
+++ b/compiler/x86_64/cgcpu.pas
@@ -254,7 +254,7 @@ unit cgcpu;
begin
localsize:=align(localsize,target_info.stackalign)+xmmsize;
reference_reset_base(current_procinfo.save_regs_ref,NR_STACK_POINTER_REG,
- localsize-xmmsize,tcgsize2size[OS_VECTOR]);
+ localsize-xmmsize,tcgsize2size[OS_VECTOR],[]);
end;
{ allocate stackframe space }
@@ -353,7 +353,7 @@ unit cgcpu;
var
href : treference;
begin
- reference_reset_base(href,NR_STACK_POINTER_REG,a,0);
+ reference_reset_base(href,NR_STACK_POINTER_REG,a,0,[]);
{ normally, lea is a better choice than an add }
list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
end;
@@ -399,7 +399,7 @@ unit cgcpu;
'add $constant,%rsp' and 'lea offset(FPREG),%rsp' as belonging to
the function epilog.
Neither 'leave' nor even 'mov %FPREG,%rsp' are allowed. }
- reference_reset_base(href,current_procinfo.framepointer,0,sizeof(pint));
+ reference_reset_base(href,current_procinfo.framepointer,0,sizeof(pint),[]);
list.concat(Taicpu.op_ref_reg(A_LEA,tcgsize2opsize[OS_ADDR],href,NR_STACK_POINTER_REG));
list.concat(Taicpu.op_reg(A_POP,tcgsize2opsize[OS_ADDR],current_procinfo.framepointer));
end
@@ -447,7 +447,7 @@ unit cgcpu;
para2.init;
paramanager.getintparaloc(list,pd,1,para1);
paramanager.getintparaloc(list,pd,2,para2);
- reference_reset_symbol(href,l,0,1);
+ reference_reset_symbol(href,l,0,1,[]);
{ TODO: using RSP is correct only while the stack is fixed!!
(true now, but will change if/when allocating from stack is implemented) }
a_load_reg_cgpara(list,OS_ADDR,NR_STACK_POINTER_REG,para1);
diff --git a/compiler/x86_64/hlcgcpu.pas b/compiler/x86_64/hlcgcpu.pas
index 14904706ac..4dde5a0ca5 100644
--- a/compiler/x86_64/hlcgcpu.pas
+++ b/compiler/x86_64/hlcgcpu.pas
@@ -87,18 +87,18 @@ implementation
{ load vmt from first paramter }
{ win64 uses a different abi }
if target_info.system=system_x86_64_win64 then
- reference_reset_base(href,voidpointertype,NR_RCX,0,sizeof(pint))
+ reference_reset_base(href,voidpointertype,NR_RCX,0,sizeof(pint),[])
else
- reference_reset_base(href,voidpointertype,NR_RDI,0,sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_RDI,0,sizeof(pint),[]);
cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_RAX);
{ jmp *vmtoffs(%eax) ; method offs }
- reference_reset_base(href,voidpointertype,NR_RAX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+ reference_reset_base(href,voidpointertype,NR_RAX,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint),[]);
list.concat(taicpu.op_ref(A_JMP,S_Q,href));
end
else
begin
sym:=current_asmdata.RefAsmSymbol(procdef.mangledname,AT_FUNCTION);
- reference_reset_symbol(r,sym,0,sizeof(pint));
+ reference_reset_symbol(r,sym,0,sizeof(pint),[]);
if (cs_create_pic in current_settings.moduleswitches) and
{ darwin/x86_64's assembler doesn't want @PLT after call symbols }
not(target_info.system in systems_darwin) then
diff --git a/compiler/x86_64/nx64add.pas b/compiler/x86_64/nx64add.pas
index ecac934de9..cbe00b8535 100644
--- a/compiler/x86_64/nx64add.pas
+++ b/compiler/x86_64/nx64add.pas
@@ -76,7 +76,7 @@ interface
cgsize:TCgSize;
opsize:topsize;
begin
- reference_reset(ref,0);
+ reference_reset(ref,0,[]);
reg:=NR_NO;
cgsize:=def_cgsize(resultdef);
diff --git a/compiler/x86_64/nx64cal.pas b/compiler/x86_64/nx64cal.pas
index 17a1a4edd2..56f329726f 100644
--- a/compiler/x86_64/nx64cal.pas
+++ b/compiler/x86_64/nx64cal.pas
@@ -69,11 +69,11 @@ implementation
begin
// one syscall convention for AROS
current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall')));
- reference_reset(tmpref,sizeof(pint));
+ reference_reset(tmpref,sizeof(pint),[]);
tmpref.symbol:=current_asmdata.RefAsmSymbol(tstaticvarsym(tcpuprocdef(procdefinition).libsym).mangledname,AT_FUNCTION);
cg.getcpuregister(current_asmdata.CurrAsmList,NR_RAX);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_RAX);
- reference_reset_base(tmpref,NR_RAX,-tprocdef(procdefinition).extnumber,sizeof(pint));
+ reference_reset_base(tmpref,NR_RAX,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,NR_RAX);
cg.a_call_reg(current_asmdata.CurrAsmList,NR_RAX);
cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_RAX);
diff --git a/compiler/x86_64/nx64cnv.pas b/compiler/x86_64/nx64cnv.pas
index a2d8fdab1e..a8cce014ba 100644
--- a/compiler/x86_64/nx64cnv.pas
+++ b/compiler/x86_64/nx64cnv.pas
@@ -138,7 +138,7 @@ implementation
cg.a_jmp_flags(current_asmdata.CurrAsmList,F_NC,l2);
new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,l1.name,const_align(sizeof(pint)));
current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
- reference_reset_symbol(href,l1,0,4);
+ reference_reset_symbol(href,l1,0,4,[]);
{ simplify for PIC }
tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,href);
diff --git a/compiler/x86_64/nx64set.pas b/compiler/x86_64/nx64set.pas
index d24d5a29e7..40ea831d43 100644
--- a/compiler/x86_64/nx64set.pas
+++ b/compiler/x86_64/nx64set.pas
@@ -121,17 +121,17 @@ implementation
indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_ADDR);
cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_ADDR,hregister,indexreg);
{ load table address }
- reference_reset_symbol(href,tablelabel,0,4);
+ reference_reset_symbol(href,tablelabel,0,4,[]);
basereg:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,basereg);
{ load table slot, 32-bit sign extended }
- reference_reset_base(href,basereg,-aint(min_)*4,4);
+ reference_reset_base(href,basereg,-aint(min_)*4,4,[]);
href.index:=indexreg;
href.scalefactor:=4;
jumpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_S32,OS_ADDR,href,jumpreg);
{ add table address }
- reference_reset_base(href,basereg,0,sizeof(pint));
+ reference_reset_base(href,basereg,0,sizeof(pint),[]);
href.index:=jumpreg;
href.scalefactor:=1;
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,jumpreg);