浏览代码

+ 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: trunk@34996 -

Jonas Maebe 8 年之前
父节点
当前提交
a25ebbba3e
共有 100 个文件被更改,包括 580 次插入558 次删除
  1. 13 13
      compiler/aarch64/cgcpu.pas
  2. 2 2
      compiler/aarch64/hlcgcpu.pas
  3. 1 1
      compiler/aarch64/ncpumem.pas
  4. 2 2
      compiler/aarch64/ncpuset.pas
  5. 1 1
      compiler/aarch64/rgcpu.pas
  6. 1 1
      compiler/aasmsym.pas
  7. 1 1
      compiler/aasmtai.pas
  8. 40 40
      compiler/arm/cgcpu.pas
  9. 7 7
      compiler/arm/hlcgcpu.pas
  10. 4 4
      compiler/arm/narmcal.pas
  11. 1 1
      compiler/arm/narmcnv.pas
  12. 1 1
      compiler/arm/narmcon.pas
  13. 1 1
      compiler/arm/narminl.pas
  14. 4 4
      compiler/arm/narmset.pas
  15. 1 1
      compiler/arm/raarmgas.pas
  16. 8 8
      compiler/arm/rgcpu.pas
  17. 7 7
      compiler/avr/cgcpu.pas
  18. 1 1
      compiler/avr/raavrgas.pas
  19. 2 2
      compiler/avr/rgcpu.pas
  20. 11 11
      compiler/cgobj.pas
  21. 24 11
      compiler/cgutils.pas
  22. 4 4
      compiler/hlcg2ll.pas
  23. 25 25
      compiler/hlcgobj.pas
  24. 5 5
      compiler/i386/aoptcpu.pas
  25. 3 3
      compiler/i386/cgcpu.pas
  26. 10 10
      compiler/i386/hlcgcpu.pas
  27. 1 1
      compiler/i386/n386add.pas
  28. 3 3
      compiler/i386/n386cal.pas
  29. 2 2
      compiler/i386/n386flw.pas
  30. 7 7
      compiler/i8086/cgcpu.pas
  31. 18 18
      compiler/i8086/hlcgcpu.pas
  32. 1 1
      compiler/i8086/n8086add.pas
  33. 1 1
      compiler/i8086/n8086inl.pas
  34. 11 11
      compiler/i8086/n8086ld.pas
  35. 2 2
      compiler/i8086/n8086mem.pas
  36. 9 9
      compiler/jvm/hlcgcpu.pas
  37. 1 1
      compiler/jvm/njvmcal.pas
  38. 3 3
      compiler/jvm/njvmcnv.pas
  39. 2 2
      compiler/jvm/njvmflw.pas
  40. 2 2
      compiler/jvm/njvmld.pas
  41. 4 4
      compiler/jvm/njvmmem.pas
  42. 18 18
      compiler/llvm/hlcgllvm.pas
  43. 4 4
      compiler/llvm/nllvmcnv.pas
  44. 2 2
      compiler/llvm/nllvmcon.pas
  45. 5 3
      compiler/llvm/nllvminl.pas
  46. 1 1
      compiler/llvm/nllvmld.pas
  47. 4 4
      compiler/llvm/nllvmmem.pas
  48. 1 1
      compiler/llvm/tgllvm.pas
  49. 2 2
      compiler/m68k/aoptcpu.pas
  50. 21 21
      compiler/m68k/cgcpu.pas
  51. 4 4
      compiler/m68k/hlcgcpu.pas
  52. 2 2
      compiler/m68k/n68kcal.pas
  53. 1 1
      compiler/m68k/n68kmem.pas
  54. 2 2
      compiler/m68k/rgcpu.pas
  55. 11 11
      compiler/mips/cgcpu.pas
  56. 5 5
      compiler/mips/hlcgcpu.pas
  57. 1 1
      compiler/mips/ncpucnv.pas
  58. 1 1
      compiler/mips/ncpuset.pas
  59. 2 2
      compiler/mips/rgcpu.pas
  60. 5 5
      compiler/ncgbas.pas
  61. 4 4
      compiler/ncgcal.pas
  62. 10 9
      compiler/ncgcnv.pas
  63. 5 5
      compiler/ncgcon.pas
  64. 2 2
      compiler/ncgflw.pas
  65. 6 4
      compiler/ncginl.pas
  66. 25 23
      compiler/ncgld.pas
  67. 19 17
      compiler/ncgmem.pas
  68. 1 1
      compiler/ncgobjc.pas
  69. 1 1
      compiler/ncgopt.pas
  70. 2 2
      compiler/ncgutil.pas
  71. 29 29
      compiler/powerpc/cgcpu.pas
  72. 5 5
      compiler/powerpc/nppccal.pas
  73. 19 19
      compiler/powerpc64/cgcpu.pas
  74. 1 1
      compiler/powerpc64/nppccnv.pas
  75. 15 15
      compiler/ppcgen/cgppc.pas
  76. 8 8
      compiler/ppcgen/hlcgppc.pas
  77. 1 1
      compiler/ppcgen/ngppcinl.pas
  78. 2 2
      compiler/ppcgen/ngppcset.pas
  79. 2 2
      compiler/ppcgen/rgcpu.pas
  80. 1 1
      compiler/procinfo.pas
  81. 11 11
      compiler/sparc/cgcpu.pas
  82. 2 2
      compiler/sparc/hlcgcpu.pas
  83. 1 1
      compiler/sparc/ncpucnv.pas
  84. 2 2
      compiler/sparc/ncpuset.pas
  85. 4 4
      compiler/sparc/rgcpu.pas
  86. 4 4
      compiler/systems/t_win.pas
  87. 1 1
      compiler/tgobj.pas
  88. 1 1
      compiler/x86/aasmcpu.pas
  89. 34 34
      compiler/x86/cgx86.pas
  90. 1 1
      compiler/x86/hlcgx86.pas
  91. 1 1
      compiler/x86/nx86add.pas
  92. 1 1
      compiler/x86/nx86cnv.pas
  93. 6 6
      compiler/x86/nx86inl.pas
  94. 2 2
      compiler/x86/nx86ld.pas
  95. 1 1
      compiler/x86/nx86mat.pas
  96. 1 1
      compiler/x86/nx86mem.pas
  97. 1 1
      compiler/x86/nx86set.pas
  98. 4 4
      compiler/x86_64/cgcpu.pas
  99. 4 4
      compiler/x86_64/hlcgcpu.pas
  100. 1 1
      compiler/x86_64/nx64add.pas

