diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2016-11-27 18:17:37 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2016-11-27 18:17:37 +0000 |
commit | c18f3da68f01c737b722ec5d19a052b4a74e9308 (patch) | |
tree | f79d285de82063856b11673f7f8e749ed425a696 | |
parent | c24c856965f801d3d8e72361ffa1bc944127144d (diff) | |
download | fpc-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
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); |