+ 13 - 13
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;

+ 2 - 2
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));

+ 1 - 1
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;

+ 2 - 2
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;

+ 1 - 1
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)

+ 1 - 1
compiler/aasmsym.pas

@@ -68,4 +68,4 @@ implementation
         end;
       end;
 
-end.
+end.

+ 1 - 1
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;

+ 40 - 40
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);

+ 7 - 7
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;

+ 4 - 4
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

+ 1 - 1
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));

+ 1 - 1
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;

+ 1 - 1
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;

+ 4 - 4
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;

+ 1 - 1
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;

+ 8 - 8
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));

+ 7 - 7
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;

+ 1 - 1
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);

+ 2 - 2
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;

+ 11 - 11
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;

+ 24 - 11
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;
 
 

+ 4 - 4
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}

+ 25 - 25
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

+ 5 - 5
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);

+ 3 - 3
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;

+ 10 - 10
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));

+ 1 - 1
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.

+ 3 - 3
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;

+ 2 - 2
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);

+ 7 - 7
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;

+ 18 - 18
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

+ 1 - 1
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;
 

+ 1 - 1
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

+ 11 - 11
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

+ 2 - 2
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

+ 9 - 9
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;
 

+ 1 - 1
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

+ 3 - 3
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;

+ 2 - 2
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;

+ 2 - 2
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;

+ 4 - 4
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);

+ 18 - 18
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;

+ 4 - 4
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);

+ 2 - 2
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));

+ 5 - 3
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

+ 1 - 1
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;

+ 4 - 4
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);

+ 1 - 1
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;

+ 2 - 2
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;

+ 21 - 21
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) }

+ 4 - 4
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;
 

+ 2 - 2
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

+ 1 - 1
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

+ 2 - 2
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));

+ 11 - 11
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));

+ 5 - 5
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));

+ 1 - 1
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 }

+ 1 - 1
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);

+ 2 - 2
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

+ 5 - 5
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;

+ 4 - 4
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

+ 10 - 9
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);

+ 5 - 5
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

+ 2 - 2
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;

+ 6 - 4
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;

+ 25 - 23
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);

+ 19 - 17
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

+ 1 - 1
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;
 

+ 1 - 1
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);

+ 2 - 2
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;

+ 29 - 29
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

+ 5 - 5
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);

+ 19 - 19
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;
 

+ 1 - 1
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 }

+ 15 - 15
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;

+ 8 - 8
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));

+ 1 - 1
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,

+ 2 - 2
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 }

+ 2 - 2
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);

+ 1 - 1
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);

+ 11 - 11
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);

+ 2 - 2
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 }

+ 1 - 1
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);
 

+ 2 - 2
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;

+ 4 - 4
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));

+ 4 - 4
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}

+ 1 - 1
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;
 
 

+ 1 - 1
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;

+ 34 - 34
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;

+ 1 - 1
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

+ 1 - 1
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);

+ 1 - 1
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);

+ 6 - 6
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

+ 2 - 2
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;

+ 1 - 1
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)

+ 1 - 1
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

+ 1 - 1
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}

+ 4 - 4
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);

+ 4 - 4
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

+ 1 - 1
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);

部分文件因为文件数量过多而无法显示