Просмотр исходного кода

+ 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 лет назад
Родитель
Сommit
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
                (ref.index=preferred_newbasereg) then
               preferred_newbasereg:=getaddressregister(list);
               preferred_newbasereg:=getaddressregister(list);
             { load the (GOT) page }
             { 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
             if ((ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) and
                 (ref.symbol.bind in [AB_LOCAL,AB_GLOBAL])) or
                 (ref.symbol.bind in [AB_LOCAL,AB_GLOBAL])) or
                ((ref.symbol.typ=AT_DATA) and
                ((ref.symbol.typ=AT_DATA) and
@@ -185,7 +185,7 @@ implementation
               href.refaddr:=addr_gotpage;
               href.refaddr:=addr_gotpage;
             list.concat(taicpu.op_reg_ref(A_ADRP,preferred_newbasereg,href));
             list.concat(taicpu.op_reg_ref(A_ADRP,preferred_newbasereg,href));
             { load the GOT entry (= address of the variable) }
             { 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;
             href.symbol:=ref.symbol;
             { code symbols defined in the current compilation unit do not
             { code symbols defined in the current compilation unit do not
               have to be accessed via the GOT }
               have to be accessed via the GOT }
@@ -245,7 +245,7 @@ implementation
                       so.shiftmode:=ref.shiftmode;
                       so.shiftmode:=ref.shiftmode;
                       so.shiftimm:=ref.shiftimm;
                       so.shiftimm:=ref.shiftimm;
                       list.concat(taicpu.op_reg_reg_reg_shifterop(A_ADD,preferred_newbasereg,ref.base,ref.index,so));
                       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 }
                       { possibly still an invalid offset -> fall through }
                     end
                     end
                   else if ref.offset<>0 then
                   else if ref.offset<>0 then
@@ -291,7 +291,7 @@ implementation
                     end
                     end
                   else
                   else
                     a_op_reg_reg_reg(list,OP_ADD,OS_ADDR,ref.index,ref.base,preferred_newbasereg);
                     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
                   { fall through to the handling of base + offset, since the
                     offset may still be too big }
                     offset may still be too big }
                 end;
                 end;
@@ -379,7 +379,7 @@ implementation
                                 a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,ref.base,preferred_newbasereg);
                                 a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,ref.base,preferred_newbasereg);
                                 ref.offset:=0;
                                 ref.offset:=0;
                               end;
                               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;
                       end
                       end
                     else
                     else
@@ -407,7 +407,7 @@ implementation
                             preferred_newbasereg:=getaddressregister(list);
                             preferred_newbasereg:=getaddressregister(list);
                       end;
                       end;
                       a_op_const_reg_reg(list,OP_ADD,OS_ADDR,ref.offset,ref.base,preferred_newbasereg);
                       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
                 end;
                 end;
               A_LDUR,A_STUR:
               A_LDUR,A_STUR:
@@ -429,7 +429,7 @@ implementation
         if preferred_newbasereg=NR_NO then
         if preferred_newbasereg=NR_NO then
           preferred_newbasereg:=getaddressregister(list);
           preferred_newbasereg:=getaddressregister(list);
         a_load_const_reg(list,OS_ADDR,ref.offset,preferred_newbasereg);
         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;
       end;
 
 
 
 
@@ -1522,7 +1522,7 @@ implementation
         pairreg: tregister;
         pairreg: tregister;
       begin
       begin
         result:=0;
         result:=0;
-        reference_reset_base(ref,NR_SP,-16,16);
+        reference_reset_base(ref,NR_SP,-16,16,[]);
         ref.addressmode:=AM_PREINDEXED;
         ref.addressmode:=AM_PREINDEXED;
         pairreg:=NR_NO;
         pairreg:=NR_NO;
         { store all used registers pairwise }
         { store all used registers pairwise }
@@ -1570,7 +1570,7 @@ implementation
         localsize:=align(localsize,16);
         localsize:=align(localsize,16);
 
 
         { save stack pointer and return address }
         { 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;
         ref.addressmode:=AM_PREINDEXED;
         list.concat(taicpu.op_reg_reg_ref(A_STP,NR_FP,NR_LR,ref));
         list.concat(taicpu.op_reg_reg_ref(A_STP,NR_FP,NR_LR,ref));
         { initialise frame pointer }
         { initialise frame pointer }
@@ -1646,7 +1646,7 @@ implementation
         pairreg: tregister;
         pairreg: tregister;
         regcount: longint;
         regcount: longint;
       begin
       begin
-        reference_reset_base(ref,NR_SP,16,16);
+        reference_reset_base(ref,NR_SP,16,16,[]);
         ref.addressmode:=AM_POSTINDEXED;
         ref.addressmode:=AM_POSTINDEXED;
         { highest reg stored twice? }
         { highest reg stored twice? }
         regcount:=0;
         regcount:=0;
@@ -1717,7 +1717,7 @@ implementation
               a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_FP,NR_SP);
               a_load_reg_reg(list,OS_ADDR,OS_ADDR,NR_FP,NR_SP);
 
 
             { restore framepointer and return address }
             { 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;
             ref.addressmode:=AM_POSTINDEXED;
             list.concat(taicpu.op_reg_reg_ref(A_LDP,NR_FP,NR_LR,ref));
             list.concat(taicpu.op_reg_reg_ref(A_LDP,NR_FP,NR_LR,ref));
           end;
           end;
@@ -1918,12 +1918,12 @@ implementation
           basereplaced:=true;
           basereplaced:=true;
           if forcepostindexing then
           if forcepostindexing then
             begin
             begin
-              reference_reset_base(ref,tmpreg,scaledoffset,ref.alignment);
+              reference_reset_base(ref,tmpreg,scaledoffset,ref.alignment,ref.volatility);
               ref.addressmode:=AM_POSTINDEXED;
               ref.addressmode:=AM_POSTINDEXED;
             end
             end
           else
           else
             begin
             begin
-              reference_reset_base(ref,tmpreg,0,ref.alignment);
+              reference_reset_base(ref,tmpreg,0,ref.alignment,ref.volatility);
               ref.addressmode:=AM_OFFSET;
               ref.addressmode:=AM_OFFSET;
             end
             end
         end;
         end;

+ 2 - 2
compiler/aarch64/hlcgcpu.pas

@@ -185,11 +185,11 @@ implementation
           if (procdef.extnumber=$ffff) then
           if (procdef.extnumber=$ffff) then
             Internalerror(200006139);
             Internalerror(200006139);
           { mov  0(%rdi),%rax ; load vmt}
           { 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);
           getcpuregister(list,NR_IP0);
           a_load_ref_reg(list,voidpointertype,voidpointertype,href,NR_IP0);
           a_load_ref_reg(list,voidpointertype,voidpointertype,href,NR_IP0);
           { jmp *vmtoffs(%eax) ; method offs }
           { 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;
           op:=A_LDR;
           tcgaarch64(cg).make_simple_ref(list,op,OS_ADDR,PF_None,href,NR_IP0);
           tcgaarch64(cg).make_simple_ref(list,op,OS_ADDR,PF_None,href,NR_IP0);
           list.concat(taicpu.op_reg_ref(op,NR_IP0,href));
           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;
           location.reference.offset:=0;
           base:=cg.getaddressregister(current_asmdata.CurrAsmList);
           base:=cg.getaddressregister(current_asmdata.CurrAsmList);
           cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,base);
           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;
         end;
       shift:=BsfDWord(l);
       shift:=BsfDWord(l);
       location.reference.index:=maybe_const_reg;
       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);
         indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_ADDR);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_ADDR,hregister,indexreg);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_ADDR,hregister,indexreg);
         { load table address }
         { load table address }
-        reference_reset_symbol(href,tablelabel,0,4);
+        reference_reset_symbol(href,tablelabel,0,4,[]);
         basereg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         basereg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,basereg);
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,basereg);
         { load table slot, 32-bit sign extended }
         { 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.index:=indexreg;
         href.shiftmode:=SM_LSL;
         href.shiftmode:=SM_LSL;
         href.shiftimm:=2;
         href.shiftimm:=2;

+ 1 - 1
compiler/aarch64/rgcpu.pas

@@ -83,7 +83,7 @@ implementation
               hreg:=cg.getaddressregister(helplist);
               hreg:=cg.getaddressregister(helplist);
 
 
             cg.a_load_const_reg(helplist,OS_ADDR,spilltemp.offset,hreg);
             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;
             tmpref.index:=hreg;
             if isload then
             if isload then
               helpins:=spilling_create_load(tmpref,tempreg)
               helpins:=spilling_create_load(tmpref,tempreg)

+ 1 - 1
compiler/aasmsym.pas

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

+ 1 - 1
compiler/aasmtai.pas

@@ -2569,7 +2569,7 @@ implementation
       var
       var
         r : treference;
         r : treference;
       begin
       begin
-        reference_reset_symbol(r,s,sofs,1);
+        reference_reset_symbol(r,s,sofs,1,[]);
         r.refaddr:=addr_full;
         r.refaddr:=addr_full;
         loadref(opidx,r);
         loadref(opidx,r);
       end;
       end;

+ 40 - 40
compiler/arm/cgcpu.pas

@@ -338,7 +338,7 @@ unit cgcpu;
             end
             end
           else
           else
             begin
             begin
-               reference_reset(hr,4);
+               reference_reset(hr,4,[]);
 
 
                current_asmdata.getjumplabel(l);
                current_asmdata.getjumplabel(l);
                cg.a_label(current_procinfo.aktlocaldata,l);
                cg.a_label(current_procinfo.aktlocaldata,l);
@@ -405,7 +405,7 @@ unit cgcpu;
                      begin
                      begin
                        tmpreg2:=getintregister(list,OS_INT);
                        tmpreg2:=getintregister(list,OS_INT);
                        a_loadaddr_ref_reg(list,ref,tmpreg2);
                        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
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -437,7 +437,7 @@ unit cgcpu;
                      begin
                      begin
                        tmpreg2:=getintregister(list,OS_INT);
                        tmpreg2:=getintregister(list,OS_INT);
                        a_loadaddr_ref_reg(list,ref,tmpreg2);
                        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
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -526,7 +526,7 @@ unit cgcpu;
                   begin
                   begin
                     { offset in the wrapper needs to be adjusted for the stored
                     { offset in the wrapper needs to be adjusted for the stored
                       return address }
                       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
                     if is_shifter_const(ioffset,shift) then
                       a_op_const_ref(list,OP_SUB,size,ioffset,href)
                       a_op_const_ref(list,OP_SUB,size,ioffset,href)
                     else
                     else
@@ -554,7 +554,7 @@ unit cgcpu;
             a_load_const_reg(list,size,a,paraloc.location^.register);
             a_load_const_reg(list,size,a,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
-               reference_reset(ref,paraloc.alignment);
+               reference_reset(ref,paraloc.alignment,[]);
                ref.base:=paraloc.location^.reference.index;
                ref.base:=paraloc.location^.reference.index;
                ref.offset:=paraloc.location^.reference.offset;
                ref.offset:=paraloc.location^.reference.offset;
                a_load_const_ref(list,size,a,ref);
                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);
                 a_load_ref_reg(list,location^.size,location^.size,tmpref,location^.register);
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 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 }
                   { doubles in softemu mode have a strange order of registers and references }
                   if location^.size=OS_32 then
                   if location^.size=OS_32 then
                     g_concatcopy(list,tmpref,ref,4)
                     g_concatcopy(list,tmpref,ref,4)
@@ -626,7 +626,7 @@ unit cgcpu;
             a_loadaddr_ref_reg(list,r,paraloc.location^.register);
             a_loadaddr_ref_reg(list,r,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
-              reference_reset(ref,paraloc.alignment);
+              reference_reset(ref,paraloc.alignment,[]);
               ref.base := paraloc.location^.reference.index;
               ref.base := paraloc.location^.reference.index;
               ref.offset := paraloc.location^.reference.offset;
               ref.offset := paraloc.location^.reference.offset;
               tmpreg := getintregister(list,OS_ADDR);
               tmpreg := getintregister(list,OS_ADDR);
@@ -658,7 +658,7 @@ unit cgcpu;
           sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
           sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
         else
         else
           sym:=current_asmdata.WeakRefAsmSymbol(s,AT_FUNCTION);
           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
         if (tf_pic_uses_got in target_info.flags) and
            (cs_create_pic in current_settings.moduleswitches) then
            (cs_create_pic in current_settings.moduleswitches) then
@@ -1689,7 +1689,7 @@ unit cgcpu;
                 end;
                 end;
               LOC_REFERENCE :
               LOC_REFERENCE :
                 begin
                 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 }
                   { concatcopy should choose the best way to copy the data }
                   g_concatcopy(list,href,href2,tcgsize2size[hloc^.size]);
                   g_concatcopy(list,href,href2,tcgsize2size[hloc^.size]);
                 end;
                 end;
@@ -1935,7 +1935,7 @@ unit cgcpu;
             if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
             if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
               a_reg_alloc(list,NR_FRAME_POINTER_REG);
               a_reg_alloc(list,NR_FRAME_POINTER_REG);
             { save int registers }
             { save int registers }
-            reference_reset(ref,4);
+            reference_reset(ref,4,[]);
             ref.index:=NR_STACK_POINTER_REG;
             ref.index:=NR_STACK_POINTER_REG;
             ref.addressmode:=AM_PREINDEXED;
             ref.addressmode:=AM_PREINDEXED;
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
@@ -2070,7 +2070,7 @@ unit cgcpu;
             if (mmregs<>[]) or
             if (mmregs<>[]) or
                (firstfloatreg<>RS_NO) then
                (firstfloatreg<>RS_NO) then
              begin
              begin
-               reference_reset(ref,4);
+               reference_reset(ref,4,[]);
                if (tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023) or
                if (tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023) or
                   (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16]) then
                   (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16]) then
                  begin
                  begin
@@ -2177,7 +2177,7 @@ unit cgcpu;
             if (firstfloatreg<>RS_NO) or
             if (firstfloatreg<>RS_NO) or
                (mmregs<>[]) then
                (mmregs<>[]) then
               begin
               begin
-                reference_reset(ref,4);
+                reference_reset(ref,4,[]);
                 if (tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023) or
                 if (tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023) or
                    (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16]) then
                    (current_settings.fputype in [fpu_vfpv2,fpu_vfpv3,fpu_vfpv4,fpu_vfpv3_d16]) then
                   begin
                   begin
@@ -2250,7 +2250,7 @@ unit cgcpu;
                 saveregs:=regs*[RS_R8,RS_R10,RS_R11];
                 saveregs:=regs*[RS_R8,RS_R10,RS_R11];
                 if saveregs<>[] then
                 if saveregs<>[] then
                   begin
                   begin
-                    reference_reset(ref,4);
+                    reference_reset(ref,4,[]);
                     ref.index:=NR_STACK_POINTER_REG;
                     ref.index:=NR_STACK_POINTER_REG;
                     ref.addressmode:=AM_PREINDEXED;
                     ref.addressmode:=AM_PREINDEXED;
                     for r:=RS_R8 to RS_R11 do
                     for r:=RS_R8 to RS_R11 do
@@ -2318,7 +2318,7 @@ unit cgcpu;
                   end
                   end
                 else
                 else
                   begin
                   begin
-                    reference_reset(ref,4);
+                    reference_reset(ref,4,[]);
                     ref.index:=NR_STACK_POINTER_REG;
                     ref.index:=NR_STACK_POINTER_REG;
                     ref.addressmode:=AM_PREINDEXED;
                     ref.addressmode:=AM_PREINDEXED;
                     list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_FD));
                     list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_FD));
@@ -2327,7 +2327,7 @@ unit cgcpu;
             else
             else
               begin
               begin
                 { restore int registers and return }
                 { restore int registers and return }
-                reference_reset(ref,4);
+                reference_reset(ref,4,[]);
                 ref.index:=NR_FRAME_POINTER_REG;
                 ref.index:=NR_FRAME_POINTER_REG;
                 list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_EA));
                 list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_EA));
               end;
               end;
@@ -2362,7 +2362,7 @@ unit cgcpu;
               Otherwise the init code can be distorted in later stages of code generation. }
               Otherwise the init code can be distorted in later stages of code generation. }
             a_reg_alloc(list,NR_R12);
             a_reg_alloc(list,NR_R12);
 
 
-            reference_reset(ref,4);
+            reference_reset(ref,4,[]);
             current_asmdata.getglobaldatalabel(l);
             current_asmdata.getglobaldatalabel(l);
             cg.a_label(current_procinfo.aktlocaldata,l);
             cg.a_label(current_procinfo.aktlocaldata,l);
             ref.symbol:=l;
             ref.symbol:=l;
@@ -2460,7 +2460,7 @@ unit cgcpu;
           if the symbol is absolute or relative there.
           if the symbol is absolute or relative there.
         }
         }
         { create consts entry }
         { create consts entry }
-        reference_reset(tmpref,4);
+        reference_reset(tmpref,4,[]);
         current_asmdata.getjumplabel(l);
         current_asmdata.getjumplabel(l);
         cg.a_label(current_procinfo.aktlocaldata,l);
         cg.a_label(current_procinfo.aktlocaldata,l);
         tmpref.symboldata:=current_procinfo.aktlocaldata.last;
         tmpref.symboldata:=current_procinfo.aktlocaldata.last;
@@ -2518,7 +2518,7 @@ unit cgcpu;
                (tf_pic_uses_got in target_info.flags) and
                (tf_pic_uses_got in target_info.flags) and
                assigned(ref.symbol) then
                assigned(ref.symbol) then
               begin
               begin
-                reference_reset(tmpref,4);
+                reference_reset(tmpref,4,[]);
                 tmpref.base:=current_procinfo.got;
                 tmpref.base:=current_procinfo.got;
                 tmpref.index:=tmpreg;
                 tmpref.index:=tmpreg;
                 list.concat(taicpu.op_reg_ref(A_LDR,tmpreg,tmpref));
                 list.concat(taicpu.op_reg_ref(A_LDR,tmpreg,tmpref));
@@ -2802,7 +2802,7 @@ unit cgcpu;
             else
             else
               begin
               begin
                 a_loadaddr_ref_reg(list,source,srcreg);
                 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;
               end;
 
 
             while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
             while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
@@ -2816,7 +2816,7 @@ unit cgcpu;
 
 
             destreg:=getintregister(list,OS_ADDR);
             destreg:=getintregister(list,OS_ADDR);
             a_loadaddr_ref_reg(list,dest,destreg);
             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;
             tmpregi2:=1;
             while (tmpregi2<=tmpregi) do
             while (tmpregi2<=tmpregi) do
               begin
               begin
@@ -2884,11 +2884,11 @@ unit cgcpu;
               begin{unaligned & 4<len<helpsize **or** aligned/unaligned & len>helpsize}
               begin{unaligned & 4<len<helpsize **or** aligned/unaligned & len>helpsize}
                 destreg:=getintregister(list,OS_ADDR);
                 destreg:=getintregister(list,OS_ADDR);
                 a_loadaddr_ref_reg(list,dest,destreg);
                 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);
                 srcreg:=getintregister(list,OS_ADDR);
                 a_loadaddr_ref_reg(list,source,srcreg);
                 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);
                 countreg:=getintregister(list,OS_32);
 
 
@@ -3583,7 +3583,7 @@ unit cgcpu;
             if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
             if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
               a_reg_alloc(list,NR_FRAME_POINTER_REG);
               a_reg_alloc(list,NR_FRAME_POINTER_REG);
             { save int registers }
             { save int registers }
-            reference_reset(ref,4);
+            reference_reset(ref,4,[]);
             ref.index:=NR_STACK_POINTER_REG;
             ref.index:=NR_STACK_POINTER_REG;
             ref.addressmode:=AM_PREINDEXED;
             ref.addressmode:=AM_PREINDEXED;
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
@@ -3794,7 +3794,7 @@ unit cgcpu;
                      begin
                      begin
                        tmpreg2:=getintregister(list,OS_INT);
                        tmpreg2:=getintregister(list,OS_INT);
                        a_loadaddr_ref_reg(list,ref,tmpreg2);
                        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
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -3827,7 +3827,7 @@ unit cgcpu;
                      begin
                      begin
                        tmpreg2:=getintregister(list,OS_INT);
                        tmpreg2:=getintregister(list,OS_INT);
                        a_loadaddr_ref_reg(list,ref,tmpreg2);
                        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
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -3884,7 +3884,7 @@ unit cgcpu;
             list.concat(taicpu.op_reg_const(A_MOV,reg,a))
             list.concat(taicpu.op_reg_const(A_MOV,reg,a))
           else
           else
             begin
             begin
-              reference_reset(hr,4);
+              reference_reset(hr,4,[]);
 
 
               current_asmdata.getjumplabel(l);
               current_asmdata.getjumplabel(l);
               cg.a_label(current_procinfo.aktlocaldata,l);
               cg.a_label(current_procinfo.aktlocaldata,l);
@@ -3924,7 +3924,7 @@ unit cgcpu;
                     else
                     else
                       begin
                       begin
                         list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R4]));
                         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_asmdata.getjumplabel(l);
                         current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                         current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                         cg.a_label(current_procinfo.aktlocaldata,l);
                         cg.a_label(current_procinfo.aktlocaldata,l);
@@ -3941,13 +3941,13 @@ unit cgcpu;
                   begin
                   begin
                     { offset in the wrapper needs to be adjusted for the stored
                     { offset in the wrapper needs to be adjusted for the stored
                       return address }
                       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
                     if is_thumb_imm(ioffset) then
                       a_op_const_ref(list,OP_SUB,size,ioffset,href)
                       a_op_const_ref(list,OP_SUB,size,ioffset,href)
                     else
                     else
                       begin
                       begin
                         list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R4]));
                         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_asmdata.getjumplabel(l);
                         current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                         current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                         cg.a_label(current_procinfo.aktlocaldata,l);
                         cg.a_label(current_procinfo.aktlocaldata,l);
@@ -4008,7 +4008,7 @@ unit cgcpu;
             tmpreg:=getintregister(list,OS_ADDR);
             tmpreg:=getintregister(list,OS_ADDR);
             a_loadaddr_ref_reg(list,ref,tmpreg);
             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
           end
         else if (op=A_LDR) and
         else if (op=A_LDR) and
            (oppostfix in [PF_None]) and
            (oppostfix in [PF_None]) and
@@ -4018,7 +4018,7 @@ unit cgcpu;
             tmpreg:=getintregister(list,OS_ADDR);
             tmpreg:=getintregister(list,OS_ADDR);
             a_loadaddr_ref_reg(list,ref,tmpreg);
             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
           end
         else if (op=A_LDR) and
         else if (op=A_LDR) and
            ((oppostfix in [PF_SH,PF_SB]) or
            ((oppostfix in [PF_SH,PF_SB]) or
@@ -4027,7 +4027,7 @@ unit cgcpu;
             tmpreg:=getintregister(list,OS_ADDR);
             tmpreg:=getintregister(list,OS_ADDR);
             a_loadaddr_ref_reg(list,ref,tmpreg);
             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;
           end;
 
 
         Result:=inherited handle_load_store(list, op, oppostfix, reg, href);
         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))
             list.concat(taicpu.op_reg_const(A_MOVW,reg,a))
           else
           else
             begin
             begin
-               reference_reset(hr,4);
+               reference_reset(hr,4,[]);
 
 
                current_asmdata.getjumplabel(l);
                current_asmdata.getjumplabel(l);
                cg.a_label(current_procinfo.aktlocaldata,l);
                cg.a_label(current_procinfo.aktlocaldata,l);
@@ -4345,7 +4345,7 @@ unit cgcpu;
                      begin
                      begin
                        tmpreg2:=getintregister(list,OS_INT);
                        tmpreg2:=getintregister(list,OS_INT);
                        a_loadaddr_ref_reg(list,ref,tmpreg2);
                        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
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -4377,7 +4377,7 @@ unit cgcpu;
                      begin
                      begin
                        tmpreg2:=getintregister(list,OS_INT);
                        tmpreg2:=getintregister(list,OS_INT);
                        a_loadaddr_ref_reg(list,ref,tmpreg2);
                        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
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -4799,7 +4799,7 @@ unit cgcpu;
                 list.concat(taicpu.op_reg_reg(A_MOV,NR_R12,NR_STACK_POINTER_REG));
                 list.concat(taicpu.op_reg_reg(A_MOV,NR_R12,NR_STACK_POINTER_REG));
               end;
               end;
             { save int registers }
             { save int registers }
-            reference_reset(ref,4);
+            reference_reset(ref,4,[]);
             ref.index:=NR_STACK_POINTER_REG;
             ref.index:=NR_STACK_POINTER_REG;
             ref.addressmode:=AM_PREINDEXED;
             ref.addressmode:=AM_PREINDEXED;
 
 
@@ -4850,7 +4850,7 @@ unit cgcpu;
 
 
             if firstfloatreg<>RS_NO then
             if firstfloatreg<>RS_NO then
               begin
               begin
-                reference_reset(ref,4);
+                reference_reset(ref,4,[]);
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                   begin
                   begin
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
@@ -4900,7 +4900,7 @@ unit cgcpu;
 
 
             if firstfloatreg<>RS_NO then
             if firstfloatreg<>RS_NO then
               begin
               begin
-                reference_reset(ref,4);
+                reference_reset(ref,4,[]);
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                   begin
                   begin
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
                     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))
               list.concat(taicpu.op_reg_reg(A_MOV,NR_R15,NR_R14))
             else
             else
               begin
               begin
-                reference_reset(ref,4);
+                reference_reset(ref,4,[]);
                 ref.index:=NR_STACK_POINTER_REG;
                 ref.index:=NR_STACK_POINTER_REG;
                 ref.addressmode:=AM_PREINDEXED;
                 ref.addressmode:=AM_PREINDEXED;
                 list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_FD));
                 list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,R_INTREGISTER,R_SUBWHOLE,regs),PF_FD));
@@ -5018,7 +5018,7 @@ unit cgcpu;
             )
             )
            ) then
            ) then
           begin
           begin
-            reference_reset(tmpref,4);
+            reference_reset(tmpref,4,[]);
 
 
             { load symbol }
             { load symbol }
             tmpreg:=getintregister(list,OS_INT);
             tmpreg:=getintregister(list,OS_INT);

+ 7 - 7
compiler/arm/hlcgcpu.pas

@@ -66,7 +66,7 @@ implementation
         href : treference;
         href : treference;
         l : TAsmLabel;
         l : TAsmLabel;
       begin
       begin
-        reference_reset_base(href,voidpointertype,NR_R0,0,sizeof(pint));
+        reference_reset_base(href,voidpointertype,NR_R0,0,sizeof(pint),[]);
         if GenerateThumbCode then
         if GenerateThumbCode then
           begin
           begin
             if (href.offset in [0..124]) and ((href.offset mod 4)=0) then
             if (href.offset in [0..124]) and ((href.offset mod 4)=0) then
@@ -80,7 +80,7 @@ implementation
               begin
               begin
                 list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0,RS_R1]));
                 list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0,RS_R1]));
                 { create consts entry }
                 { create consts entry }
-                reference_reset(tmpref,4);
+                reference_reset(tmpref,4,[]);
                 current_asmdata.getjumplabel(l);
                 current_asmdata.getjumplabel(l);
                 current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                 current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                 cg.a_label(current_procinfo.aktlocaldata,l);
                 cg.a_label(current_procinfo.aktlocaldata,l);
@@ -111,7 +111,7 @@ implementation
           Internalerror(200006139);
           Internalerror(200006139);
         if GenerateThumbCode then
         if GenerateThumbCode then
           begin
           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
             if (href.offset in [0..124]) and ((href.offset mod 4)=0) then
               begin
               begin
                 list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0]));
                 list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0]));
@@ -124,7 +124,7 @@ implementation
               begin
               begin
                 list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0,RS_R1]));
                 list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0,RS_R1]));
                 { create consts entry }
                 { create consts entry }
-                reference_reset(tmpref,4);
+                reference_reset(tmpref,4,[]);
                 current_asmdata.getjumplabel(l);
                 current_asmdata.getjumplabel(l);
                 current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                 current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
                 cg.a_label(current_procinfo.aktlocaldata,l);
                 cg.a_label(current_procinfo.aktlocaldata,l);
@@ -144,7 +144,7 @@ implementation
           end
           end
         else
         else
           begin
           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);
             cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
           end;
           end;
         if not(CPUARM_HAS_BX in cpu_capabilities[current_settings.cputype]) then
         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]));
           list.concat(taicpu.op_regset(A_PUSH,R_INTREGISTER,R_SUBWHOLE,[RS_R0]));
 
 
           { create consts entry }
           { create consts entry }
-          reference_reset(tmpref,4);
+          reference_reset(tmpref,4,[]);
           current_asmdata.getjumplabel(l);
           current_asmdata.getjumplabel(l);
           current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
           current_procinfo.aktlocaldata.Concat(tai_align.Create(4));
           cg.a_label(current_procinfo.aktlocaldata,l);
           cg.a_label(current_procinfo.aktlocaldata,l);
@@ -239,7 +239,7 @@ implementation
         and which allows to switch the instruction set }
         and which allows to switch the instruction set }
 
 
       { create const entry }
       { create const entry }
-      reference_reset(tmpref,4);
+      reference_reset(tmpref,4,[]);
       current_asmdata.getjumplabel(l);
       current_asmdata.getjumplabel(l);
       tmpref.symbol:=l;
       tmpref.symbol:=l;
       tmpref.base:=NR_PC;
       tmpref.base:=NR_PC;

+ 4 - 4
compiler/arm/narmcal.pas

@@ -74,12 +74,12 @@ implementation
 
 
                   case libparaloc^.loc of
                   case libparaloc^.loc of
                     LOC_REGISTER:
                     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:
                     LOC_REFERENCE:
                       begin
                       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);
                         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;
                       end;
                     else
                     else
                       internalerror(2016110603);
                       internalerror(2016110603);
@@ -124,7 +124,7 @@ implementation
          (location.loc=LOC_REGISTER) and
          (location.loc=LOC_REGISTER) and
          (current_settings.fputype in [fpu_fpa,fpu_fpa10,fpu_fpa11]) then
          (current_settings.fputype in [fpu_fpa,fpu_fpa10,fpu_fpa11]) then
         begin
         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);
           tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,location.reference);
         end
         end
       else
       else

+ 1 - 1
compiler/arm/narmcnv.pas

@@ -209,7 +209,7 @@ implementation
 
 
                         current_asmdata.getglobaldatalabel(l1);
                         current_asmdata.getglobaldatalabel(l1);
                         current_asmdata.getjumplabel(l2);
                         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);
                         cg.a_reg_alloc(current_asmdata.CurrAsmList,NR_DEFAULTFLAGS);
                         current_asmdata.CurrAsmList.concat(Taicpu.op_reg_const(A_CMP,left.location.register,0));
                         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;
          hiloswapped : boolean;
 
 
       begin
       begin
-        location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),4);
+        location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),4,[]);
         lastlabel:=nil;
         lastlabel:=nil;
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
         hiloswapped:=is_double_hilo_swapped;
         hiloswapped:=is_double_hilo_swapped;

+ 1 - 1
compiler/arm/narminl.pas

@@ -397,7 +397,7 @@ implementation
                 begin
                 begin
                   r:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
                   r:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
                   cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,r);
                   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 }
                   { since the address might be nil we can't use ldr for older cpus }
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_PLD,ref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_PLD,ref));
                 end;
                 end;

+ 4 - 4
compiler/arm/narmset.pas

@@ -216,7 +216,7 @@ implementation
             { adjust index }
             { adjust index }
             cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_,indexreg,indexreg);
             cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_,indexreg,indexreg);
             { create reference and generate jump table }
             { create reference and generate jump table }
-            reference_reset(href,4);
+            reference_reset(href,4,[]);
             href.base:=NR_PC;
             href.base:=NR_PC;
             href.index:=indexreg;
             href.index:=indexreg;
             href.shiftmode:=SM_LSL;
             href.shiftmode:=SM_LSL;
@@ -238,10 +238,10 @@ implementation
             cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,indexreg);
             cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,indexreg);
 
 
             basereg:=cg.getintregister(current_asmdata.CurrAsmList, OS_ADDR);
             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);
             cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList, href, basereg);
 
 
-            reference_reset(href,0);
+            reference_reset(href,0,[]);
             href.base:=basereg;
             href.base:=basereg;
             href.index:=indexreg;
             href.index:=indexreg;
             
             
@@ -264,7 +264,7 @@ implementation
               min_+ord(not(cs_create_pic in current_settings.moduleswitches)),
               min_+ord(not(cs_create_pic in current_settings.moduleswitches)),
               indexreg,indexreg);
               indexreg,indexreg);
             { create reference and generate jump table }
             { create reference and generate jump table }
-            reference_reset(href,4);
+            reference_reset(href,4,[]);
             href.base:=NR_PC;
             href.base:=NR_PC;
             href.index:=indexreg;
             href.index:=indexreg;
             href.shiftmode:=SM_LSL;
             href.shiftmode:=SM_LSL;

+ 1 - 1
compiler/arm/raarmgas.pas

@@ -814,7 +814,7 @@ Unit raarmgas;
                   if symtype=AT_NONE then
                   if symtype=AT_NONE then
                     sym:='';
                     sym:='';
 
 
-                  reference_reset(oper.opr.ref,4);
+                  reference_reset(oper.opr.ref,4,[]);
                   oper.opr.ref.base:=NR_PC;
                   oper.opr.ref.base:=NR_PC;
                   oper.opr.ref.symbol:=GetConstLabel(sym,val);
                   oper.opr.ref.symbol:=GetConstLabel(sym,val);
                 end;
                 end;

+ 8 - 8
compiler/arm/rgcpu.pas

@@ -195,7 +195,7 @@ unit rgcpu;
           {$endif}
           {$endif}
           cg.a_load_const_reg(helplist,OS_ADDR,spilltemp.offset,hreg);
           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);
           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
         end
       else if is_shifter_const(a and not($FFF), immshift) then
       else if is_shifter_const(a and not($FFF), immshift) then
         if spilltemp.offset > 0 then
         if spilltemp.offset > 0 then
@@ -205,7 +205,7 @@ unit rgcpu;
             {$endif}
             {$endif}
             helplist.concat(taicpu.op_reg_reg_const(A_ADD, hreg, current_procinfo.framepointer,
             helplist.concat(taicpu.op_reg_reg_const(A_ADD, hreg, current_procinfo.framepointer,
                                                       a and not($FFF)));
                                                       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
           end
         else
         else
           begin
           begin
@@ -214,7 +214,7 @@ unit rgcpu;
             {$endif}
             {$endif}
             helplist.concat(taicpu.op_reg_reg_const(A_SUB, hreg, current_procinfo.framepointer,
             helplist.concat(taicpu.op_reg_reg_const(A_SUB, hreg, current_procinfo.framepointer,
                                                       a and not($FFF)));
                                                       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
           end
       else
       else
         begin
         begin
@@ -222,7 +222,7 @@ unit rgcpu;
           helplist.concat(tai_comment.create(strpnew('Spilling: Use a_load_const_reg to fix spill offset')));
           helplist.concat(tai_comment.create(strpnew('Spilling: Use a_load_const_reg to fix spill offset')));
           {$endif}
           {$endif}
           cg.a_load_const_reg(helplist,OS_ADDR,spilltemp.offset,hreg);
           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;
           tmpref.index:=hreg;
         end;
         end;
 
 
@@ -464,7 +464,7 @@ unit rgcpu;
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
           begin
           begin
             helplist:=TAsmList.create;
             helplist:=TAsmList.create;
-            reference_reset(tmpref,sizeof(aint));
+            reference_reset(tmpref,sizeof(aint),[]);
             { create consts entry }
             { create consts entry }
             current_asmdata.getjumplabel(l);
             current_asmdata.getjumplabel(l);
             cg.a_label(current_procinfo.aktlocaldata,l);
             cg.a_label(current_procinfo.aktlocaldata,l);
@@ -482,7 +482,7 @@ unit rgcpu;
             tmpref.base:=NR_R15;
             tmpref.base:=NR_R15;
             helplist.concat(taicpu.op_reg_ref(A_LDR,hreg,tmpref));
             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;
             tmpref.index:=hreg;
 
 
             if spilltemp.index<>NR_NO then
             if spilltemp.index<>NR_NO then
@@ -522,7 +522,7 @@ unit rgcpu;
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
         if (spilltemp.offset>4095) or (spilltemp.offset<-255) then
           begin
           begin
             helplist:=TAsmList.create;
             helplist:=TAsmList.create;
-            reference_reset(tmpref,sizeof(aint));
+            reference_reset(tmpref,sizeof(aint),[]);
             { create consts entry }
             { create consts entry }
             current_asmdata.getjumplabel(l);
             current_asmdata.getjumplabel(l);
             cg.a_label(current_procinfo.aktlocaldata,l);
             cg.a_label(current_procinfo.aktlocaldata,l);
@@ -542,7 +542,7 @@ unit rgcpu;
             if spilltemp.index<>NR_NO then
             if spilltemp.index<>NR_NO then
               internalerror(200401263);
               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;
             tmpref.index:=hreg;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             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);
                a_load_reg_reg(list,paraloc^.size,paraloc^.size,r,paraloc^.register);
              LOC_REFERENCE,LOC_CREFERENCE:
              LOC_REFERENCE,LOC_CREFERENCE:
                begin
                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);
                   a_load_reg_ref(list,paraloc^.size,paraloc^.size,r,ref);
                end;
                end;
              else
              else
@@ -334,7 +334,7 @@ unit cgcpu;
                  end;
                  end;
                LOC_REFERENCE,LOC_CREFERENCE:
                LOC_REFERENCE,LOC_CREFERENCE:
                  begin
                  begin
-                   reference_reset(ref,paraloc.alignment);
+                   reference_reset(ref,paraloc.alignment,[]);
                    ref.base:=hp^.reference.index;
                    ref.base:=hp^.reference.index;
                    ref.offset:=hp^.reference.offset;
                    ref.offset:=hp^.reference.offset;
                    a_load_const_ref(list,hp^.size,a shr (8*(i-1)),ref);
                    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);
                 a_load_ref_reg(list,location^.size,location^.size,tmpref,location^.register);
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 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 }
                   { doubles in softemu mode have a strange order of registers and references }
                   if location^.size=OS_32 then
                   if location^.size=OS_32 then
                     g_concatcopy(list,tmpref,ref,4)
                     g_concatcopy(list,tmpref,ref,4)
@@ -1041,7 +1041,7 @@ unit cgcpu;
           end
           end
         else if assigned(ref.symbol) or (ref.offset<>0) then
         else if assigned(ref.symbol) or (ref.offset<>0) then
           begin
           begin
-            reference_reset(tmpref,0);
+            reference_reset(tmpref,0,[]);
             tmpref.symbol:=ref.symbol;
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
             tmpref.offset:=ref.offset;
             if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
             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
         if assigned(ref.symbol) or (ref.offset<>0) then
           begin
           begin
-            reference_reset(tmpref,0);
+            reference_reset(tmpref,0,[]);
             tmpref.symbol:=ref.symbol;
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
             tmpref.offset:=ref.offset;
 
 
@@ -2027,8 +2027,8 @@ unit cgcpu;
           begin
           begin
             current_asmdata.getjumplabel(l);
             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.base:=NR_R30;
             srcref.addressmode:=AM_POSTINCREMENT;
             srcref.addressmode:=AM_POSTINCREMENT;
             dstref.base:=NR_R26;
             dstref.base:=NR_R26;

+ 1 - 1
compiler/avr/raavrgas.pas

@@ -513,7 +513,7 @@ Unit raavrgas;
                 begin
                 begin
                   oper.opr.typ:=OPR_REFERENCE;
                   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;
                   oper.opr.ref.addressmode:=AM_POSTINCREMENT;
 
 
                   consume(AS_PLUS);
                   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_ADD,NR_R26,spilltemp.base));
             helplist.concat(taicpu.op_reg_reg(A_ADC,NR_R27,GetNextReg(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);
             helpins:=spilling_create_load(tmpref,tempreg);
             helplist.concat(helpins);
             helplist.concat(helpins);
             list.insertlistafter(pos,helplist);
             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_ADD,NR_R26,spilltemp.base));
             helplist.concat(taicpu.op_reg_reg(A_ADC,NR_R27,GetNextReg(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));
             helplist.concat(spilling_create_store(tempreg,tmpref));
             list.insertlistafter(pos,helplist);
             list.insertlistafter(pos,helplist);
             helplist.free;
             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);
               a_load_reg_reg(list,size,cgpara.location^.size,r,cgpara.location^.register);
             LOC_REFERENCE,LOC_CREFERENCE:
             LOC_REFERENCE,LOC_CREFERENCE:
               begin
               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);
                  a_load_reg_ref(list,size,cgpara.location^.size,r,ref);
               end;
               end;
             LOC_MMREGISTER,LOC_CMMREGISTER:
             LOC_MMREGISTER,LOC_CMMREGISTER:
@@ -885,7 +885,7 @@ implementation
               a_load_const_reg(list,cgpara.location^.size,a,cgpara.location^.register);
               a_load_const_reg(list,cgpara.location^.size,a,cgpara.location^.register);
             LOC_REFERENCE,LOC_CREFERENCE:
             LOC_REFERENCE,LOC_CREFERENCE:
               begin
               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);
                  a_load_const_ref(list,cgpara.location^.size,a,ref);
               end
               end
             else
             else
@@ -1014,7 +1014,7 @@ implementation
                 begin
                 begin
                    if assigned(location^.next) then
                    if assigned(location^.next) then
                      internalerror(2010052906);
                      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
                    if (size <> OS_NO) and
                       (tcgsize2size[size] <= sizeof(aint)) then
                       (tcgsize2size[size] <= sizeof(aint)) then
                      a_load_ref_ref(list,size,location^.size,tmpref,ref)
                      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);
              a_loadfpu_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref);
            LOC_REFERENCE :
            LOC_REFERENCE :
              begin
              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
                { 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 }
                  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
                if not((href.base=ref.base) and (href.offset=ref.offset)) then
@@ -1197,7 +1197,7 @@ implementation
              end;
              end;
            LOC_REFERENCE :
            LOC_REFERENCE :
              begin
              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
                case getregtype(reg) of
                  R_ADDRESSREGISTER,
                  R_ADDRESSREGISTER,
                  R_INTREGISTER :
                  R_INTREGISTER :
@@ -1603,7 +1603,7 @@ implementation
             LOC_REFERENCE,LOC_CREFERENCE:
             LOC_REFERENCE,LOC_CREFERENCE:
               begin
               begin
                 cgpara.check_simple_location;
                 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);
                 a_loadfpu_reg_ref(list,size,size,r,ref);
               end;
               end;
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
@@ -1644,7 +1644,7 @@ implementation
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
             begin
               cgpara.check_simple_location;
               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 }
               { concatcopy should choose the best way to copy the data }
               g_concatcopy(list,ref,href,tcgsize2size[size]);
               g_concatcopy(list,ref,href,tcgsize2size[size]);
             end;
             end;
@@ -1968,7 +1968,7 @@ implementation
             a_loadmm_reg_reg(list,size,cgpara.location^.size,reg,cgpara.location^.register,shuffle);
             a_loadmm_reg_reg(list,size,cgpara.location^.size,reg,cgpara.location^.register,shuffle);
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
             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);
               a_loadmm_reg_ref(list,size,cgpara.location^.size,reg,href,shuffle);
             end;
             end;
           LOC_REGISTER,LOC_CREGISTER:
           LOC_REGISTER,LOC_CREGISTER:
@@ -2009,7 +2009,7 @@ implementation
                     begin
                     begin
                       if not(cgpara.location^.next^.size in [OS_32,OS_S32]) then
                       if not(cgpara.location^.next^.size in [OS_32,OS_S32]) then
                         internalerror(2009112911);
                         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);
                       a_load_reg_ref(list,OS_32,cgpara.location^.next^.size,tmpreg,href);
                     end;
                     end;
                 end
                 end
@@ -2356,7 +2356,7 @@ implementation
                   begin
                   begin
                     { offset in the wrapper needs to be adjusted for the stored
                     { offset in the wrapper needs to be adjusted for the stored
                       return address }
                       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);
                     a_op_const_ref(list,OP_SUB,size,ioffset,href);
                   end
                   end
                 else
                 else
@@ -2410,7 +2410,7 @@ implementation
 {$endif cpu64bitaddr}
 {$endif cpu64bitaddr}
                 end;
                 end;
               result := getaddressregister(list);
               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 will turn this into a pic-load if needed }
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,result);
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,result);
             end;
             end;

+ 24 - 11
compiler/cgutils.pas

@@ -43,6 +43,17 @@ unit cgutils;
       { Set type definition for cpuregisters }
       { Set type definition for cpuregisters }
       tcpuregisterset = set of 0..maxcpuregister;
       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 }
       { reference record, reordered for best alignment }
       preference = ^treference;
       preference = ^treference;
       treference = record
       treference = record
@@ -84,6 +95,7 @@ unit cgutils;
          indexoffset: aint;
          indexoffset: aint;
          checkcast: boolean;
          checkcast: boolean;
 {$endif jvm}
 {$endif jvm}
+         volatility: tvolatilityset;
          alignment : byte;
          alignment : byte;
       end;
       end;
 
 
@@ -161,12 +173,12 @@ unit cgutils;
     { trerefence handling }
     { trerefence handling }
 
 
     {# Clear to zero a treference }
     {# 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
     {# Clear to zero a treference, and set is base address
        to base register.
        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
     { This routine verifies if two references are the same, and
        if so, returns TRUE, otherwise returns false.
        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 }
     { cannot be used for loc_(c)reference, because that one requires an alignment }
     procedure location_reset(var l : tlocation;lt:TCGNonRefLoc;lsize:TCGSize);
     procedure location_reset(var l : tlocation;lt:TCGNonRefLoc;lsize:TCGSize);
     { for loc_(c)reference }
     { 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 }
     { for loc_jump }
     procedure location_reset_jump(out l: tlocation; truelab, falselab: tasmlabel);
     procedure location_reset_jump(out l: tlocation; truelab, falselab: tasmlabel);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
@@ -204,27 +216,28 @@ uses
                                   TReference
                                   TReference
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure reference_reset(var ref : treference; alignment: longint);
+    procedure reference_reset(var ref: treference; alignment: longint; volatility: tvolatilityset);
       begin
       begin
         FillChar(ref,sizeof(treference),0);
         FillChar(ref,sizeof(treference),0);
 {$ifdef arm}
 {$ifdef arm}
         ref.signindex:=1;
         ref.signindex:=1;
 {$endif arm}
 {$endif arm}
         ref.alignment:=alignment;
         ref.alignment:=alignment;
+        ref.volatility:=volatility;
       end;
       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
       begin
-        reference_reset(ref,alignment);
+        reference_reset(ref,alignment,volatility);
         ref.base:=base;
         ref.base:=base;
         ref.offset:=offset;
         ref.offset:=offset;
       end;
       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
       begin
-        reference_reset(ref,alignment);
+        reference_reset(ref,alignment,volatility);
         ref.symbol:=sym;
         ref.symbol:=sym;
         ref.offset:=offset;
         ref.offset:=offset;
       end;
       end;
@@ -257,8 +270,7 @@ uses
           internalerror(2009020705);
           internalerror(2009020705);
       end;
       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
     begin
       FillChar(l,sizeof(tlocation),0);
       FillChar(l,sizeof(tlocation),0);
       l.loc:=lt;
       l.loc:=lt;
@@ -267,6 +279,7 @@ uses
       l.reference.signindex:=1;
       l.reference.signindex:=1;
 {$endif arm}
 {$endif arm}
       l.reference.alignment:=alignment;
       l.reference.alignment:=alignment;
+      l.reference.volatility:=volatility;
     end;
     end;
 
 
 
 

+ 4 - 4
compiler/hlcg2ll.pas

@@ -1216,7 +1216,7 @@ implementation
               record "size" parameters }
               record "size" parameters }
             tg.gethltemp(list,size,size.size,tt_normal,r);
             tg.gethltemp(list,size,size.size,tt_normal,r);
             cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,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;
             l.reference:=r;
           end;
           end;
         LOC_MMREGISTER,
         LOC_MMREGISTER,
@@ -1224,7 +1224,7 @@ implementation
           begin
           begin
             tg.gethltemp(list,size,size.size,tt_normal,r);
             tg.gethltemp(list,size,size.size,tt_normal,r);
             cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,r,mms_movescalar);
             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;
             l.reference:=r;
           end;
           end;
         LOC_CONSTANT,
         LOC_CONSTANT,
@@ -1242,7 +1242,7 @@ implementation
             else
             else
 {$endif cpu64bitalu}
 {$endif cpu64bitalu}
               a_load_loc_ref(list,size,size,l,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;
             l.reference:=r;
           end;
           end;
         else
         else
@@ -1264,7 +1264,7 @@ implementation
             begin
             begin
               tg.GetTemp(list,tcgsize2size[l.size],tcgsize2size[l.size],tt_normal,href);
               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);
               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;
               l.reference:=href;
             end;
             end;
 {$ifndef cpu64bitalu}
 {$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(regsize the type of the pointer, contained in the reg parameter)
              @param(reg register containing the value of a pointer)
              @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 }
           {# Returns a reference corresponding to a temp }
           procedure temp_to_ref(p: ptemprecord; out ref: treference); virtual;
           procedure temp_to_ref(p: ptemprecord; out ref: treference); virtual;
@@ -842,16 +842,16 @@ implementation
     end;
     end;
 
 
   procedure thlcgobj.reference_reset_base(var ref: treference; regsize: tdef;
   procedure thlcgobj.reference_reset_base(var ref: treference; regsize: tdef;
-    reg: tregister; offset, alignment: longint);
+    reg: tregister; offset, alignment: longint; volatility: tvolatilityset);
     begin
     begin
-      reference_reset(ref,alignment);
+      reference_reset(ref,alignment,volatility);
       ref.base:=reg;
       ref.base:=reg;
       ref.offset:=offset;
       ref.offset:=offset;
     end;
     end;
 
 
   procedure thlcgobj.temp_to_ref(p: ptemprecord; out ref: treference);
   procedure thlcgobj.temp_to_ref(p: ptemprecord; out ref: treference);
     begin
     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;
     end;
 
 
   procedure thlcgobj.a_label(list: TAsmList; l: tasmlabel); inline;
   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);
            a_load_reg_reg(list,size,cgpara.location^.def,r,cgpara.location^.register);
          LOC_REFERENCE,LOC_CREFERENCE:
          LOC_REFERENCE,LOC_CREFERENCE:
            begin
            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);
               a_load_reg_ref(list,size,cgpara.location^.def,r,ref);
            end;
            end;
          LOC_MMREGISTER,LOC_CMMREGISTER:
          LOC_MMREGISTER,LOC_CMMREGISTER:
@@ -922,7 +922,7 @@ implementation
             a_load_const_reg(list,cgpara.location^.def,a,cgpara.location^.register);
             a_load_const_reg(list,cgpara.location^.def,a,cgpara.location^.register);
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
             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);
                a_load_const_ref(list,cgpara.location^.def,a,ref);
             end
             end
           else
           else
@@ -1053,7 +1053,7 @@ implementation
               begin
               begin
                  if assigned(location^.next) then
                  if assigned(location^.next) then
                    internalerror(2010052906);
                    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
                  if (def_cgsize(size)<>OS_NO) and
                     (size.size=sizeleft) and
                     (size.size=sizeleft) and
                     (sizeleft<=sizeof(aint)) then
                     (sizeleft<=sizeof(aint)) then
@@ -2453,7 +2453,7 @@ implementation
           refptrdef:=cpointerdef.getreusable(refsize);
           refptrdef:=cpointerdef.getreusable(refsize);
           newbase:=getaddressregister(list,refptrdef);
           newbase:=getaddressregister(list,refptrdef);
           a_loadaddr_ref_reg(list,refsize,refptrdef,ref,newbase);
           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;
         end;
       result.ref.index:=tmpreg;
       result.ref.index:=tmpreg;
       tmpreg:=getintregister(list,ptruinttype);
       tmpreg:=getintregister(list,ptruinttype);
@@ -2534,7 +2534,7 @@ implementation
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
             begin
               cgpara.check_simple_location;
               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);
               a_loadfpu_reg_ref(list,fromsize,cgpara.def,r,ref);
             end;
             end;
           LOC_REGISTER,LOC_CREGISTER:
           LOC_REGISTER,LOC_CREGISTER:
@@ -2566,7 +2566,7 @@ implementation
         LOC_REFERENCE,LOC_CREFERENCE:
         LOC_REFERENCE,LOC_CREFERENCE:
           begin
           begin
             cgpara.check_simple_location;
             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 }
             { concatcopy should choose the best way to copy the data }
             g_concatcopy(list,fromsize,ref,href);
             g_concatcopy(list,fromsize,ref,href);
           end;
           end;
@@ -2580,7 +2580,7 @@ implementation
             intptrdef:=cpointerdef.getreusable(cgpara.location^.def);
             intptrdef:=cpointerdef.getreusable(cgpara.location^.def);
             hreg:=getaddressregister(list,intptrdef);
             hreg:=getaddressregister(list,intptrdef);
             a_loadaddr_ref_reg(list,fromsize,intptrdef,ref,hreg);
             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);
             a_load_ref_cgpara(list,cgpara.location^.def,ref,cgpara);
           end
           end
         else
         else
@@ -2676,7 +2676,7 @@ implementation
           a_loadmm_reg_reg(list,fromsize,cgpara.def,reg,cgpara.location^.register,shuffle);
           a_loadmm_reg_reg(list,fromsize,cgpara.def,reg,cgpara.location^.register,shuffle);
         LOC_REFERENCE,LOC_CREFERENCE:
         LOC_REFERENCE,LOC_CREFERENCE:
           begin
           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);
             a_loadmm_reg_ref(list,fromsize,cgpara.def,reg,href,shuffle);
           end;
           end;
         LOC_REGISTER,LOC_CREGISTER:
         LOC_REGISTER,LOC_CREGISTER:
@@ -3292,7 +3292,7 @@ implementation
           paramanager.getintparaloc(list,pd,2,cgpara2);
           paramanager.getintparaloc(list,pd,2,cgpara2);
           if is_open_array(t) then
           if is_open_array(t) then
             InternalError(201103054);
             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
           if pd.is_pushleftright then
             begin
             begin
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
@@ -3340,7 +3340,7 @@ implementation
             pd:=search_system_proc('fpc_initialize');
             pd:=search_system_proc('fpc_initialize');
             paramanager.getintparaloc(list,pd,1,cgpara1);
             paramanager.getintparaloc(list,pd,1,cgpara1);
             paramanager.getintparaloc(list,pd,2,cgpara2);
             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
             if pd.is_pushleftright then
               begin
               begin
                 a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
                 a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
@@ -3390,7 +3390,7 @@ implementation
             pd:=search_system_proc('fpc_finalize');
             pd:=search_system_proc('fpc_finalize');
           paramanager.getintparaloc(list,pd,1,cgpara1);
           paramanager.getintparaloc(list,pd,1,cgpara1);
           paramanager.getintparaloc(list,pd,2,cgpara2);
           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
           if pd.is_pushleftright then
             begin
             begin
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
               a_loadaddr_ref_cgpara(list,t,ref,cgpara1);
@@ -3432,7 +3432,7 @@ implementation
       paramanager.getintparaloc(list,pd,2,cgpara2);
       paramanager.getintparaloc(list,pd,2,cgpara2);
       paramanager.getintparaloc(list,pd,3,cgpara3);
       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 calling convention is left to right, push parameters 1 and 2 }
       if pd.is_pushleftright then
       if pd.is_pushleftright then
         begin
         begin
@@ -4043,7 +4043,7 @@ implementation
           begin
           begin
             tg.gethltemp(list,size,size.size,tt_normal,r);
             tg.gethltemp(list,size,size.size,tt_normal,r);
             a_loadfpu_reg_ref(list,size,size,l.register,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;
             l.reference:=r;
           end;
           end;
         LOC_MMREGISTER,
         LOC_MMREGISTER,
@@ -4054,7 +4054,7 @@ implementation
               internalerror(2012062301);
               internalerror(2012062301);
             tg.gethltemp(list,size,size.size,tt_normal,r);
             tg.gethltemp(list,size,size.size,tt_normal,r);
             a_loadmm_reg_ref(list,size,size,l.register,r,mms_movescalar);
             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;
             l.reference:=r;
           end;
           end;
         LOC_CONSTANT,
         LOC_CONSTANT,
@@ -4072,7 +4072,7 @@ implementation
               forcesize:=sizeof(pint);
               forcesize:=sizeof(pint);
             tg.gethltemp(list,size,forcesize,tt_normal,r);
             tg.gethltemp(list,size,forcesize,tt_normal,r);
             a_load_loc_ref(list,size,size,l,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;
             l.reference:=r;
           end;
           end;
         LOC_CREFERENCE,
         LOC_CREFERENCE,
@@ -4096,7 +4096,7 @@ implementation
             begin
             begin
               tg.gethltemp(list,size,-1,tt_normal,href);
               tg.gethltemp(list,size,-1,tt_normal,href);
               hlcg.a_loadfpu_reg_ref(list,size,size,l.register,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;
               l.reference:=href;
             end;
             end;
           { on ARM, CFP values may be located in integer registers,
           { on ARM, CFP values may be located in integer registers,
@@ -4141,7 +4141,7 @@ implementation
             begin
             begin
               if not loadref then
               if not loadref then
                 internalerror(200410231);
                 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;
             end;
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE :
           LOC_CREFERENCE :
@@ -4149,7 +4149,7 @@ implementation
               if loadref then
               if loadref then
                 begin
                 begin
                   pdef:=cpointerdef.getreusable(def);
                   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 }
                   { it's a pointer to def }
                   a_load_ref_reg(list,pdef,pdef,l.reference,ref.base);
                   a_load_ref_reg(list,pdef,pdef,l.reference,ref.base);
                 end
                 end
@@ -4591,7 +4591,7 @@ implementation
   procedure thlcgobj.paravarsym_set_initialloc_to_paraloc(vs: tparavarsym);
   procedure thlcgobj.paravarsym_set_initialloc_to_paraloc(vs: tparavarsym);
     begin
     begin
       reference_reset_base(vs.initialloc.reference,voidstackpointertype,tparavarsym(vs).paraloc[calleeside].location^.reference.index,
       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;
     end;
 
 
   procedure thlcgobj.gen_entry_code(list: TAsmList);
   procedure thlcgobj.gen_entry_code(list: TAsmList);
@@ -4716,7 +4716,7 @@ implementation
                { initialize fpu regvar by loading from memory }
                { initialize fpu regvar by loading from memory }
                reference_reset_symbol(href,
                reference_reset_symbol(href,
                  current_asmdata.RefAsmSymbol(tstaticvarsym(p).mangledname,AT_DATA), 0,
                  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,
                a_loadfpu_ref_reg(TAsmList(arg), tstaticvarsym(p).vardef,
                  tstaticvarsym(p).vardef, href, tstaticvarsym(p).initialloc.register);
                  tstaticvarsym(p).vardef, href, tstaticvarsym(p).initialloc.register);
              end;
              end;
@@ -5143,7 +5143,7 @@ implementation
                 case para.location^.loc of
                 case para.location^.loc of
                   LOC_REFERENCE,LOC_CREFERENCE:
                   LOC_REFERENCE,LOC_CREFERENCE:
                     begin
                     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);
                       a_load_ref_ref(list,para.def,para.def,href,destloc.reference);
                     end;
                     end;
                   else
                   else

+ 5 - 5
compiler/i386/aoptcpu.pas

@@ -305,7 +305,7 @@ begin
                            ((taicpu(hp1).opcode=A_Jcc) and
                            ((taicpu(hp1).opcode=A_Jcc) and
                             (taicpu(hp1).condition in [C_O,C_NO])))) then
                             (taicpu(hp1).condition in [C_O,C_NO])))) then
                       begin
                       begin
-                        reference_reset(tmpref,1);
+                        reference_reset(tmpref,1,[]);
                         case taicpu(p).oper[0]^.val Of
                         case taicpu(p).oper[0]^.val Of
                           3: begin
                           3: begin
                              {imul 3, reg1, reg2 to
                              {imul 3, reg1, reg2 to
@@ -361,7 +361,7 @@ begin
                                         taicpu(p).oper[1]^.reg,taicpu(p).oper[1]^.reg);
                                         taicpu(p).oper[1]^.reg,taicpu(p).oper[1]^.reg);
                                     end;
                                     end;
                                   InsertLLItem(p, p.next, hp1);
                                   InsertLLItem(p, p.next, hp1);
-                                  reference_reset(tmpref,2);
+                                  reference_reset(tmpref,2,[]);
                                   TmpRef.index := taicpu(p).oper[1]^.reg;
                                   TmpRef.index := taicpu(p).oper[1]^.reg;
                                   TmpRef.ScaleFactor := 2;
                                   TmpRef.ScaleFactor := 2;
                                   if (taicpu(p).ops = 3) then
                                   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);
                                          hp1 :=  taicpu.op_ref_reg(A_LEA, S_L, TmpRef, taicpu(p).oper[1]^.reg);
                                        end;
                                        end;
                                      InsertLLItem(p, p.next, hp1);
                                      InsertLLItem(p, p.next, hp1);
-                                     reference_reset(tmpref,2);
+                                     reference_reset(tmpref,2,[]);
                                      TmpRef.index := taicpu(p).oper[1]^.reg;
                                      TmpRef.index := taicpu(p).oper[1]^.reg;
                                      if (taicpu(p).ops = 3) then
                                      if (taicpu(p).ops = 3) then
                                        begin
                                        begin
@@ -1427,7 +1427,7 @@ begin
                           TmpBool1 := True; {should we check the next instruction?}
                           TmpBool1 := True; {should we check the next instruction?}
                           TmpBool2 := False; {have we found an add/sub which could be
                           TmpBool2 := False; {have we found an add/sub which could be
                                               integrated in the lea?}
                                               integrated in the lea?}
-                          reference_reset(tmpref,2);
+                          reference_reset(tmpref,2,[]);
                           TmpRef.index := taicpu(p).oper[1]^.reg;
                           TmpRef.index := taicpu(p).oper[1]^.reg;
                           TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                           TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                           while TmpBool1 and
                           while TmpBool1 and
@@ -1518,7 +1518,7 @@ begin
                     {changes "shl $2, %reg" to "lea (,%reg,4), %reg"
                     {changes "shl $2, %reg" to "lea (,%reg,4), %reg"
                             "shl $3, %reg" to "lea (,%reg,8), %reg}
                             "shl $3, %reg" to "lea (,%reg,8), %reg}
                               begin
                               begin
-                                reference_reset(tmpref,2);
+                                reference_reset(tmpref,2,[]);
                                 TmpRef.index := taicpu(p).oper[1]^.reg;
                                 TmpRef.index := taicpu(p).oper[1]^.reg;
                                 TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                                 TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                                 hp1 := taicpu.Op_ref_reg(A_LEA,S_L,TmpRef, taicpu(p).oper[1]^.reg);
                                 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;
                 cgpara.check_simple_location;
                 len:=align(cgpara.intsize,cgpara.alignment);
                 len:=align(cgpara.intsize,cgpara.alignment);
                 g_stackpointer_alloc(list,len);
                 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);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -257,7 +257,7 @@ unit cgcpu;
                               end
                               end
                             else
                             else
                               begin
                               begin
-                                reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint));
+                                reference_reset_symbol(tmpref,dirref.symbol,0,sizeof(pint),[]);
                                 tmpref.refaddr:=addr_pic;
                                 tmpref.refaddr:=addr_pic;
                                 tmpref.base:=current_procinfo.got;
                                 tmpref.base:=current_procinfo.got;
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
@@ -299,7 +299,7 @@ unit cgcpu;
         var
         var
           href : treference;
           href : treference;
         begin
         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 }
           { 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));
           list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
         end;
         end;

+ 10 - 10
compiler/i386/hlcgcpu.pas

@@ -90,10 +90,10 @@ implementation
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                     begin
                     begin
                       cg.g_stackpointer_alloc(list,stacksize);
                       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
                     end
                   else
                   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);
                   cg.a_loadfpu_reg_ref(list,locsize,locsize,l.register,href);
                 end;
                 end;
               LOC_FPUREGISTER:
               LOC_FPUREGISTER:
@@ -135,10 +135,10 @@ implementation
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                     begin
                     begin
                       cg.g_stackpointer_alloc(list,stacksize);
                       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
                     end
                   else
                   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);
                   cg.a_loadmm_reg_ref(list,locsize,locsize,l.register,href,mms_movescalar);
                 end;
                 end;
               LOC_FPUREGISTER:
               LOC_FPUREGISTER:
@@ -164,7 +164,7 @@ implementation
                     cg.a_load_ref_cgpara(list,locsize,l.reference,cgpara)
                     cg.a_load_ref_cgpara(list,locsize,l.reference,cgpara)
                   else
                   else
                     begin
                     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);
                       cg.g_concatcopy(list,l.reference,href,stacksize);
                     end;
                     end;
                 end;
                 end;
@@ -334,7 +334,7 @@ implementation
               selfoffsetfromsp:=2*sizeof(aint)
               selfoffsetfromsp:=2*sizeof(aint)
             else
             else
               selfoffsetfromsp:=sizeof(aint);
               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);
             cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
           end;
           end;
       end;
       end;
@@ -344,7 +344,7 @@ implementation
         href : treference;
         href : treference;
       begin
       begin
         { mov  0(%eax),%reg ; load vmt}
         { 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);
         cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,reg);
       end;
       end;
 
 
@@ -355,7 +355,7 @@ implementation
         if (procdef.extnumber=$ffff) then
         if (procdef.extnumber=$ffff) then
           Internalerror(200006139);
           Internalerror(200006139);
         { call/jmp  vmtoffs(%reg) ; method offs }
         { 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));
         list.concat(taicpu.op_ref(op,S_L,href));
       end;
       end;
 
 
@@ -367,7 +367,7 @@ implementation
         if (procdef.extnumber=$ffff) then
         if (procdef.extnumber=$ffff) then
           Internalerror(200006139);
           Internalerror(200006139);
         { mov vmtoffs(%eax),%eax ; method offs }
         { 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);
         cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
       end;
       end;
 
 
@@ -412,7 +412,7 @@ implementation
               loadvmtto(NR_EAX);
               loadvmtto(NR_EAX);
               loadmethodoffstoeax;
               loadmethodoffstoeax;
               { mov %eax,4(%esp) }
               { 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));
               list.concat(taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
               { pop  %eax }
               { pop  %eax }
               list.concat(taicpu.op_reg(A_POP,S_L,NR_EAX));
               list.concat(taicpu.op_reg(A_POP,S_L,NR_EAX));

+ 1 - 1
compiler/i386/n386add.pas

@@ -451,7 +451,7 @@ interface
     begin
     begin
       pass_left_right;
       pass_left_right;
       reg:=NR_NO;
       reg:=NR_NO;
-      reference_reset(ref,sizeof(pint));
+      reference_reset(ref,sizeof(pint),[]);
 
 
       { Mul supports registers and references, so if not register/reference,
       { Mul supports registers and references, so if not register/reference,
         load the location into a register.
         load the location into a register.

+ 3 - 3
compiler/i386/n386cal.pas

@@ -77,10 +77,10 @@ implementation
                   libparaloc:=paralocs[procdefinition.paras.count-1]^.location;
                   libparaloc:=paralocs[procdefinition.paras.count-1]^.location;
                   if libparaloc^.loc <> LOC_REFERENCE then
                   if libparaloc^.loc <> LOC_REFERENCE then
                     internalerror(2016090203);
                     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.getcpuregister(current_asmdata.CurrAsmList,NR_EAX);
                   cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,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));
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_CALL,S_NO,tmpref));
                   cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_EAX);
                   cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_EAX);
                   exit;
                   exit;
@@ -89,7 +89,7 @@ implementation
                 begin
                 begin
                   current_asmdata.CurrAsmList.concat(tai_comment.create(strpnew('AROS SysCall - RegBase in EAX')));
                   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 }
                   { 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));
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_CALL,S_NO,tmpref));
                   exit;
                   exit;
                 end;
                 end;

+ 2 - 2
compiler/i386/n386flw.pas

@@ -260,7 +260,7 @@ procedure emit_scope_start(handler,data: TAsmSymbol);
     hreg: tregister;
     hreg: tregister;
   begin
   begin
     hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
     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;
     href.segment:=NR_FS;
     emit_reg_reg(A_XOR,S_L,hreg,hreg);
     emit_reg_reg(A_XOR,S_L,hreg,hreg);
     emit_sym(A_PUSH,S_L,data);
     emit_sym(A_PUSH,S_L,data);
@@ -277,7 +277,7 @@ procedure emit_scope_end;
   begin
   begin
     hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
     hreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
     hreg2:=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;
     href.segment:=NR_FS;
     emit_reg_reg(A_XOR,S_L,hreg,hreg);
     emit_reg_reg(A_XOR,S_L,hreg,hreg);
     emit_reg(A_POP,S_L,hreg2);
     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);
                a_load_reg_reg(list,paraloc^.size,paraloc^.size,r,paraloc^.register);
              LOC_REFERENCE,LOC_CREFERENCE:
              LOC_REFERENCE,LOC_CREFERENCE:
                begin
                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);
                   a_load_reg_ref(list,paraloc^.size,paraloc^.size,r,ref);
                end;
                end;
              else
              else
@@ -1005,7 +1005,7 @@ unit cgcpu;
                 cgpara.check_simple_location;
                 cgpara.check_simple_location;
                 len:=align(cgpara.intsize,cgpara.alignment);
                 len:=align(cgpara.intsize,cgpara.alignment);
                 g_stackpointer_alloc(list,len);
                 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);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -1092,7 +1092,7 @@ unit cgcpu;
                           end
                           end
                         else if assigned(symbol) then
                         else if assigned(symbol) then
                           begin
                           begin
-                            reference_reset_symbol(tmpref,r.symbol,0,0);
+                            reference_reset_symbol(tmpref,r.symbol,0,r.alignment,r.volatility);
                             tmpref.refaddr:=addr_seg;
                             tmpref.refaddr:=addr_seg;
                             if current_settings.cputype < cpu_186 then
                             if current_settings.cputype < cpu_186 then
                               begin
                               begin
@@ -1871,7 +1871,7 @@ unit cgcpu;
           { Restore SP position before SP change }
           { Restore SP position before SP change }
           if current_settings.x86memorymodel=mm_huge then
           if current_settings.x86memorymodel=mm_huge then
             stacksize:=stacksize + 2;
             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));
           list.concat(Taicpu.op_ref_reg(A_LEA,S_W,ref,NR_SP));
           sp_moved:=true;
           sp_moved:=true;
         end;
         end;
@@ -2237,16 +2237,16 @@ unit cgcpu;
                       list.concat(taicpu.op_reg_reg(A_MOV,S_W,reference.index,NR_DI));
                       list.concat(taicpu.op_reg_reg(A_MOV,S_W,reference.index,NR_DI));
 
 
                       if reference.index=NR_SP then
                       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
                       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;
                       href.segment:=NR_SS;
                       a_op_const_ref(list,OP_SUB,size,ioffset,href);
                       a_op_const_ref(list,OP_SUB,size,ioffset,href);
                       list.concat(taicpu.op_reg(A_POP,S_W,NR_DI));
                       list.concat(taicpu.op_reg(A_POP,S_W,NR_DI));
                     end
                     end
                   else
                   else
                     begin
                     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;
                       href.segment:=NR_SS;
                       a_op_const_ref(list,OP_SUB,size,ioffset,href);
                       a_op_const_ref(list,OP_SUB,size,ioffset,href);
                     end;
                     end;

+ 18 - 18
compiler/i8086/hlcgcpu.pas

@@ -67,7 +67,7 @@ interface
      public
      public
       function getaddressregister(list:TAsmList;size:tdef):Tregister;override;
       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;
       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
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                     begin
                     begin
                       cg.g_stackpointer_alloc(list,stacksize);
                       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
                     end
                   else
                   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);
                   cg.a_loadfpu_reg_ref(list,locsize,locsize,l.register,href);
                 end;
                 end;
               LOC_FPUREGISTER:
               LOC_FPUREGISTER:
@@ -194,10 +194,10 @@ implementation
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                      (cgpara.location^.reference.index=NR_STACK_POINTER_REG) then
                     begin
                     begin
                       cg.g_stackpointer_alloc(list,stacksize);
                       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
                     end
                   else
                   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);
                   cg.a_loadmm_reg_ref(list,locsize,locsize,l.register,href,mms_movescalar);
                 end;
                 end;
               LOC_FPUREGISTER:
               LOC_FPUREGISTER:
@@ -223,7 +223,7 @@ implementation
                     cg.a_load_ref_cgpara(list,locsize,l.reference,cgpara)
                     cg.a_load_ref_cgpara(list,locsize,l.reference,cgpara)
                   else
                   else
                     begin
                     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);
                       cg.g_concatcopy(list,l.reference,href,stacksize);
                     end;
                     end;
                 end;
                 end;
@@ -266,9 +266,9 @@ implementation
 
 
 
 
   procedure thlcgcpu.reference_reset_base(var ref: treference; regsize: tdef;
   procedure thlcgcpu.reference_reset_base(var ref: treference; regsize: tdef;
-    reg: tregister; offset, alignment: longint);
+    reg: tregister; offset, alignment: longint; volatility: tvolatilityset);
     begin
     begin
-      inherited reference_reset_base(ref, regsize, reg, offset, alignment);
+      inherited;
 
 
       { implicit pointer types on i8086 follow the default data pointer size for
       { implicit pointer types on i8086 follow the default data pointer size for
         the current memory model }
         the current memory model }
@@ -380,7 +380,7 @@ implementation
             which can be obtained by the SEG directive }
             which can be obtained by the SEG directive }
           else if assigned(ref.symbol) then
           else if assigned(ref.symbol) then
             begin
             begin
-              reference_reset_symbol(segref,ref.symbol,0,0);
+              reference_reset_symbol(segref,ref.symbol,0,ref.alignment,ref.volatility);
               segref.refaddr:=addr_seg;
               segref.refaddr:=addr_seg;
               cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,GetNextReg(r));
               cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,GetNextReg(r));
             end
             end
@@ -519,7 +519,7 @@ implementation
             if current_settings.x86memorymodel in x86_far_code_models then
             if current_settings.x86memorymodel in x86_far_code_models then
               inc(selfoffsetfromsp,2);
               inc(selfoffsetfromsp,2);
             list.concat(taicpu.op_reg_reg(A_mov,S_W,NR_SP,NR_DI));
             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
             if not segment_regs_equal(NR_SS,NR_DS) then
               href.segment:=NR_SS;
               href.segment:=NR_SS;
             if current_settings.x86memorymodel in x86_near_data_models then
             if current_settings.x86memorymodel in x86_near_data_models then
@@ -540,12 +540,12 @@ implementation
         { mov  0(%bx),%bx ; load vmt}
         { mov  0(%bx),%bx ; load vmt}
         if current_settings.x86memorymodel in x86_near_data_models then
         if current_settings.x86memorymodel in x86_near_data_models then
           begin
           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);
             cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_BX);
           end
           end
         else
         else
           begin
           begin
-            reference_reset_base(href,voidnearpointertype,NR_BX,0,2);
+            reference_reset_base(href,voidnearpointertype,NR_BX,0,2,[]);
             href.segment:=NR_ES;
             href.segment:=NR_ES;
             list.concat(taicpu.op_ref_reg(A_LES,S_W,href,NR_BX));
             list.concat(taicpu.op_ref_reg(A_LES,S_W,href,NR_BX));
           end;
           end;
@@ -566,12 +566,12 @@ implementation
         if current_settings.x86memorymodel in x86_far_code_models then
         if current_settings.x86memorymodel in x86_far_code_models then
           begin
           begin
             { mov vmtseg(%bx),%si ; method seg }
             { 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;
             href.segment:=srcseg;
             cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_SI);
             cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_SI);
           end;
           end;
         { mov vmtoffs(%bx),%bx ; method offs }
         { 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;
         href.segment:=srcseg;
         cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_BX);
         cg.a_load_ref_reg(list,OS_16,OS_16,href,NR_BX);
       end;
       end;
@@ -625,9 +625,9 @@ implementation
           { set target address
           { set target address
             "mov %bx,4(%sp)" }
             "mov %bx,4(%sp)" }
           if current_settings.x86memorymodel in x86_far_code_models then
           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
           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
           if not segment_regs_equal(NR_DS,NR_SS) then
             href.segment:=NR_SS;
             href.segment:=NR_SS;
           list.concat(taicpu.op_reg_reg(A_MOV,S_W,NR_SP,NR_DI));
           list.concat(taicpu.op_reg_reg(A_MOV,S_W,NR_SP,NR_DI));
@@ -689,7 +689,7 @@ implementation
           else
           else
             internalerror(2014052202);
             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;
           l.reference:=r;
         end
         end
       else if is_fourbyterecord(size) and (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
       else if is_fourbyterecord(size) and (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
@@ -704,7 +704,7 @@ implementation
           else
           else
             cg.a_load_reg_ref(list,OS_16,OS_16,GetNextReg(l.register),tmpref);
             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;
           l.reference:=r;
         end
         end
       else
       else

+ 1 - 1
compiler/i8086/n8086add.pas

@@ -998,7 +998,7 @@ interface
 
 
     begin
     begin
       reg:=NR_NO;
       reg:=NR_NO;
-      reference_reset(ref,sizeof(pint));
+      reference_reset(ref,sizeof(pint),[]);
 
 
       pass_left_right;
       pass_left_right;
 
 

+ 1 - 1
compiler/i8086/n8086inl.pas

@@ -106,7 +106,7 @@ implementation
            begin
            begin
              location_reset(location,LOC_REGISTER,OS_16);
              location_reset(location,LOC_REGISTER,OS_16);
              location.register:=cg.getintregister(current_asmdata.CurrAsmList,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;
              segref.refaddr:=addr_seg;
              cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,location.register);
              cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,location.register);
            end
            end

+ 11 - 11
compiler/i8086/n8086ld.pas

@@ -117,7 +117,7 @@ implementation
             { we don't know the size of all arrays }
             { we don't know the size of all arrays }
             newsize:=def_cgsize(resultdef);
             newsize:=def_cgsize(resultdef);
             { alignment is overridden per case below }
             { 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
               Thread var loading is optimized to first check if
@@ -139,18 +139,18 @@ implementation
             paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
             paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
             hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pvd);
             hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pvd);
             segreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_16);
             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;
             segref.refaddr:=addr_seg;
             cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,segreg);
             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;
             href.segment:=segreg;
             hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,pvd,pvd,href,hregister);
             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);
             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 }
             { don't save the allocated register else the result will be destroyed later }
             if not(vo_is_weak_external in gvs.varoptions) then
             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
             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);
             cg.a_load_ref_cgpara(current_asmdata.CurrAsmList,OS_16,href,paraloc1);
             paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
             paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
             paraloc1.done;
             paraloc1.done;
@@ -168,12 +168,12 @@ implementation
                 0 - Threadvar index
                 0 - Threadvar index
                 4 - Threadvar value in single threading }
                 4 - Threadvar value in single threading }
             if not(vo_is_weak_external in gvs.varoptions) then
             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
             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);
             hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,voidpointertype,href,hregister);
             cg.a_label(current_asmdata.CurrAsmList,endrelocatelab);
             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
           end
         else
         else
           inherited generate_threadvar_access(gvs);
           inherited generate_threadvar_access(gvs);
@@ -218,7 +218,7 @@ implementation
                       { we don't know the size of all arrays }
                       { we don't know the size of all arrays }
                       newsize:=def_cgsize(resultdef);
                       newsize:=def_cgsize(resultdef);
                       { alignment is overridden per case below }
                       { 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
                       if gvs.localloc.loc=LOC_INVALID then
                         begin
                         begin
@@ -229,11 +229,11 @@ implementation
 
 
                           segreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_16);
                           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;
                           segref.refaddr:=addr_seg;
                           cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,segreg);
                           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;
                           location.reference.segment:=segreg;
                         end
                         end
                       else
                       else

+ 2 - 2
compiler/i8086/n8086mem.pas

@@ -129,9 +129,9 @@ implementation
             { assume natural alignment, except for packed records }
             { assume natural alignment, except for packed records }
             if not(resultdef.typ in [recorddef,objectdef]) or
             if not(resultdef.typ in [recorddef,objectdef]) or
                (tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
                (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
             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
             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);
               hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
             case left.location.loc of
             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_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_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));
           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;
           tparavarsym(p).localloc.reference:=tmpref;
         end;
         end;
 
 
@@ -1033,7 +1033,7 @@ implementation
               end;
               end;
             art_indexref:
             art_indexref:
               begin
               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;
                 href.symbol:=ref.indexsymbol;
                 a_load_ref_stack(list,s32inttype,href,prepare_stack_for_ref(list,href,false));
                 a_load_ref_stack(list,s32inttype,href,prepare_stack_for_ref(list,href,false));
               end;
               end;
@@ -1790,8 +1790,8 @@ implementation
             begin
             begin
               { passed by reference in array of single element; l contains the
               { passed by reference in array of single element; l contains the
                 base address of the array }
                 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.arrayreftype:=art_indexconst;
               tmploc.reference.indexoffset:=0;
               tmploc.reference.indexoffset:=0;
               a_load_loc_reg(list,java_jlobject,java_jlobject,l,tmploc.reference.base);
               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);
       stackslots:=prepare_stack_for_ref(list,localref,false);
       { create the local copy of the array (lenloc is invalid, get length
       { create the local copy of the array (lenloc is invalid, get length
         directly from the array) }
         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;
       arrloc.reference:=ref;
       g_getarraylen(list,arrloc);
       g_getarraylen(list,arrloc);
       g_newarray(list,arrdef,1);
       g_newarray(list,arrdef,1);
@@ -1858,7 +1858,7 @@ implementation
       case current_procinfo.procdef.proctypeoption of
       case current_procinfo.procdef.proctypeoption of
         potype_unitinit:
         potype_unitinit:
           begin
           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
             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.globalsymtable,ref,staticvarsym);
             allocate_implicit_structs_for_st_with_base_ref(list,current_module.localsymtable,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 }
             { also initialise local variables, if any }
             inherited;
             inherited;
             { initialise class fields }
             { 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);
             allocate_implicit_structs_for_st_with_base_ref(list,tabstractrecorddef(current_procinfo.procdef.owner.defowner).symtable,ref,staticvarsym);
           end
           end
         else
         else
@@ -2321,7 +2321,7 @@ implementation
       { no enum with ordinal value 0 -> exit }
       { no enum with ordinal value 0 -> exit }
       if not assigned(sym) then
       if not assigned(sym) then
         exit;
         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;
       result:=true;
     end;
     end;
 
 
@@ -2418,7 +2418,7 @@ implementation
         internalerror(2011033001);
         internalerror(2011033001);
       selfreg:=getaddressregister(list,selfpara.vardef);
       selfreg:=getaddressregister(list,selfpara.vardef);
       a_load_loc_reg(list,obj,obj,selfpara.localloc,selfreg);
       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);
       allocate_implicit_structs_for_st_with_base_ref(list,obj.symtable,ref,fieldvarsym);
     end;
     end;
 
 

+ 1 - 1
compiler/jvm/njvmcal.pas

@@ -417,7 +417,7 @@ implementation
 
 
     procedure tjvmcallnode.set_result_location(realresdef: tstoreddef);
     procedure tjvmcallnode.set_result_location(realresdef: tstoreddef);
       begin
       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
         { in case of jvmimplicitpointertype(), the function will have allocated
           it already and we don't have to allocate it again here }
           it already and we don't have to allocate it again here }
         if not jvmimplicitpointertype(realresdef) then
         if not jvmimplicitpointertype(realresdef) then

+ 3 - 3
compiler/jvm/njvmcnv.pas

@@ -711,7 +711,7 @@ implementation
       begin
       begin
         tg.gethltemp(current_asmdata.currasmlist,java_jlobject,java_jlobject.size,tt_normal,r);
         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);
         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;
         location.reference:=r;
       end;
       end;
 
 
@@ -830,11 +830,11 @@ implementation
         { store the data in the newly created array }
         { store the data in the newly created array }
         basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
         basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
         thlcgjvm(hlcg).a_load_stack_reg(current_asmdata.CurrAsmList,java_jlobject,basereg);
         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.arrayreftype:=art_indexconst;
         arrayref.indexoffset:=0;
         arrayref.indexoffset:=0;
         hlcg.a_load_loc_ref(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,arrayref);
         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);
         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);
         hlcg.a_load_reg_ref(current_asmdata.CurrAsmList,java_jlobject,java_jlobject,basereg,location.reference);
       end;
       end;

+ 2 - 2
compiler/jvm/njvmflw.pas

@@ -232,7 +232,7 @@ implementation
                the exception code (in case of an anonymous "raise") }
                the exception code (in case of an anonymous "raise") }
              current_asmdata.CurrAsmList.concat(tai_marker.create(mark_NoLineInfoStart));
              current_asmdata.CurrAsmList.concat(tai_marker.create(mark_NoLineInfoStart));
              prev_except_loc:=current_except_loc;
              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);
              tg.GetLocal(current_asmdata.CurrAsmList,sizeof(pint),java_jlthrowable,current_except_loc.reference);
              thlcgjvm(hlcg).incstack(current_asmdata.CurrAsmList,1);
              thlcgjvm(hlcg).incstack(current_asmdata.CurrAsmList,1);
              thlcgjvm(hlcg).a_load_stack_loc(current_asmdata.CurrAsmList,java_jlthrowable,current_except_loc);
              thlcgjvm(hlcg).a_load_stack_loc(current_asmdata.CurrAsmList,java_jlthrowable,current_except_loc);
@@ -302,7 +302,7 @@ implementation
 
 
          { Retrieve exception variable }
          { Retrieve exception variable }
          { 1) prepare the location where we'll store it }
          { 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);
          tg.GetLocal(current_asmdata.CurrAsmList,sizeof(pint),exceptvarsym.vardef,exceptvarsym.localloc.reference);
          prev_except_loc:=current_except_loc;
          prev_except_loc:=current_except_loc;
          current_except_loc:=exceptvarsym.localloc;
          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 }
         { in case of nested access, load address of field in nestedfpstruct }
         if assigned(left) then
         if assigned(left) then
           generate_nested_access(tabstractnormalvarsym(symtableentry));
           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.arrayreftype:=art_indexconst;
         location.reference.base:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
         location.reference.base:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
         location.reference.indexoffset:=0;
         location.reference.indexoffset:=0;
@@ -288,7 +288,7 @@ procedure tjvmarrayconstructornode.makearrayref(var ref: treference; eledef: tde
     { arrays are implicitly dereferenced }
     { arrays are implicitly dereferenced }
     basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
     basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,java_jlobject);
     hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,java_jlobject,java_jlobject,ref,basereg);
     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.arrayreftype:=art_indexconst;
     ref.indexoffset:=0;
     ref.indexoffset:=0;
   end;
   end;

+ 4 - 4
compiler/jvm/njvmmem.pas

@@ -120,8 +120,8 @@ implementation
               parameters stored in nestedfpstructs, and by programmers for any
               parameters stored in nestedfpstructs, and by programmers for any
               kind of pointers) }
               kind of pointers) }
             hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
             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;
             location.reference.arrayreftype:=art_indexconst;
             if (left.nodetype<>addrn) and
             if (left.nodetype<>addrn) and
                not(resultdef.typ in [orddef,floatdef]) and
                not(resultdef.typ in [orddef,floatdef]) and
@@ -431,9 +431,9 @@ implementation
         secondpass(left);
         secondpass(left);
         newsize:=def_cgsize(resultdef);
         newsize:=def_cgsize(resultdef);
         if left.location.loc=LOC_CREFERENCE then
         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
         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,
         { 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 }
           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);
         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
     begin
       { on the LLVM target, every temp is independent and encoded via a
       { on the LLVM target, every temp is independent and encoded via a
         separate temp register whose superregister number is stored in p^.pos }
         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;
     end;
 
 
 
 
@@ -252,7 +252,7 @@ implementation
               begin
               begin
                  if assigned(location^.next) then
                  if assigned(location^.next) then
                    internalerror(2010052906);
                    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
                  if (def_cgsize(size)<>OS_NO) and
                     (size.size=sizeleft) and
                     (size.size=sizeleft) and
                     (sizeleft<=sizeof(aint)) then
                     (sizeleft<=sizeof(aint)) then
@@ -317,7 +317,7 @@ implementation
         begin
         begin
           reg:=getaddressregister(list,cpointerdef.getreusable(newrefsize));
           reg:=getaddressregister(list,cpointerdef.getreusable(newrefsize));
           a_loadaddr_ref_reg(list,refsize,cpointerdef.getreusable(newrefsize),initialref,reg);
           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;
           refsize:=newrefsize;
         end
         end
       else
       else
@@ -468,7 +468,7 @@ implementation
                         internalerror(2014012307)
                         internalerror(2014012307)
                       else
                       else
                         begin
                         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);
                           res:=getregisterfordef(list, paraloc^.def);
                           load_ref_anyreg(callpara^.def, href, res, callpara);
                           load_ref_anyreg(callpara^.def, href, res, callpara);
                         end;
                         end;
@@ -621,7 +621,7 @@ implementation
                   { typecast pointer to memory into pointer to integer type }
                   { typecast pointer to memory into pointer to integer type }
                   hreg:=getaddressregister(list,cpointerdef.getreusable(tosize));
                   hreg:=getaddressregister(list,cpointerdef.getreusable(tosize));
                   a_loadaddr_ref_reg(list,fromsize,cpointerdef.getreusable(tosize),tmpref,hreg);
                   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 }
                   { load the integer from the temp into the destination }
                   a_load_ref_ref(list,tosize,tosize,sref,ref);
                   a_load_ref_ref(list,tosize,tosize,sref,ref);
                   tg.ungettemp(list,tmpref);
                   tg.ungettemp(list,tmpref);
@@ -643,7 +643,7 @@ implementation
             begin
             begin
               hreg2:=getaddressregister(list,cpointerdef.getreusable(fromsize));
               hreg2:=getaddressregister(list,cpointerdef.getreusable(fromsize));
               a_loadaddr_ref_reg(list,tosize,cpointerdef.getreusable(fromsize),sref,hreg2);
               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;
               tosize:=fromsize;
             end;
             end;
         end
         end
@@ -1418,7 +1418,7 @@ implementation
     begin
     begin
       hreg:=getaddressregister(list,todef);
       hreg:=getaddressregister(list,todef);
       a_loadaddr_ref_reg_intern(list,fromdef,todef,ref,hreg,false);
       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;
     end;
 
 
 
 
@@ -1455,7 +1455,7 @@ implementation
             subscriptdef:=cpointerdef.getreusable(currentstructdef);
             subscriptdef:=cpointerdef.getreusable(currentstructdef);
           { recurse into the first field }
           { recurse into the first field }
           list.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,subscriptdef,recref,s32inttype,0,true));
           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 }
           { go to the parent }
           currentstructdef:=parentdef;
           currentstructdef:=parentdef;
         end;
         end;
@@ -1469,7 +1469,7 @@ implementation
       newbase:=getaddressregister(list,cpointerdef.getreusable(llvmfield.def));
       newbase:=getaddressregister(list,cpointerdef.getreusable(llvmfield.def));
       recref:=make_simple_ref(list,recref,recdef);
       recref:=make_simple_ref(list,recref,recdef);
       list.concat(taillvm.getelementptr_reg_size_ref_size_const(newbase,subscriptdef,recref,s32inttype,field.llvmfieldnr,true));
       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
       { in case of an 80 bits extended type, typecast from an array of 10
         bytes (used because otherwise llvm will allocate the ABI-defined
         bytes (used because otherwise llvm will allocate the ABI-defined
         size for extended, which is usually larger) into an extended }
         size for extended, which is usually larger) into an extended }
@@ -1676,7 +1676,7 @@ implementation
             begin
             begin
               hreg:=getaddressregister(list,cpointerdef.getreusable(llvmparadef));
               hreg:=getaddressregister(list,cpointerdef.getreusable(llvmparadef));
               a_loadaddr_ref_reg(list,vardef,cpointerdef.getreusable(llvmparadef),destloc.reference,hreg);
               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;
             end;
           index:=0;
           index:=0;
           ploc:=para.location;
           ploc:=para.location;
@@ -1846,11 +1846,11 @@ implementation
         begin
         begin
           ptrindex:=ref.offset div pointedsize;
           ptrindex:=ref.offset div pointedsize;
           if assigned(ref.symbol) then
           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
           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)));
           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;
           exit;
         end;
         end;
       { for now, perform all calculations using plain pointer arithmetic. Later
       { for now, perform all calculations using plain pointer arithmetic. Later
@@ -1865,7 +1865,7 @@ implementation
         begin
         begin
           if ref.base<>NR_NO then
           if ref.base<>NR_NO then
             internalerror(2012111301);
             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));
           list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg1,ptrdef,tmpref,ptruinttype,0,true));
         end
         end
       else if ref.base<>NR_NO then
       else if ref.base<>NR_NO then
@@ -1890,7 +1890,7 @@ implementation
         end;
         end;
       hreg2:=getaddressregister(list,ptrdef);
       hreg2:=getaddressregister(list,ptrdef);
       a_load_reg_reg(list,ptruinttype,ptrdef,hreg1,hreg2);
       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;
     end;
 
 
 
 
@@ -1954,7 +1954,7 @@ implementation
       case paraloc^.llvmloc.loc of
       case paraloc^.llvmloc.loc of
         LOC_REFERENCE:
         LOC_REFERENCE:
           begin
           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;
             hloc.reference.symbol:=paraloc^.llvmloc.sym;
             if paraloc^.llvmvalueloc then
             if paraloc^.llvmvalueloc then
               hloc.reference.refaddr:=addr_full;
               hloc.reference.refaddr:=addr_full;
@@ -1970,7 +1970,7 @@ implementation
               begin
               begin
                 if getregtype(paraloc^.llvmloc.reg)<>R_TEMPREGISTER then
                 if getregtype(paraloc^.llvmloc.reg)<>R_TEMPREGISTER then
                   internalerror(2014011903);
                   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;
                 hloc.reference.base:=paraloc^.llvmloc.reg;
               end;
               end;
           end;
           end;
@@ -2018,7 +2018,7 @@ implementation
       if vs.paraloc[calleeside].location^.llvmloc.loc<>LOC_REFERENCE then
       if vs.paraloc[calleeside].location^.llvmloc.loc<>LOC_REFERENCE then
         internalerror(2014010708);
         internalerror(2014010708);
       parasym:=vs.paraloc[calleeside].location^.llvmloc.sym;
       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
       if vs.paraloc[calleeside].location^.llvmvalueloc then
         vs.initialloc.reference.refaddr:=addr_full;
         vs.initialloc.reference.refaddr:=addr_full;
     end;
     end;

+ 4 - 4
compiler/llvm/nllvmcnv.pas

@@ -122,7 +122,7 @@ procedure tllvmtypeconvnode.second_pointer_to_array;
     { insert type conversion }
     { insert type conversion }
     hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef));
     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);
     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;
   end;
 
 
 
 
@@ -168,7 +168,7 @@ procedure tllvmtypeconvnode.second_nil_to_methodprocvar;
     href: treference;
     href: treference;
   begin
   begin
     tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,href);
     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;
     location.reference:=href;
     hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef),cpointerdef.getreusable(methodpointertype),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);
     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);
         hlcg.location_force_mem(current_asmdata.CurrAsmList,left.location,left.resultdef);
         hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(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);
         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
       end
     else
     else
       location_copy(location,left.location);
       location_copy(location,left.location);

+ 2 - 2
compiler/llvm/nllvmcon.pas

@@ -86,7 +86,7 @@ implementation
             resptrdef:=cpointerdef.getreusable(resultdef);
             resptrdef:=cpointerdef.getreusable(resultdef);
             hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resptrdef);
             hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resptrdef);
             hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,datadef,resptrdef,location.reference,hreg);
             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;
       end;
       end;
 
 
@@ -125,7 +125,7 @@ implementation
         dataptrdef:=cpointerdef.getreusable(field.vardef);
         dataptrdef:=cpointerdef.getreusable(field.vardef);
         { load the address of the string data }
         { load the address of the string data }
         reg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,dataptrdef);
         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(
         current_asmdata.CurrAsmList.concat(
           taillvm.getelementptr_reg_size_ref_size_const(reg,cpointerdef.getreusable(strrecdef),href,
           taillvm.getelementptr_reg_size_ref_size_const(reg,cpointerdef.getreusable(strrecdef),href,
           s32inttype,field.llvmfieldnr,true));
           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
             if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
               internalerror(2014080806);
               internalerror(2014080806);
            { typecast the shortstring reference into a length byte reference }
            { 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));
            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.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
          end
         else
         else
          begin
          begin
@@ -159,7 +159,9 @@ implementation
            current_asmdata.getjumplabel(nillab);
            current_asmdata.getjumplabel(nillab);
            current_asmdata.getjumplabel(lengthlab);
            current_asmdata.getjumplabel(lengthlab);
            hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,cpointerdef.getreusable(lendef),OC_EQ,0,left.location.register,nillab);
            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);
            hregister:=hlcg.getintregister(current_asmdata.CurrAsmList,resultdef);
            hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,lendef,resultdef,href,hregister);
            hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,lendef,resultdef,href,hregister);
            if is_widestring(left.resultdef) then
            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_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,cprocvardef.getreusableprocaddr(procdef),trecorddef(methodpointertype),procreg,'proc',mpref);
               hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,selfdef,trecorddef(methodpointertype),selfreg,'self',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;
               location.reference:=href;
             end;
             end;
         end;
         end;

+ 4 - 4
compiler/llvm/nllvmmem.pas

@@ -88,7 +88,7 @@ implementation
               left.resultdef,
               left.resultdef,
               cpointerdef.getreusable(fielddef),
               cpointerdef.getreusable(fielddef),
               location.reference,newbase);
               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;
             result:=false;
           end
           end
         else
         else
@@ -157,7 +157,7 @@ implementation
           else
           else
             current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,left.resultdef,
             current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,left.resultdef,
               locref^,ptruinttype,constarrayoffset,false));
               locref^,ptruinttype,constarrayoffset,false));
-          reference_reset_base(locref^,hreg,0,locref^.alignment);
+          reference_reset_base(locref^,hreg,0,locref^.alignment,locref^.volatility);
         end;
         end;
 
 
       { see comment in getarrelementptrdef }
       { see comment in getarrelementptrdef }
@@ -216,7 +216,7 @@ implementation
         { the array is already a pointer -> just index }
         { the array is already a pointer -> just index }
         current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,left.resultdef,
         current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,left.resultdef,
           location.reference,ptruinttype,maybe_const_reg,false));
           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);
       location.reference.alignment:=newalignment(location.reference.alignment,l);
     end;
     end;
 
 
@@ -278,7 +278,7 @@ implementation
       current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(basereg,cpointerdef.getreusable(left.resultdef),
       current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(basereg,cpointerdef.getreusable(left.resultdef),
         sref.ref,ptruinttype,offsetreg,true));
         sref.ref,ptruinttype,offsetreg,true));
       arraytopointerconverted:=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
       { calculate the bit index inside that chunk: mask out
         the chunk index part }
         the chunk index part }
       hreg2:=hlcg.getintregister(current_asmdata.CurrAsmList,ptruinttype);
       hreg2:=hlcg.getintregister(current_asmdata.CurrAsmList,ptruinttype);

+ 1 - 1
compiler/llvm/tgllvm.pas

@@ -91,7 +91,7 @@ implementation
         tl: ptemprecord;
         tl: ptemprecord;
         oldfileinfo: tfileposinfo;
         oldfileinfo: tfileposinfo;
       begin
       begin
-        reference_reset_base(ref,cg.gettempregister(list),0,alignment);
+        reference_reset_base(ref,cg.gettempregister(list),0,alignment,[]);
         new(tl);
         new(tl);
 
 
         tl^.temptype:=temptype;
         tl^.temptype:=temptype;

+ 2 - 2
compiler/m68k/aoptcpu.pas

@@ -288,9 +288,9 @@ unit aoptcpu;
                         begin
                         begin
                           DebugMsg('Optimizer: SUB/ADD #val,Ax to LEA val(Ax),Ax',p);
                           DebugMsg('Optimizer: SUB/ADD #val,Ax to LEA val(Ax),Ax',p);
                           if taicpu(p).opcode in [A_SUB,A_SUBA] then
                           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
                           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).opcode:=A_LEA;
                           taicpu(p).loadref(0,tmpref);
                           taicpu(p).loadref(0,tmpref);
                           result:=true;
                           result:=true;

+ 21 - 21
compiler/m68k/cgcpu.pas

@@ -301,7 +301,7 @@ unit cgcpu;
             else
             else
               pushsize:=int_cgsize(cgpara.alignment);
               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;
             ref.direction := dir_dec;
             list.concat(taicpu.op_reg_ref(A_MOVE,tcgsize2opsize[pushsize],makeregsize(list,r,pushsize),ref));
             list.concat(taicpu.op_reg_ref(A_MOVE,tcgsize2opsize[pushsize],makeregsize(list,r,pushsize),ref));
           end
           end
@@ -323,7 +323,7 @@ unit cgcpu;
             else
             else
               pushsize:=int_cgsize(cgpara.alignment);
               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;
             ref.direction := dir_dec;
             a_load_const_ref(list, pushsize, a, ref);
             a_load_const_ref(list, pushsize, a, ref);
           end
           end
@@ -364,7 +364,7 @@ unit cgcpu;
           else
           else
             pushsize:=int_cgsize(cgpara.alignment);
             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;
           ref.direction := dir_dec;
 
 
           a_load_ref_ref(list,int_cgsize(tcgsize2size[paraloc^.size]),pushsize,href,ref);
           a_load_ref_ref(list,int_cgsize(tcgsize2size[paraloc^.size]),pushsize,href,ref);
@@ -384,7 +384,7 @@ unit cgcpu;
                 cgpara.check_simple_location;
                 cgpara.check_simple_location;
                 len:=align(cgpara.intsize,cgpara.alignment);
                 len:=align(cgpara.intsize,cgpara.alignment);
                 g_stackpointer_alloc(list,len);
                 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);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -439,7 +439,7 @@ unit cgcpu;
              //list.concat(tai_comment.create(strpnew('fixref: symbol with base or index')));
              //list.concat(tai_comment.create(strpnew('fixref: symbol with base or index')));
 
 
              hreg:=getaddressregister(list);
              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));
              list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
              ref.offset:=0;
              ref.offset:=0;
              ref.symbol:=nil;
              ref.symbol:=nil;
@@ -469,7 +469,7 @@ unit cgcpu;
                begin
                begin
                  //list.concat(tai_comment.create(strpnew('fixref: base is dX, resolving with reverse regs')));
                  //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;
                  href.index:=ref.base;
                  { we can fold in an 8 bit offset "for free" }
                  { we can fold in an 8 bit offset "for free" }
                  if isvalue8bit(ref.offset) then
                  if isvalue8bit(ref.offset) then
@@ -507,7 +507,7 @@ unit cgcpu;
 
 
                  if isvalue16bit(ref.offset) then
                  if isvalue16bit(ref.offset) then
                    begin
                    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));
                      list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
                    end
                    end
                  else
                  else
@@ -622,13 +622,13 @@ unit cgcpu;
         if isaddressregister(reg) then
         if isaddressregister(reg) then
           begin
           begin
             { if we have an address register, we can jump to the address directly }
             { 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
           end
         else
         else
           begin
           begin
             { if we have a data register, we need to move it to an address register first }
             { if we have a data register, we need to move it to an address register first }
             tmpreg:=getaddressregister(list);
             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);
             instr:=taicpu.op_reg_reg(A_MOVE,S_L,reg,tmpreg);
             add_move_instruction(instr);
             add_move_instruction(instr);
             list.concat(instr);
             list.concat(instr);
@@ -797,7 +797,7 @@ unit cgcpu;
         tmpref:=ref;
         tmpref:=ref;
         inc(tmpref.offset,tcgsize2size[tosize]-1);
         inc(tmpref.offset,tcgsize2size[tosize]-1);
         a_loadaddr_ref_reg(list,tmpref,tmpreg2);
         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;
         tmpref.direction:=dir_none;
 
 
         tmpreg:=getintregister(list,tosize);
         tmpreg:=getintregister(list,tosize);
@@ -976,7 +976,7 @@ unit cgcpu;
 
 
         tmpreg2:=getaddressregister(list);
         tmpreg2:=getaddressregister(list);
         a_loadaddr_ref_reg(list,ref,tmpreg2);
         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;
         tmpref.direction:=dir_inc;
 
 
         if isaddressregister(register) then
         if isaddressregister(register) then
@@ -1069,7 +1069,7 @@ unit cgcpu;
         if use_push(cgpara) and (current_settings.fputype in [fpu_68881,fpu_coldfire]) then
         if use_push(cgpara) and (current_settings.fputype in [fpu_68881,fpu_coldfire]) then
           begin
           begin
             cgpara.check_simple_location;
             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;
             ref.direction := dir_dec;
             list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],reg,ref));
             list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],reg,ref));
           end
           end
@@ -1104,7 +1104,7 @@ unit cgcpu;
               { fmove can't do <ea> -> <ea>, so move it to an fpreg first }
               { fmove can't do <ea> -> <ea>, so move it to an fpreg first }
               freg:=getfpuregister(list,size);
               freg:=getfpuregister(list,size);
               a_loadfpu_ref_reg(list,size,size,ref,freg);
               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;
               href.direction := dir_dec;
               list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],freg,href));
               list.concat(taicpu.op_reg_ref(A_FMOVE,tcgsize2opsize[cgpara.location^.size],freg,href));
             end
             end
@@ -1703,12 +1703,12 @@ unit cgcpu;
          hregister := getintregister(list,OS_INT);
          hregister := getintregister(list,OS_INT);
 
 
          iregister:=getaddressregister(list);
          iregister:=getaddressregister(list);
-         reference_reset_base(srcref,iregister,0,source.alignment);
+         reference_reset_base(srcref,iregister,0,source.alignment,source.volatility);
          srcrefp:=srcref;
          srcrefp:=srcref;
          srcrefp.direction := dir_inc;
          srcrefp.direction := dir_inc;
 
 
          jregister:=getaddressregister(list);
          jregister:=getaddressregister(list);
-         reference_reset_base(dstref,jregister,0,dest.alignment);
+         reference_reset_base(dstref,jregister,0,dest.alignment,dest.volatility);
          dstrefp:=dstref;
          dstrefp:=dstref;
          dstrefp.direction := dir_inc;
          dstrefp.direction := dir_inc;
 
 
@@ -1860,7 +1860,7 @@ unit cgcpu;
 
 
                     hregister:=NR_A0;
                     hregister:=NR_A0;
                     cg.a_reg_alloc(list,hregister);
                     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));
                     list.concat(taicpu.op_ref_reg(A_MOVE,S_L,ref,hregister));
 
 
                     { instead of using a postincrement above (which also writes the     }
                     { 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))
                        list.concat(taicpu.op_const_reg(A_ADDQ,S_L,parasize,r))
                     else { nope ... }
                     else { nope ... }
                        begin
                        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));
                          list.concat(taicpu.op_ref_reg(A_LEA,S_NO,ref2,r));
                        end;
                        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));
                     list.concat(taicpu.op_ref(A_JMP,S_NO,ref));
                   end;
                   end;
               end
               end
@@ -1979,7 +1979,7 @@ unit cgcpu;
               begin
               begin
                 list.concat(taicpu.op_reg_reg(A_MOVE,S_L,href.base,NR_A0));
                 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));
                 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;
               end;
 
 
             if size > 0 then
             if size > 0 then
@@ -2067,7 +2067,7 @@ unit cgcpu;
           begin
           begin
             list.concat(taicpu.op_reg_reg(A_MOVE,S_L,href.base,NR_A0));
             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));
             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;
           end;
 
 
         if size > 0 then
         if size > 0 then
@@ -2234,7 +2234,7 @@ unit cgcpu;
                   begin
                   begin
                     { offset in the wrapper needs to be adjusted for the stored
                     { offset in the wrapper needs to be adjusted for the stored
                       return address }
                       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
                     { 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
                       and it's probably smaller code for the majority of cases (if ioffset small, the
                       load will use MOVEQ) (KB) }
                       load will use MOVEQ) (KB) }

+ 4 - 4
compiler/m68k/hlcgcpu.pas

@@ -126,7 +126,7 @@ implementation
           selfoffsetfromsp:=sizeof(aint)
           selfoffsetfromsp:=sizeof(aint)
         else
         else
           selfoffsetfromsp:=0;
           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);
         cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_A0);
       end;
       end;
 
 
@@ -135,7 +135,7 @@ implementation
         href : treference;
         href : treference;
       begin
       begin
         { move.l  (%a0),%a0 ; load vmt}
         { 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);
         cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_A0);
       end;
       end;
 
 
@@ -145,9 +145,9 @@ implementation
       begin
       begin
         if (procdef.extnumber=$ffff) then
         if (procdef.extnumber=$ffff) then
           Internalerror(2013100701);
           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));
         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));
         list.concat(taicpu.op_ref(A_JMP,S_NO,href));
       end;
       end;
 
 

+ 2 - 2
compiler/m68k/n68kcal.pas

@@ -74,7 +74,7 @@ implementation
             begin
             begin
               if po_syscall in tprocdef(procdefinition).procoptions then
               if po_syscall in tprocdef(procdefinition).procoptions then
                 begin
                 begin
-                  reference_reset_base(tmpref,NR_SP,0,2);
+                  reference_reset_base(tmpref,NR_SP,0,2,[]);
                   tmpref.direction:=dir_dec;
                   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_ref(A_MOVE,S_W,tprocdef(procdefinition).import_nr,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_const(A_TRAP,S_NO,tprocdef(procdefinition).extnumber));
                   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
                     not used as FP on Amiga any more (we use A5), so we don't need to
                     save it. (KB)
                     save it. (KB)
                     http://amigadev.elowar.com/read/ADCD_2.1/Libraries_Manual_guide/node0290.html }
                     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));
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_JSR,S_NO,tmpref));
                 end
                 end
               else
               else

+ 1 - 1
compiler/m68k/n68kmem.pas

@@ -112,7 +112,7 @@ implementation
           begin
           begin
             hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
             hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
             cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
             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 }
             { insert new index register }
             location.reference.index:=maybe_const_reg;
             location.reference.index:=maybe_const_reg;
             if (scaled) then
             if (scaled) then

+ 2 - 2
compiler/m68k/rgcpu.pas

@@ -73,7 +73,7 @@ unit rgcpu;
 {$endif}
 {$endif}
 
 
             helplist.concat(taicpu.op_const_reg(A_MOVE,S_L,spilltemp.offset,hreg));
             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;
             tmpref.index:=hreg;
 
 
             helpins:=spilling_create_load(tmpref,tempreg);
             helpins:=spilling_create_load(tmpref,tempreg);
@@ -105,7 +105,7 @@ unit rgcpu;
 {$endif}
 {$endif}
 
 
             helplist.concat(taicpu.op_const_reg(A_MOVE,S_L,spilltemp.offset,hreg));
             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;
             tmpref.index:=hreg;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             helplist.concat(spilling_create_store(tempreg,tmpref));

+ 11 - 11
compiler/mips/cgcpu.pas

@@ -162,7 +162,7 @@ begin
   if assigned(ref.symbol) then
   if assigned(ref.symbol) then
     begin
     begin
       ref.base:=getintregister(list,OS_ADDR);
       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
       if (cs_create_pic in current_settings.moduleswitches) then
         begin
         begin
           if not (pi_needs_got in current_procinfo.flags) then
           if not (pi_needs_got in current_procinfo.flags) then
@@ -320,7 +320,7 @@ begin
       LOC_REFERENCE:
       LOC_REFERENCE:
         begin
         begin
           paraloc.check_simple_location;
           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 }
           { concatcopy should choose the best way to copy the data }
           g_concatcopy(list,ref,href2,tcgsize2size[size]);
           g_concatcopy(list,ref,href2,tcgsize2size[size]);
         end;
         end;
@@ -353,7 +353,7 @@ procedure TCGMIPS.a_call_sym_pic(list: tasmlist; sym: tasmsymbol);
 var
 var
   href: treference;
   href: treference;
 begin
 begin
-  reference_reset_symbol(href,sym,0,sizeof(aint));
+  reference_reset_symbol(href,sym,0,sizeof(aint),[]);
   if (sym.bind=AB_LOCAL) then
   if (sym.bind=AB_LOCAL) then
     href.refaddr:=addr_pic
     href.refaddr:=addr_pic
   else
   else
@@ -608,7 +608,7 @@ begin
       exit;
       exit;
     end;
     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
   if (cs_create_pic in current_settings.moduleswitches) then
     begin
     begin
       if not (pi_needs_got in current_procinfo.flags) then
       if not (pi_needs_got in current_procinfo.flags) then
@@ -1275,7 +1275,7 @@ begin
 
 
   helplist:=TAsmList.Create;
   helplist:=TAsmList.Create;
 
 
-  reference_reset(href,0);
+  reference_reset(href,0,[]);
   href.base:=NR_STACK_POINTER_REG;
   href.base:=NR_STACK_POINTER_REG;
 
 
   fmask:=0;
   fmask:=0;
@@ -1419,7 +1419,7 @@ begin
      begin
      begin
        if TMIPSProcinfo(current_procinfo).save_gp_ref.offset<>0 then
        if TMIPSProcinfo(current_procinfo).save_gp_ref.offset<>0 then
          tg.ungettemp(list,TMIPSProcinfo(current_procinfo).save_gp_ref);
          tg.ungettemp(list,TMIPSProcinfo(current_procinfo).save_gp_ref);
-       reference_reset(href,0);
+       reference_reset(href,0,[]);
        href.base:=NR_STACK_POINTER_REG;
        href.base:=NR_STACK_POINTER_REG;
 
 
        nextoffset:=TMIPSProcInfo(current_procinfo).floatregstart;
        nextoffset:=TMIPSProcInfo(current_procinfo).floatregstart;
@@ -1537,7 +1537,7 @@ begin
       src:=source
       src:=source
     else
     else
       begin
       begin
-        reference_reset(src,sizeof(aint));
+        reference_reset(src,sizeof(aint),source.volatility);
         { load the address of source into src.base }
         { load the address of source into src.base }
         src.base := GetAddressRegister(list);
         src.base := GetAddressRegister(list);
         a_loadaddr_ref_reg(list, Source, src.base);
         a_loadaddr_ref_reg(list, Source, src.base);
@@ -1546,7 +1546,7 @@ begin
       dst:=dest
       dst:=dest
     else
     else
       begin
       begin
-        reference_reset(dst,sizeof(aint));
+        reference_reset(dst,sizeof(aint),dest.volatility);
         { load the address of dest into dst.base }
         { load the address of dest into dst.base }
         dst.base := GetAddressRegister(list);
         dst.base := GetAddressRegister(list);
         a_loadaddr_ref_reg(list, dest, dst.base);
         a_loadaddr_ref_reg(list, dest, dst.base);
@@ -1622,8 +1622,8 @@ begin
     g_concatcopy_move(list, Source, dest, len)
     g_concatcopy_move(list, Source, dest, len)
   else
   else
   begin
   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 }
     { load the address of source into src.base }
     src.base := GetAddressRegister(list);
     src.base := GetAddressRegister(list);
     a_loadaddr_ref_reg(list, Source, src.base);
     a_loadaddr_ref_reg(list, Source, src.base);
@@ -1667,7 +1667,7 @@ procedure TCGMIPS.g_profilecode(list:TAsmList);
   begin
   begin
     if not (cs_create_pic in current_settings.moduleswitches) then
     if not (cs_create_pic in current_settings.moduleswitches) then
       begin
       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);
         a_loadaddr_ref_reg(list,href,NR_GP);
       end;
       end;
     list.concat(taicpu.op_reg_reg(A_MOVE,NR_R1,NR_RA));
     list.concat(taicpu.op_reg_reg(A_MOVE,NR_R1,NR_RA));

+ 5 - 5
compiler/mips/hlcgcpu.pas

@@ -75,7 +75,7 @@ implementation
         begin
         begin
           if not (cs_create_pic in current_settings.moduleswitches) then
           if not (cs_create_pic in current_settings.moduleswitches) then
             begin
             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')));
               list.concat(tai_comment.create(strpnew('Using PIC code for a_call_name')));
               cg.a_loadaddr_ref_reg(list,ref,NR_GP);
               cg.a_loadaddr_ref_reg(list,ref,NR_GP);
             end;
             end;
@@ -152,7 +152,7 @@ implementation
     var
     var
       href: treference;
       href: treference;
     begin
     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 }
       { Always do indirect jump using $t9, it won't harm in non-PIC mode }
       if (cs_create_pic in current_settings.moduleswitches) then
       if (cs_create_pic in current_settings.moduleswitches) then
         begin
         begin
@@ -245,7 +245,7 @@ implementation
     if IsVirtual then
     if IsVirtual then
     begin
     begin
       { load VMT pointer }
       { 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));
       list.concat(taicpu.op_reg_ref(A_LW,NR_VMT,href));
 
 
       if (procdef.extnumber=$ffff) then
       if (procdef.extnumber=$ffff) then
@@ -253,7 +253,7 @@ implementation
 
 
       { TODO: case of large VMT is not handled }
       { TODO: case of large VMT is not handled }
       { We have no reason not to use $t9 even in non-PIC mode. }
       { 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_ref(A_LW,NR_PIC_FUNC,href));
       list.concat(taicpu.op_reg(A_JR, NR_PIC_FUNC));
       list.concat(taicpu.op_reg(A_JR, NR_PIC_FUNC));
     end
     end
@@ -262,7 +262,7 @@ implementation
     else
     else
       begin
       begin
         { GAS does not expand "J symbol" into PIC sequence }
         { 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.base:=NR_GP;
         href.refaddr:=addr_pic_call16;
         href.refaddr:=addr_pic_call16;
         list.concat(taicpu.op_reg_ref(A_LW,NR_PIC_FUNC,href));
         list.concat(taicpu.op_reg_ref(A_LW,NR_PIC_FUNC,href));

+ 1 - 1
compiler/mips/ncpucnv.pas

@@ -155,7 +155,7 @@ begin
   begin
   begin
     current_asmdata.getglobaldatalabel(l1);
     current_asmdata.getglobaldatalabel(l1);
     current_asmdata.getjumplabel(l2);
     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);
     hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
 
 
     { Always load into 64-bit FPU register }
     { Always load into 64-bit FPU register }

+ 1 - 1
compiler/mips/ncpuset.pas

@@ -105,7 +105,7 @@ begin
   indexreg := cg.getaddressregister(current_asmdata.CurrAsmList);
   indexreg := cg.getaddressregister(current_asmdata.CurrAsmList);
   cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_ADDR, 2, hregister, indexreg);
   cg.a_op_const_reg_reg(current_asmdata.CurrAsmList, OP_SHL, OS_ADDR, 2, hregister, indexreg);
   { create reference }
   { create reference }
-  reference_reset_symbol(href, table, 0, sizeof(aint));
+  reference_reset_symbol(href, table, 0, sizeof(aint), []);
   href.offset := (-aint(min_)) * 4;
   href.offset := (-aint(min_)) * 4;
   href.base:=indexreg;
   href.base:=indexreg;
   jmpreg := cg.getaddressregister(current_asmdata.CurrAsmList);
   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_const(A_ORI,hreg,hreg,spilltemp.offset and $FFFF));
             helplist.concat(taicpu.op_reg_reg_reg(A_ADDU,hreg,hreg,spilltemp.base));
             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);
             helpins:=spilling_create_load(tmpref,tempreg);
             helplist.concat(helpins);
             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_const(A_ORI,hreg,hreg,spilltemp.offset and $FFFF));
             helplist.concat(taicpu.op_reg_reg_reg(A_ADDU,hreg,hreg,spilltemp.base));
             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));
             helplist.concat(spilling_create_store(tempreg,tmpref));
             if getregtype(tempreg)=R_INTREGISTER then
             if getregtype(tempreg)=R_INTREGISTER then

+ 5 - 5
compiler/ncgbas.pas

@@ -160,7 +160,7 @@ interface
                           op.typ:=top_ref;
                           op.typ:=top_ref;
                           new(op.ref);
                           new(op.ref);
                           reference_reset_base(op.ref^,indexreg,sym.localloc.reference.offset+sofs,
                           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;
                     end
                     end
                   else
                   else
@@ -168,7 +168,7 @@ interface
                       op.typ:=top_ref;
                       op.typ:=top_ref;
                       new(op.ref);
                       new(op.ref);
                       reference_reset_base(op.ref^,sym.localloc.reference.base,sym.localloc.reference.offset+sofs,
                       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;
                       op.ref^.index:=indexreg;
 {$ifdef x86}
 {$ifdef x86}
                       op.ref^.scalefactor:=scale;
                       op.ref^.scalefactor:=scale;
@@ -186,7 +186,7 @@ interface
                       op.typ:=top_ref;
                       op.typ:=top_ref;
                       new(op.ref);
                       new(op.ref);
                       { no idea about the actual alignment }
                       { 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;
                       op.ref^.index:=indexreg;
 {$ifdef x86}
 {$ifdef x86}
                       op.ref^.scalefactor:=scale;
                       op.ref^.scalefactor:=scale;
@@ -436,7 +436,7 @@ interface
             if is_managed_type(tempinfo^.typedef) and
             if is_managed_type(tempinfo^.typedef) and
               not(ti_const in tempflags) then
               not(ti_const in tempflags) then
               begin
               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);
                 tg.gethltempmanaged(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.temptype,tempinfo^.location.reference);
                 if not(ti_nofini in tempflags) then
                 if not(ti_nofini in tempflags) then
                   hlcg.g_finalize(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.location.reference);
                   hlcg.g_finalize(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.location.reference);
@@ -447,7 +447,7 @@ interface
               end
               end
             else
             else
               begin
               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);
                 tg.gethltemp(current_asmdata.CurrAsmList,tempinfo^.typedef,size,tempinfo^.temptype,tempinfo^.location.reference);
               end;
               end;
           end;
           end;

+ 4 - 4
compiler/ncgcal.pas

@@ -465,7 +465,7 @@ implementation
         literaldef:=get_block_literal_type_for_proc(tabstractprocdef(right.resultdef));
         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);
         hlcg.location_force_reg(current_asmdata.CurrAsmList,right.location,right.resultdef,cpointerdef.getreusable(literaldef),true);
         { load the invoke pointer }
         { 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);
         callprocdef:=cprocvardef.getreusableprocaddr(procdefinition);
         toreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,callprocdef);
         toreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,callprocdef);
         hlcg.g_load_field_reg_by_name(current_asmdata.CurrAsmList,literaldef,callprocdef,'INVOKE',href,toreg);
         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)
           location_allocate_register(current_asmdata.CurrAsmList,location,realresdef,false)
         else
         else
           begin
           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);
             tg.gethltemp(current_asmdata.CurrAsmList,realresdef,retloc.intsize,tt_normal,location.reference);
           end;
           end;
       end;
       end;
@@ -763,12 +763,12 @@ implementation
                                  ((tmpparaloc^.loc<>LOC_REFERENCE) or
                                  ((tmpparaloc^.loc<>LOC_REFERENCE) or
                                   assigned(tmpparaloc^.next)) then
                                   assigned(tmpparaloc^.next)) then
                                 internalerror(200501281);
                                 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 }
                               { copy parameters in case they were moved to a temp. location because we've a fixed stack }
                               case tmpparaloc^.loc of
                               case tmpparaloc^.loc of
                               LOC_REFERENCE:
                               LOC_REFERENCE:
                                   begin
                                   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
                                     { use concatcopy, because it can also be a float which fails when
                                       load_ref_ref is used }
                                       load_ref_ref is used }
                                     if (ppn.tempcgpara.size <> OS_NO) then
                                     if (ppn.tempcgpara.size <> OS_NO) then

+ 10 - 9
compiler/ncgcnv.pas

@@ -316,7 +316,7 @@ interface
                if tstringconstnode(left).len=0 then
                if tstringconstnode(left).len=0 then
                 begin
                 begin
                   { FPC_EMPTYCHAR is a widechar -> 2 bytes }
                   { 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);
                   hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR',AT_DATA,needs_indirect);
                   current_module.add_extern_asmsym('FPC_EMPTYCHAR',AB_EXTERNAL,AT_DATA);
                   current_module.add_extern_asmsym('FPC_EMPTYCHAR',AB_EXTERNAL,AT_DATA);
                   location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resultdef);
                   location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resultdef);
@@ -370,8 +370,9 @@ interface
     procedure tcgtypeconvnode.second_pointer_to_array;
     procedure tcgtypeconvnode.second_pointer_to_array;
 
 
       begin
       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
         case left.location.loc of
           LOC_CREGISTER,
           LOC_CREGISTER,
           LOC_REGISTER :
           LOC_REGISTER :
@@ -385,7 +386,7 @@ interface
                 end
                 end
               else
               else
             {$endif}
             {$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;
             end;
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE,
           LOC_CREFERENCE,
@@ -396,7 +397,7 @@ interface
           LOC_CSUBSETREF:
           LOC_CSUBSETREF:
             begin
             begin
               hlcg.reference_reset_base(location.reference,left.resultdef,
               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,
               hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,
                 location.reference.base);
                 location.reference.base);
               if left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
               if left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
@@ -416,7 +417,7 @@ interface
       var
       var
         tmpref: treference;
         tmpref: treference;
       begin
       begin
-         location_reset_ref(location,LOC_REFERENCE,OS_NO,2);
+         location_reset_ref(location,LOC_REFERENCE,OS_NO,2,[]);
          case tstringdef(resultdef).stringtype of
          case tstringdef(resultdef).stringtype of
            st_shortstring :
            st_shortstring :
              begin
              begin
@@ -455,7 +456,7 @@ interface
              { round them down to the proper precision }
              { round them down to the proper precision }
              tg.gethltemp(current_asmdata.currasmlist,resultdef,resultdef.size,tt_normal,tr);
              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);
              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.location.reference:=tr;
              left.resultdef:=resultdef;
              left.resultdef:=resultdef;
            end;
            end;
@@ -596,7 +597,7 @@ interface
                   tmethodpointer record and set the "frame pointer" to nil }
                   tmethodpointer record and set the "frame pointer" to nil }
                 if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                 if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                   internalerror(2013031503);
                   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);
                 tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,location.reference);
                 href:=location.reference;
                 href:=location.reference;
                 if is_nested_pd(tabstractprocdef(resultdef)) then
                 if is_nested_pd(tabstractprocdef(resultdef)) then
@@ -702,7 +703,7 @@ interface
            left.location,location.register);
            left.location,location.register);
          hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,resultdef,OC_NE,0,location.register,l1);
          hlcg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,resultdef,OC_NE,0,location.register,l1);
          { FPC_EMPTYCHAR is a widechar -> 2 bytes }
          { 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);
          hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR',AT_DATA,needs_indirect);
          current_module.add_extern_asmsym('FPC_EMPTYCHAR',AB_EXTERNAL,AT_DATA);
          current_module.add_extern_asmsym('FPC_EMPTYCHAR',AB_EXTERNAL,AT_DATA);
          hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,cwidechartype,resultdef,hr,location.register);
          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}
 {$endif ARM}
 
 
       begin
       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;
         lastlabel:=nil;
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
 {$ifdef ARM}
 {$ifdef ARM}
@@ -393,7 +393,7 @@ implementation
            end
            end
          else
          else
            begin
            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;
              location.reference.symbol:=lab_str;
            end;
            end;
       end;
       end;
@@ -405,7 +405,7 @@ implementation
       begin
       begin
         reference_reset_symbol(href, lab_str,
         reference_reset_symbol(href, lab_str,
           ctai_typedconstbuilder.get_string_symofs(tstringdef(resultdef).stringtype, winlikewidestring),
           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)
         hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList, elementdef, strpointerdef, href, location.register)
       end;
       end;
 
 
@@ -445,7 +445,7 @@ implementation
       var
       var
          entry       : PHashSetItem;
          entry       : PHashSetItem;
       begin
       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 ? }
         { const already used ? }
         if not assigned(lab_set) then
         if not assigned(lab_set) then
           begin
           begin
@@ -522,7 +522,7 @@ implementation
          entry       : PHashSetItem;
          entry       : PHashSetItem;
          datatcb     : ttai_typedconstbuilder;
          datatcb     : ttai_typedconstbuilder;
       begin
       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;
         lastlabel:=nil;
         { const already used ? }
         { const already used ? }
         if not assigned(lab_set) then
         if not assigned(lab_set) then

+ 2 - 2
compiler/ncgflw.pas

@@ -813,7 +813,7 @@ implementation
 
 
          { send the vmt parameter }
          { send the vmt parameter }
          pd:=search_system_proc('fpc_catches');
          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
          if otherunit then
            current_module.add_extern_asmsym(excepttype.vmt_mangledname,AB_EXTERNAL,AT_DATA);
            current_module.add_extern_asmsym(excepttype.vmt_mangledname,AB_EXTERNAL,AT_DATA);
          paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
          paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
@@ -835,7 +835,7 @@ implementation
 
 
          if assigned(exceptvarsym) then
          if assigned(exceptvarsym) then
            begin
            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);
              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);
              hlcg.a_load_reg_ref(current_asmdata.CurrAsmList,fpc_catches_res.def,exceptvarsym.vardef,fpc_catches_resloc.register,exceptvarsym.localloc.reference);
            end;
            end;

+ 6 - 4
compiler/ncginl.pas

@@ -250,7 +250,9 @@ implementation
              lendef:=u32inttype
              lendef:=u32inttype
            else
            else
              lendef:=ossinttype;
              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
            { 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
              that originally held the string pointer for the length, so that we
              can keep the original nil/0 as length in that case }
              can keep the original nil/0 as length in that case }
@@ -601,7 +603,7 @@ implementation
         end
         end
       else
       else
         begin
         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;
           location.reference.base:=frame_reg;
         end;
         end;
     end;
     end;
@@ -614,14 +616,14 @@ implementation
           begin
           begin
             location_reset(location,LOC_REGISTER,OS_ADDR);
             location_reset(location,LOC_REGISTER,OS_ADDR);
             location.register:=cg.getaddressregister(current_asmdata.currasmlist);
             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);
             cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
           end
           end
         else
         else
           begin
           begin
             location_reset(location,LOC_REGISTER,OS_ADDR);
             location_reset(location,LOC_REGISTER,OS_ADDR);
             location.register:=cg.getaddressregister(current_asmdata.currasmlist);
             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);
             cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
           end;
           end;
       end;
       end;

+ 25 - 23
compiler/ncgld.pas

@@ -244,13 +244,14 @@ implementation
           internalerror(200309286);
           internalerror(200309286);
         if lvs.localloc.loc<>LOC_REFERENCE then
         if lvs.localloc.loc<>LOC_REFERENCE then
           internalerror(200409241);
           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;
       end;
 
 
 
 
     procedure tcgloadnode.generate_absaddr_access(vs: tabsolutevarsym);
     procedure tcgloadnode.generate_absaddr_access(vs: tabsolutevarsym);
       begin
       begin
         location.reference.offset:=asizeint(vs.addroffset);
         location.reference.offset:=asizeint(vs.addroffset);
+        location.reference.volatility:=[vol_read,vol_write];
       end;
       end;
 
 
 
 
@@ -276,9 +277,9 @@ implementation
            begin
            begin
              if gvs.localloc.loc=LOC_INVALID then
              if gvs.localloc.loc=LOC_INVALID then
                if not(vo_is_weak_external in gvs.varoptions) 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
                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
              else
                location:=gvs.localloc;
                location:=gvs.localloc;
            end
            end
@@ -316,16 +317,16 @@ implementation
              paraloc1.init;
              paraloc1.init;
              paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
              paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
              hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,pvd);
              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
              if not issystemunit then
                current_module.add_extern_asmsym('FPC_THREADVAR_RELOCATE',AB_EXTERNAL,AT_DATA);
                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_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);
              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 }
              { no, call it with the index of the threadvar as parameter }
              if not(vo_is_weak_external in gvs.varoptions) then
              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
              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;
              href:=tvref;
              hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,
              hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,
                tv_rec,
                tv_rec,
@@ -360,7 +361,7 @@ implementation
              hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,fieldptrdef,href,hregister);
              hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,fieldptrdef,href,hregister);
              hlcg.a_label(current_asmdata.CurrAsmList,endrelocatelab);
              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;
        end;
        end;
 
 
@@ -402,7 +403,7 @@ implementation
         { we don't know the size of all arrays }
         { we don't know the size of all arrays }
         newsize:=def_cgsize(resultdef);
         newsize:=def_cgsize(resultdef);
         { alignment is overridden per case below }
         { 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
         case symtableentry.typ of
            absolutevarsym :
            absolutevarsym :
               begin
               begin
@@ -420,7 +421,7 @@ implementation
              begin
              begin
                 if tconstsym(symtableentry).consttyp=constresourcestring then
                 if tconstsym(symtableentry).consttyp=constresourcestring then
                   begin
                   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
                      indirect:=(tf_supports_packages in target_info.flags) and
                                  (target_info.system in systems_indirect_var_imports) and
                                  (target_info.system in systems_indirect_var_imports) and
                                  (cs_imported_data in current_settings.localswitches) and
                                  (cs_imported_data in current_settings.localswitches) and
@@ -452,7 +453,7 @@ implementation
                    else
                    else
                      location.reference.symbol:=current_asmdata.WeakRefAsmSymbol(tstaticvarsym(symtableentry).mangledname,AT_DATA);
                      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);
                    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
                  end
                { Thread variable }
                { Thread variable }
                else if (vo_is_thread_var in gvs.varoptions) then
                else if (vo_is_thread_var in gvs.varoptions) then
@@ -462,10 +463,11 @@ implementation
                  begin
                  begin
                    if gvs.localloc.loc=LOC_INVALID then
                    if gvs.localloc.loc=LOC_INVALID then
                      begin
                      begin
+                       { static data is currently always volatile }
                        if not(vo_is_weak_external in gvs.varoptions) 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
                        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
                      end
                    else
                    else
                      location:=gvs.localloc;
                      location:=gvs.localloc;
@@ -504,10 +506,10 @@ implementation
                     { assume packed records may always be unaligned }
                     { assume packed records may always be unaligned }
                     if not(resultdef.typ in [recorddef,objectdef]) or
                     if not(resultdef.typ in [recorddef,objectdef]) or
                        (tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
                        (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
                     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;
                   end;
 
 
                 { make const a LOC_CREFERENCE }
                 { make const a LOC_CREFERENCE }
@@ -582,7 +584,7 @@ implementation
                             assigned(tobjectdef(left.resultdef).vmt_field) then
                             assigned(tobjectdef(left.resultdef).vmt_field) then
                            begin
                            begin
                              { vmt pointer is a pointer to the vmt record }
                              { 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);
                              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);
                              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);
                              hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,vmtdef);
@@ -598,7 +600,7 @@ implementation
                          else if is_any_interface_kind(left.resultdef) then
                          else if is_any_interface_kind(left.resultdef) then
                            begin
                            begin
                              { an interface is a pointer to a pointer to a vmt }
                              { 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);
                              vmtdef:=cpointerdef.getreusable(tobjectdef(left.resultdef).vmt_def);
                              hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,vmtdef);
                              hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,vmtdef);
                              hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,vmtdef,vmtdef,href,hregister);
                              hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,vmtdef,vmtdef,href,hregister);
@@ -608,7 +610,7 @@ implementation
                          { load method address }
                          { load method address }
                          vmtentry:=tabstractrecordsymtable(trecorddef(vmtdef.pointeddef).symtable).findfieldbyoffset(
                          vmtentry:=tabstractrecordsymtable(trecorddef(vmtdef.pointeddef).symtable).findfieldbyoffset(
                            tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber));
                            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);
                          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.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);
                          hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,vmtentry.vardef,vmtentry.vardef,href,location.register);
@@ -616,7 +618,7 @@ implementation
                      else
                      else
                        begin
                        begin
                          { load address of the function }
                          { 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));
                          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);
                          hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,procdef,cprocvardef.getreusableprocaddr(procdef),href,location.register);
                        end;
                        end;
@@ -904,7 +906,7 @@ implementation
                             if releaseright then
                             if releaseright then
                               location_freetemp(current_asmdata.CurrAsmList,right.location);
                               location_freetemp(current_asmdata.CurrAsmList,right.location);
                             releaseright:=true;
                             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.location.reference:=href;
                             right.resultdef:=left.resultdef;
                             right.resultdef:=left.resultdef;
                           end;
                           end;
@@ -1000,7 +1002,7 @@ implementation
                           { extended into a double/single, since sse doesn't support extended) }
                           { extended into a double/single, since sse doesn't support extended) }
                           tg.gethltemp(current_asmdata.CurrAsmList,left.resultdef,left.resultdef.size,tt_normal,href);
                           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);
                           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.location.reference:=href;
                           right.resultdef:=left.resultdef;
                           right.resultdef:=left.resultdef;
                         end;
                         end;
@@ -1219,7 +1221,7 @@ implementation
         else
         else
           varvtypefield:=nil;
           varvtypefield:=nil;
         { alignment is filled in by tg.gethltemp below }
         { 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);
         fillchar(paraloc,sizeof(paraloc),0);
         { Allocate always a temp, also if no elements are required, to
         { Allocate always a temp, also if no elements are required, to
           be sure that location is valid (PFV) }
           be sure that location is valid (PFV) }
@@ -1485,7 +1487,7 @@ implementation
                       (cs_imported_data in current_settings.localswitches) and
                       (cs_imported_data in current_settings.localswitches) and
                       (rttidef.owner.moduleid<>current_module.moduleid);
                       (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
         case rttidatatype of
           rdt_normal:
           rdt_normal:
             location.reference.symbol:=RTTIWriter.get_rtti_label(rttidef,rttitype,indirect);
             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;
                  vmtname:=tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname;
                  reference_reset_symbol(href,
                  reference_reset_symbol(href,
                    current_asmdata.RefAsmSymbol(vmtname,AT_DATA,indirect),0,
                    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);
                  hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,resultdef,href,location.register);
                  if otherunit then
                  if otherunit then
                    current_module.add_extern_asmsym(vmtname,AB_EXTERNAL,AT_DATA);
                    current_module.add_extern_asmsym(vmtname,AB_EXTERNAL,AT_DATA);
@@ -146,7 +146,7 @@ implementation
                      { find/add necessary classref/classname pool entries }
                      { find/add necessary classref/classname pool entries }
                      objcfinishstringrefpoolentry(entry,sp_objcclassnames,sec_objc_cls_refs,sec_objc_class_names);
                      objcfinishstringrefpoolentry(entry,sp_objcclassnames,sec_objc_cls_refs,sec_objc_class_names);
                    end;
                    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);
                  hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,objc_idtype,objc_idtype,href,location.register);
                end;
                end;
            end
            end
@@ -194,7 +194,7 @@ implementation
                 if hsym.localloc.loc<>LOC_REFERENCE then
                 if hsym.localloc.loc<>LOC_REFERENCE then
                   internalerror(200309283);
                   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);
                 hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,parentfpvoidpointertype,parentfpvoidpointertype,href,location.register);
               end;
               end;
           end;
           end;
@@ -242,9 +242,9 @@ implementation
          { assume natural alignment, except for packed records }
          { assume natural alignment, except for packed records }
          if not(resultdef.typ in [recorddef,objectdef]) or
          if not(resultdef.typ in [recorddef,objectdef]) or
             (tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
             (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
          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? }
          { can we fold an add/sub node into the offset of the deref node? }
          extraoffset:=0;
          extraoffset:=0;
@@ -357,7 +357,7 @@ implementation
                 (target_info.system in systems_garbage_collected_managed_types) then
                 (target_info.system in systems_garbage_collected_managed_types) then
                begin
                begin
                  { the contents of a class are aligned to a sizeof(pointer) }
                  { 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
                  case left.location.loc of
                     LOC_CREGISTER,
                     LOC_CREGISTER,
                     LOC_REGISTER:
                     LOC_REGISTER:
@@ -371,7 +371,7 @@ implementation
                           end
                           end
                         else
                         else
                       {$endif}
                       {$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;
                       end;
                     LOC_CREFERENCE,
                     LOC_CREFERENCE,
                     LOC_REFERENCE,
                     LOC_REFERENCE,
@@ -382,7 +382,7 @@ implementation
                     LOC_CSUBSETREF:
                     LOC_CSUBSETREF:
                       begin
                       begin
                          hlcg.reference_reset_base(location.reference,left.resultdef,
                          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);
                          hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location,location.reference.base);
                       end;
                       end;
                     LOC_CONSTANT:
                     LOC_CONSTANT:
@@ -544,7 +544,7 @@ implementation
                earlier versions)
                earlier versions)
              }
              }
              asmsym:=current_asmdata.RefAsmSymbol(vs.mangledname,AT_DATA);
              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);
              hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,left.resultdef,cpointerdef.getreusable(resultdef),location.reference);
              location.reference.index:=hlcg.getintregister(current_asmdata.CurrAsmList,ptruinttype);
              location.reference.index:=hlcg.getintregister(current_asmdata.CurrAsmList,ptruinttype);
              hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,ptruinttype,ptruinttype,tmpref,location.reference.index);
              hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,ptruinttype,ptruinttype,tmpref,location.reference.index);
@@ -652,7 +652,7 @@ implementation
           begin
           begin
             hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
             hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
             cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
             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 }
             { insert new index register }
             location.reference.index:=maybe_const_reg;
             location.reference.index:=maybe_const_reg;
           end;
           end;
@@ -870,9 +870,9 @@ implementation
          newsize:=def_cgsize(resultdef);
          newsize:=def_cgsize(resultdef);
          secondpass(left);
          secondpass(left);
          if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
          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
          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 }
          { an ansistring needs to be dereferenced }
          if is_ansistring(left.resultdef) or
          if is_ansistring(left.resultdef) or
@@ -886,17 +886,17 @@ implementation
                 LOC_REGISTER,
                 LOC_REGISTER,
                 LOC_CREGISTER :
                 LOC_CREGISTER :
                   begin
                   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;
                   end;
                 LOC_CREFERENCE,
                 LOC_CREFERENCE,
                 LOC_REFERENCE :
                 LOC_REFERENCE :
                   begin
                   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);
                     hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location.reference,location.reference.base);
                   end;
                   end;
                 LOC_CONSTANT:
                 LOC_CONSTANT:
                   begin
                   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;
                   end;
                 else
                 else
                   internalerror(2002032218);
                   internalerror(2002032218);
@@ -907,6 +907,7 @@ implementation
               else
               else
                 offsetdec:=2;
                 offsetdec:=2;
               location.reference.alignment:=offsetdec;
               location.reference.alignment:=offsetdec;
+              location.reference.volatility:=[];
 
 
               { in ansistrings/widestrings S[1] is p<w>char(S)[0] }
               { in ansistrings/widestrings S[1] is p<w>char(S)[0] }
               if not(cs_zerobasedstrings in current_settings.localswitches) then
               if not(cs_zerobasedstrings in current_settings.localswitches) then
@@ -917,11 +918,11 @@ implementation
               case left.location.loc of
               case left.location.loc of
                 LOC_REGISTER,
                 LOC_REGISTER,
                 LOC_CREGISTER :
                 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_REFERENCE,
                 LOC_CREFERENCE :
                 LOC_CREFERENCE :
                   begin
                   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,
                      hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,
                       left.location.reference,location.reference.base);
                       left.location.reference,location.reference.base);
                   end;
                   end;
@@ -933,6 +934,7 @@ implementation
                 pointer size
                 pointer size
               }
               }
               location.reference.alignment:=voidpointertype.size;
               location.reference.alignment:=voidpointertype.size;
+              location.reference.volatility:=[];
            end
            end
          else
          else
            begin
            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);
     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);
     location.reference.symbol:=tasmlabel(entry^.Data);
   end;
   end;
 
 

+ 1 - 1
compiler/ncgopt.pas

@@ -95,7 +95,7 @@ begin
        hlcg.g_copyshortstring(current_asmdata.CurrAsmList,left.location.reference,href,tstringdef(cshortstringtype));
        hlcg.g_copyshortstring(current_asmdata.CurrAsmList,left.location.reference,href,tstringdef(cshortstringtype));
        location_freetemp(current_asmdata.CurrAsmList,left.location);
        location_freetemp(current_asmdata.CurrAsmList,left.location);
        { return temp reference }
        { 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;
        left.location.reference:=href;
     end;
     end;
   secondpass(right);
   secondpass(right);

+ 2 - 2
compiler/ncgutil.pas

@@ -896,7 +896,7 @@ implementation
                     LOC_REFERENCE:
                     LOC_REFERENCE:
                       begin
                       begin
                         gen_alloc_regloc(list,destloc,vardef);
                         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);
                         cg128.a_load128_ref_reg(list,href,destloc.register128);
                         unget_para(paraloc^);
                         unget_para(paraloc^);
                       end;
                       end;
@@ -1027,7 +1027,7 @@ implementation
                     LOC_REFERENCE:
                     LOC_REFERENCE:
                       begin
                       begin
                         gen_alloc_regloc(list,destloc,vardef);
                         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);
                         cg64.a_load64_ref_reg(list,href,destloc.register64);
                         unget_para(paraloc^);
                         unget_para(paraloc^);
                       end;
                       end;

+ 29 - 29
compiler/powerpc/cgcpu.pas

@@ -222,7 +222,7 @@ const
             the transition vector.}
             the transition vector.}
             //TODO: Support cross-TOC calls.
             //TODO: Support cross-TOC calls.
             tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
-            reference_reset(tmpref,4);
+            reference_reset(tmpref,4,[]);
             tmpref.offset := 0;
             tmpref.offset := 0;
             //tmpref.symaddr := refs_full;
             //tmpref.symaddr := refs_full;
             tmpref.base:= reg;
             tmpref.base:= reg;
@@ -804,9 +804,9 @@ const
                 case target_info.abi of
                 case target_info.abi of
                   abi_powerpc_aix,
                   abi_powerpc_aix,
                   abi_powerpc_darwin:
                   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:
                   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;
                 end;
                 list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
                 list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
                 if not(cs_profile in current_settings.moduleswitches) then
                 if not(cs_profile in current_settings.moduleswitches) then
@@ -820,7 +820,7 @@ const
                 begin
                 begin
                   a_reg_alloc(list,NR_R0);
                   a_reg_alloc(list,NR_R0);
                   list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_CR));
                   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));
                   list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
                   a_reg_dealloc(list,NR_R0);
                   a_reg_dealloc(list,NR_R0);
                 end;
                 end;
@@ -837,7 +837,7 @@ const
 
 
         if usesfpr then
         if usesfpr then
           begin
           begin
-             reference_reset_base(href,NR_R1,-8,8);
+             reference_reset_base(href,NR_R1,-8,8,[]);
              for regcounter:=firstregfpu to RS_F31 do
              for regcounter:=firstregfpu to RS_F31 do
                begin
                begin
                  a_loadfpu_reg_ref(list,OS_F64,OS_F64,newreg(R_FPUREGISTER,regcounter,R_SUBNONE),href);
                  a_loadfpu_reg_ref(list,OS_F64,OS_F64,newreg(R_FPUREGISTER,regcounter,R_SUBNONE),href);
@@ -848,7 +848,7 @@ const
           end
           end
         else
         else
           { compute start of gpr save area }
           { 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 }
         { save gprs and fetch GOT pointer }
         if usesgpr then
         if usesgpr then
@@ -881,12 +881,12 @@ const
           begin
           begin
             if (localsize <= high(smallint)) then
             if (localsize <= high(smallint)) then
               begin
               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);
                 a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
               end
               end
             else
             else
               begin
               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 }
                 { can't use getregisterint here, the register colouring }
                 { is already done when we get here                      }
                 { is already done when we get here                      }
                 { R12 may hold previous stack pointer, R11  may be in   }
                 { R12 may hold previous stack pointer, R11  may be in   }
@@ -958,7 +958,7 @@ const
         genret:=true;
         genret:=true;
         if usesfpr then
         if usesfpr then
           begin
           begin
-            reference_reset_base(href,NR_R1,-8,8);
+            reference_reset_base(href,NR_R1,-8,8,[]);
             for regcounter := firstregfpu to RS_F31 do
             for regcounter := firstregfpu to RS_F31 do
               begin
               begin
                 a_loadfpu_ref_reg(list,OS_F64,OS_F64,href,newreg(R_FPUREGISTER,regcounter,R_SUBNONE));
                 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);
             inc(href.offset,4);
           end
           end
         else
         else
-          reference_reset_base(href,NR_R1,-4,4);
+          reference_reset_base(href,NR_R1,-4,4,[]);
 
 
         if (usesgpr) then
         if (usesgpr) then
           begin
           begin
@@ -1017,9 +1017,9 @@ const
                     case target_info.abi of
                     case target_info.abi of
                       abi_powerpc_aix,
                       abi_powerpc_aix,
                       abi_powerpc_darwin:
                       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:
                       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;
                     end;
                     a_reg_alloc(list,NR_R0);
                     a_reg_alloc(list,NR_R0);
                     list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
                     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 target_info.abi in [abi_powerpc_aix,abi_powerpc_darwin] then
                     if false then { Not needed at the moment. }
                     if false then { Not needed at the moment. }
                       begin
                       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_ref(A_LWZ,NR_R0,href));
                         list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
                         list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
                         a_reg_dealloc(list,NR_R0);
                         a_reg_dealloc(list,NR_R0);
@@ -1099,7 +1099,7 @@ const
         for regcounter := firstregfpu to RS_F31 do
         for regcounter := firstregfpu to RS_F31 do
           begin
           begin
             offset:= offset - 8;
             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));
             list.concat(taicpu.op_reg_ref(A_STFD, tregister(regcounter), href));
           end;
           end;
         (* Optimiztion in the future:  a_call_name(list,'_savefXX'); *)
         (* Optimiztion in the future:  a_call_name(list,'_savefXX'); *)
@@ -1109,7 +1109,7 @@ const
         if firstreggpr < RS_R30 then
         if firstreggpr < RS_R30 then
           begin
           begin
             offset:= offset - 4 * (RS_R31 - firstreggpr + 1);
             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));
             list.concat(taicpu.op_reg_ref(A_STMW,tregister(firstreggpr),href));
               {STMW stores multiple registers}
               {STMW stores multiple registers}
           end
           end
@@ -1118,7 +1118,7 @@ const
             for regcounter := firstreggpr to RS_R31 do
             for regcounter := firstreggpr to RS_R31 do
               begin
               begin
                 offset:= offset - 4;
                 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));
                 list.concat(taicpu.op_reg_ref(A_STW, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
               end;
               end;
           end;
           end;
@@ -1185,7 +1185,7 @@ const
         for regcounter := firstregfpu to RS_F31 do
         for regcounter := firstregfpu to RS_F31 do
           begin
           begin
             offset:= offset - 8;
             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));
             list.concat(taicpu.op_reg_ref(A_LFD, newreg(R_FPUREGISTER,regcounter,R_SUBWHOLE), href));
           end;
           end;
         (* Optimiztion in the future: a_call_name(list,'_restfXX'); *)
         (* Optimiztion in the future: a_call_name(list,'_restfXX'); *)
@@ -1195,7 +1195,7 @@ const
         if firstreggpr < RS_R30 then
         if firstreggpr < RS_R30 then
           begin
           begin
             offset:= offset - 4 * (RS_R31 - firstreggpr + 1);
             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));
             list.concat(taicpu.op_reg_ref(A_LMW,tregister(firstreggpr),href));
               {LMW loads multiple registers}
               {LMW loads multiple registers}
           end
           end
@@ -1204,7 +1204,7 @@ const
             for regcounter := firstreggpr to RS_R31 do
             for regcounter := firstreggpr to RS_R31 do
               begin
               begin
                 offset:= offset - 4;
                 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));
                 list.concat(taicpu.op_reg_ref(A_LWZ, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
               end;
               end;
           end;
           end;
@@ -1241,7 +1241,7 @@ const
         { save return address in callers frame}
         { save return address in callers frame}
         list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_LR));
         list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_LR));
         { ... in caller's frame }
         { ... 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));
         list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
         a_reg_dealloc(list,NR_R0);
         a_reg_dealloc(list,NR_R0);
 
 
@@ -1251,7 +1251,7 @@ const
         { save the CR if necessary in callers frame ( !!! always done currently ) }
         { save the CR if necessary in callers frame ( !!! always done currently ) }
         a_reg_alloc(list,NR_R0);
         a_reg_alloc(list,NR_R0);
         list.concat(taicpu.op_reg_reg(A_MFSPR,NR_R0,NR_CR));
         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));
         list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
         a_reg_dealloc(list,NR_R0);
         a_reg_dealloc(list,NR_R0);
 
 
@@ -1285,12 +1285,12 @@ const
           begin
           begin
             if (localsize <= high(smallint)) then
             if (localsize <= high(smallint)) then
               begin
               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);
                 a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
               end
               end
             else
             else
               begin
               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;
                 href.index := NR_R11;
                 a_reg_alloc(list,href.index);
                 a_reg_alloc(list,href.index);
                 a_load_const_reg(list,OS_S32,-localsize,href.index);
                 a_load_const_reg(list,OS_S32,-localsize,href.index);
@@ -1309,7 +1309,7 @@ const
         a_reg_alloc(list,NR_R0);
         a_reg_alloc(list,NR_R0);
 
 
         { restore stack pointer }
         { 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_ref(A_LWZ,NR_STACK_POINTER_REG,href));
         (*
         (*
         list.concat(taicpu.op_reg_reg_const(A_ORI,NR_STACK_POINTER_REG,R_31,0));
         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
         { restore the CR if necessary from callers frame
             ( !!! always done currently ) }
             ( !!! 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_ref(A_LWZ,NR_R0,href));
         list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
         list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
         a_reg_dealloc(list,NR_R0);
         a_reg_dealloc(list,NR_R0);
 
 
         (*
         (*
         { restore return address from callers frame }
         { 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));
         list.concat(taicpu.op_reg_ref(A_LWZ,R_0,href));
         *)
         *)
 
 
@@ -1338,7 +1338,7 @@ const
         *)
         *)
 
 
         { restore return address from callers frame }
         { 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));
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
 
 
         { return to caller }
         { return to caller }
@@ -1396,8 +1396,8 @@ const
 
 
         count := len div maxmoveunit;
         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 }
         { load the address of source into src.base }
         if (count > 4) or
         if (count > 4) or
            not issimpleref(source) or
            not issimpleref(source) or

+ 5 - 5
compiler/powerpc/nppccal.pas

@@ -91,7 +91,7 @@ implementation
             begin
             begin
               { one syscall convention for AmigaOS/PowerPC
               { one syscall convention for AmigaOS/PowerPC
                 which is very similar to basesysv (a.k.a basefirst) on MorphOS }
                 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);
               do_call_ref(tmpref);
             end;
             end;
           system_powerpc_morphos:
           system_powerpc_morphos:
@@ -111,13 +111,13 @@ implementation
 
 
                   case libparaloc^.loc of
                   case libparaloc^.loc of
                     LOC_REGISTER:
                     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:
                     LOC_REFERENCE:
                       begin
                       begin
                         { this can happen for sysvbase; if we run out of regs, the libbase will be passed on the stack }
                         { 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);
                         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;
                       end;
                     else
                     else
                       internalerror(2016090202);
                       internalerror(2016090202);
@@ -132,7 +132,7 @@ implementation
 
 
                   { R3 must contain the call offset }
                   { R3 must contain the call offset }
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_const(A_LI,NR_R3,-tprocdef(procdefinition).extnumber));
                   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);
                   do_call_ref(tmpref);
                   cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_R3);
                   cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_R3);

+ 19 - 19
compiler/powerpc64/cgcpu.pas

@@ -334,22 +334,22 @@ begin
     tempreg := getintregister(list, OS_INT);
     tempreg := getintregister(list, OS_INT);
     { load actual function entry (reg contains the reference to the function descriptor)
     { load actual function entry (reg contains the reference to the function descriptor)
     into tempreg }
     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);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, tempreg);
 
 
     { save TOC pointer in stackframe }
     { 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);
     a_load_reg_ref(list, OS_ADDR, OS_ADDR, NR_RTOC, tmpref);
 
 
     { move actual function pointer to CTR register }
     { move actual function pointer to CTR register }
     list.concat(taicpu.op_reg(A_MTCTR, tempreg));
     list.concat(taicpu.op_reg(A_MTCTR, tempreg));
 
 
     { load new TOC pointer from function descriptor into RTOC register }
     { 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);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_RTOC);
 
 
     { load new environment pointer from function descriptor into R11 register }
     { 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_reg_alloc(list, NR_R11);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_R11);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_R11);
     { call function }
     { call function }
@@ -365,7 +365,7 @@ begin
   end;
   end;
 
 
   { we need to load the old RTOC from stackframe because we changed it}
   { 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);
   a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_RTOC);
 
 
   include(current_procinfo.flags, pi_do_call);
   include(current_procinfo.flags, pi_do_call);
@@ -1155,7 +1155,7 @@ var
         mayNeedLRStore := true;
         mayNeedLRStore := true;
     end else begin
     end else begin
       { save registers, FPU first, then GPR }
       { 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
       if (fprcount > 0) then
         for regcount := RS_F31 downto firstregfpu do begin
         for regcount := RS_F31 downto firstregfpu do begin
           a_loadfpu_reg_ref(list, OS_FLOAT, OS_FLOAT, newreg(R_FPUREGISTER,
           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 }
     { we may need to store R0 (=LR) ourselves }
     if ((cs_profile in init_settings.moduleswitches) or (mayNeedLRStore)) and (needslinkreg) then begin
     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));
       list.concat(taicpu.op_reg_ref(A_STD, NR_R0, href));
     end;
     end;
   end;
   end;
@@ -1201,7 +1201,7 @@ begin
       getcpuregister(list,NR_R12);
       getcpuregister(list,NR_R12);
       getcpuregister(list,NR_R2);
       getcpuregister(list,NR_R2);
       cg.a_label(list,lab);
       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.relsymbol:=lab;
       href.refaddr:=addr_higha;
       href.refaddr:=addr_higha;
       list.concat(taicpu.op_reg_reg_ref(a_addis,NR_R2,NR_R12,href));
       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
   if (not nostackframe) and (localsize > 0) and
      tppcprocinfo(current_procinfo).needstackframe then begin
      tppcprocinfo(current_procinfo).needstackframe then begin
     if (localsize <= high(smallint)) 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);
       a_load_store(list, A_STDU, NR_STACK_POINTER_REG, href);
     end else begin
     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
       { Use R0 for loading the constant (which is definitely > 32k when entering
        this branch).
        this branch).
@@ -1327,7 +1327,7 @@ var
     end else begin
     end else begin
       needsExitCode := true;
       needsExitCode := true;
       { restore registers, FPU first, GPR next }
       { 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
       if (fprcount > 0) then
         for regcount := RS_F31 downto firstregfpu do begin
         for regcount := RS_F31 downto firstregfpu do begin
           a_loadfpu_ref_reg(list, OS_FLOAT, OS_FLOAT, href, newreg(R_FPUREGISTER, regcount,
           a_loadfpu_ref_reg(list, OS_FLOAT, OS_FLOAT, href, newreg(R_FPUREGISTER, regcount,
@@ -1348,7 +1348,7 @@ var
 
 
       { restore LR (if needed) }
       { restore LR (if needed) }
       if (needslinkreg) then begin
       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_ref(A_LD, NR_R0, href));
         list.concat(taicpu.op_reg(A_MTLR, NR_R0));
         list.concat(taicpu.op_reg(A_MTLR, NR_R0));
       end;
       end;
@@ -1385,7 +1385,7 @@ begin
     if (localsize <= high(smallint)) then 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));
       list.concat(taicpu.op_reg_reg_const(A_ADDI, NR_STACK_POINTER_REG, NR_STACK_POINTER_REG, localsize));
     end else begin
     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
       { use R0 for loading the constant (which is definitely > 32k when entering
        this branch)
        this branch)
@@ -1434,7 +1434,7 @@ begin
   if (assigned(ref2.symbol) or (hasLargeOffset(ref2))) then begin
   if (assigned(ref2.symbol) or (hasLargeOffset(ref2))) then begin
     { add the symbol's value to the base of the reference, and if the }
     { add the symbol's value to the base of the reference, and if the }
     { reference doesn't have a base, create one                       }
     { 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.offset := ref2.offset;
     tmpref.symbol := ref2.symbol;
     tmpref.symbol := ref2.symbol;
     tmpref.relsymbol := ref2.relsymbol;
     tmpref.relsymbol := ref2.relsymbol;
@@ -1570,8 +1570,8 @@ begin
     end;
     end;
 
 
   tempreg:=getintregister(list,size);
   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 }
   { load the address of source into src.base }
   if (count > 4) or
   if (count > 4) or
     not issimpleref(source) or
     not issimpleref(source) or
@@ -1758,7 +1758,7 @@ begin
       ref.offset := 0;
       ref.offset := 0;
     end;
     end;
 
 
-    reference_reset(tmpref, ref.alignment);
+    reference_reset(tmpref, ref.alignment, ref.volatility);
     tmpref.symbol := ref.symbol;
     tmpref.symbol := ref.symbol;
     tmpref.relsymbol := ref.relsymbol;
     tmpref.relsymbol := ref.relsymbol;
     tmpref.offset := ref.offset;
     tmpref.offset := ref.offset;
@@ -1794,7 +1794,7 @@ begin
       end else
       end else
         a_load_const_reg(list, OS_ADDR, tmpref.offset, tmpreg2);
         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.base := ref.base;
       tmpref.index := tmpreg2;
       tmpref.index := tmpreg2;
       case op of
       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_symbol.create_global(l,0));
     current_asmdata.asmlists[al_picdata].concat(tai_directive.create(asd_toc_entry, symname + '[TC], ' + inttostr(a)));
     current_asmdata.asmlists[al_picdata].concat(tai_directive.create(asd_toc_entry, symname + '[TC], ' + inttostr(a)));
   end;
   end;
-  reference_reset_symbol(ref,l,0, 8);
+  reference_reset_symbol(ref,l,0,8,[]);
   ref.base := NR_R2;
   ref.base := NR_R2;
   ref.refaddr := addr_no;
   ref.refaddr := addr_no;
 
 

+ 1 - 1
compiler/powerpc64/nppccnv.pas

@@ -106,7 +106,7 @@ var
   signed: boolean;
   signed: boolean;
 begin
 begin
   location_reset(location, LOC_FPUREGISTER, def_cgsize(resultdef));
   location_reset(location, LOC_FPUREGISTER, def_cgsize(resultdef));
-  reference_reset(disp2,0);
+  reference_reset(disp2,0,[]);
   tempconst:=nil;
   tempconst:=nil;
 
 
   { the code here comes from the PowerPC Compiler Writer's Guide }
   { 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);
              a_loadaddr_ref_reg(list,r,paraloc.location^.register);
            LOC_REFERENCE:
            LOC_REFERENCE:
              begin
              begin
-               reference_reset(ref,paraloc.alignment);
+               reference_reset(ref,paraloc.alignment,[]);
                ref.base := paraloc.location^.reference.index;
                ref.base := paraloc.location^.reference.index;
                ref.offset := paraloc.location^.reference.offset;
                ref.offset := paraloc.location^.reference.offset;
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
@@ -349,7 +349,7 @@ unit cgppc;
           current_asmdata.weakrefasmsymbol(s,AT_FUNCTION);
           current_asmdata.weakrefasmsymbol(s,AT_FUNCTION);
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
         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);
         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;
         href.refaddr := addr_higha;
         if (cs_create_pic in current_settings.moduleswitches) then
         if (cs_create_pic in current_settings.moduleswitches) then
           begin
           begin
@@ -401,7 +401,7 @@ unit cgppc;
                begin
                begin
                  if macos_direct_globals then
                  if macos_direct_globals then
                    begin
                    begin
-                     reference_reset(tmpref,ref2.alignment);
+                     reference_reset(tmpref,ref2.alignment,ref2.volatility);
                      tmpref.offset := ref2.offset;
                      tmpref.offset := ref2.offset;
                      tmpref.symbol := ref2.symbol;
                      tmpref.symbol := ref2.symbol;
                      tmpref.base := NR_NO;
                      tmpref.base := NR_NO;
@@ -409,7 +409,7 @@ unit cgppc;
                    end
                    end
                  else
                  else
                    begin
                    begin
-                     reference_reset(tmpref,ref2.alignment);
+                     reference_reset(tmpref,ref2.alignment,ref2.volatility);
                      tmpref.symbol := ref2.symbol;
                      tmpref.symbol := ref2.symbol;
                      tmpref.offset := 0;
                      tmpref.offset := 0;
                      tmpref.base := NR_RTOC;
                      tmpref.base := NR_RTOC;
@@ -429,7 +429,7 @@ unit cgppc;
 
 
                  { add the symbol's value to the base of the reference, and if the }
                  { add the symbol's value to the base of the reference, and if the }
                  { reference doesn't have a base, create one                       }
                  { 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.offset := ref2.offset;
                  tmpref.symbol := ref2.symbol;
                  tmpref.symbol := ref2.symbol;
                  tmpref.relsymbol := ref2.relsymbol;
                  tmpref.relsymbol := ref2.relsymbol;
@@ -477,21 +477,21 @@ unit cgppc;
         if target_info.system in systems_aix then
         if target_info.system in systems_aix then
           begin
           begin
             { load function address in R0, and swap "reg" for R0 }
             { 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);
             a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_R0);
             tmpreg:=reg;
             tmpreg:=reg;
             { no need to allocate/free R0, is already allocated by call node
             { no need to allocate/free R0, is already allocated by call node
               because it's a volatile register }
               because it's a volatile register }
             reg:=NR_R0;
             reg:=NR_R0;
             { save current TOC }
             { 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);
             a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_RTOC,tmpref);
           end;
           end;
         list.concat(taicpu.op_reg(A_MTCTR,reg));
         list.concat(taicpu.op_reg(A_MTCTR,reg));
         if target_info.system in systems_aix then
         if target_info.system in systems_aix then
           begin
           begin
             { load target TOC and possible link register }
             { 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);
             a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_RTOC);
             tmpref.offset:=2*sizeof(pint);
             tmpref.offset:=2*sizeof(pint);
             a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_R11);
             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
         else if target_info.abi=abi_powerpc_elfv2 then
           begin
           begin
             { save current TOC }
             { 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);
             a_load_reg_ref(list,OS_ADDR,OS_ADDR,NR_RTOC,tmpref);
             { functions must be called via R12 for this ABI }
             { functions must be called via R12 for this ABI }
             if reg<>NR_R12 then
             if reg<>NR_R12 then
@@ -520,7 +520,7 @@ unit cgppc;
               toc_offset:=LA_RTOC_AIX
               toc_offset:=LA_RTOC_AIX
             else
             else
               toc_offset:=LA_RTOC_ELFV2;
               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);
             a_load_ref_reg(list,OS_ADDR,OS_ADDR,tmpref,NR_RTOC);
           end;
           end;
         include(current_procinfo.flags,pi_do_call);
         include(current_procinfo.flags,pi_do_call);
@@ -762,7 +762,7 @@ unit cgppc;
       if target_info.system=system_powerpc64_linux then
       if target_info.system=system_powerpc64_linux then
         begin
         begin
           l:=current_asmdata.getasmsymbol(symbol);
           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.base:=NR_RTOC;
           ref.refaddr:=addr_pic;
           ref.refaddr:=addr_pic;
         end
         end
@@ -803,7 +803,7 @@ unit cgppc;
     begin
     begin
       { all global symbol accesses always must be done via the TOC }
       { all global symbol accesses always must be done via the TOC }
       nlsymname:='LC..'+symname;
       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
       if (assigned(ref.symbol) and
           not(ref.symbol is TTOCAsmSymbol)) or
           not(ref.symbol is TTOCAsmSymbol)) or
          (not(ts_small_toc in current_settings.targetswitches) and
          (not(ts_small_toc in current_settings.targetswitches) and
@@ -1103,7 +1103,7 @@ unit cgppc;
               begin {Load symbol's value}
               begin {Load symbol's value}
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
 
 
-                reference_reset(tmpref,sizeof(pint));
+                reference_reset(tmpref,sizeof(pint),[]);
                 tmpref.symbol := ref.symbol;
                 tmpref.symbol := ref.symbol;
                 tmpref.base := NR_RTOC;
                 tmpref.base := NR_RTOC;
                 tmpref.refaddr := addr_pic_no_got;
                 tmpref.refaddr := addr_pic_no_got;
@@ -1120,7 +1120,7 @@ unit cgppc;
 
 
             if largeOffset then
             if largeOffset then
               begin {Add hi part of offset}
               begin {Add hi part of offset}
-                reference_reset(tmpref,ref.alignment);
+                reference_reset(tmpref,ref.alignment,[]);
 
 
 {$ifdef cpu64bitaddr}
 {$ifdef cpu64bitaddr}
                 if (ref.offset < low(longint)) or
                 if (ref.offset < low(longint)) or
@@ -1175,7 +1175,7 @@ unit cgppc;
               begin
               begin
                 // TODO: offsets > 32 bit
                 // TODO: offsets > 32 bit
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
-                reference_reset(tmpref,ref.alignment);
+                reference_reset(tmpref,ref.alignment,[]);
                 tmpref.symbol := ref.symbol;
                 tmpref.symbol := ref.symbol;
                 tmpref.relsymbol := ref.relsymbol;
                 tmpref.relsymbol := ref.relsymbol;
                 tmpref.offset := ref.offset;
                 tmpref.offset := ref.offset;

+ 8 - 8
compiler/ppcgen/hlcgppc.pas

@@ -103,7 +103,7 @@ implementation
       var
       var
         href : treference;
         href : treference;
       begin
       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);
         cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
       end;
       end;
 
 
@@ -115,7 +115,7 @@ implementation
         if (procdef.extnumber=$ffff) then
         if (procdef.extnumber=$ffff) then
           Internalerror(200006139);
           Internalerror(200006139);
         { call/jmp  vmtoffs(%eax) ; method offs }
         { 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
         if tcgppcgen(cg).hasLargeOffset(href) then
           begin
           begin
 {$ifdef cpu64}
 {$ifdef cpu64}
@@ -134,7 +134,7 @@ implementation
            ((target_info.system = system_powerpc64_linux) and
            ((target_info.system = system_powerpc64_linux) and
             (target_info.abi=abi_powerpc_sysv)) then
             (target_info.abi=abi_powerpc_sysv)) then
           begin
           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);
             cg.a_load_ref_reg(list, OS_ADDR, OS_ADDR, href, NR_R12);
           end;
           end;
         list.concat(taicpu.op_reg(A_MTCTR,NR_R12));
         list.concat(taicpu.op_reg(A_MTCTR,NR_R12));
@@ -221,11 +221,11 @@ implementation
       }
       }
       list.concat(taicpu.op_reg(A_MFLR, NR_R0));
       list.concat(taicpu.op_reg(A_MFLR, NR_R0));
       if target_info.abi=abi_powerpc_sysv then
       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
       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);
       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));
       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);
       cg.a_call_name(list,externalname,false);
@@ -234,9 +234,9 @@ implementation
 
 
 
 
       if target_info.abi=abi_powerpc_sysv then
       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
       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);
       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_reg(A_MTLR, NR_R0));
       list.concat(taicpu.op_none(A_BLR));
       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);
          tmpreg:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
          current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,tmpreg,
          current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,tmpreg,
            left.location.register));
            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,
          tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,
            tt_normal,location.reference);
            tt_normal,location.reference);
          cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,OS_F64,OS_F64,tmpreg,
          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);
         current_asmdata.getjumplabel(table);
         { create reference, indexreg := indexreg * sizeof(jtentry) (= 4) }
         { create reference, indexreg := indexreg * sizeof(jtentry) (= 4) }
         cg.a_op_const_reg(current_asmdata.CurrAsmList, OP_MUL, OS_INT, 4, indexreg);
         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);
         hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
         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;
         href.index:=indexreg;
         indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         { load table entry }
         { load table entry }

+ 2 - 2
compiler/ppcgen/rgcpu.pas

@@ -77,7 +77,7 @@ unit rgcpu;
             else
             else
               hreg:=cg.getintregister(helplist,OS_ADDR);
               hreg:=cg.getintregister(helplist,OS_ADDR);
 
 
-            reference_reset(tmpref,sizeof(aint));
+            reference_reset(tmpref,sizeof(aint),[]);
             tmpref.offset:=spilltemp.offset;
             tmpref.offset:=spilltemp.offset;
             tmpref.refaddr := addr_higha;
             tmpref.refaddr := addr_higha;
             ins:=taicpu.op_reg_reg_ref(A_ADDIS,hreg,spilltemp.base,tmpref);
             ins:=taicpu.op_reg_reg_ref(A_ADDIS,hreg,spilltemp.base,tmpref);
@@ -127,7 +127,7 @@ unit rgcpu;
               end
               end
             else
             else
               hreg:=cg.getintregister(helplist,OS_ADDR);
               hreg:=cg.getintregister(helplist,OS_ADDR);
-            reference_reset(tmpref,sizeof(aint));
+            reference_reset(tmpref,sizeof(aint),[]);
             tmpref.offset:=spilltemp.offset;
             tmpref.offset:=spilltemp.offset;
             tmpref.refaddr := addr_higha;
             tmpref.refaddr := addr_higha;
             ins:=taicpu.op_reg_reg_ref(A_ADDIS,hreg,spilltemp.base,tmpref);
             ins:=taicpu.op_reg_reg_ref(A_ADDIS,hreg,spilltemp.base,tmpref);

+ 1 - 1
compiler/procinfo.pas

@@ -202,7 +202,7 @@ implementation
         { asmlists }
         { asmlists }
         aktproccode:=TAsmList.Create;
         aktproccode:=TAsmList.Create;
         aktlocaldata:=TAsmList.Create;
         aktlocaldata:=TAsmList.Create;
-        reference_reset(save_regs_ref,sizeof(aint));
+        reference_reset(save_regs_ref,sizeof(aint),[]);
         { labels }
         { labels }
         current_asmdata.getjumplabel(CurrExitLabel);
         current_asmdata.getjumplabel(CurrExitLabel);
         current_asmdata.getjumplabel(CurrGOTLabel);
         current_asmdata.getjumplabel(CurrGOTLabel);

+ 11 - 11
compiler/sparc/cgcpu.pas

@@ -182,7 +182,7 @@ implementation
             exit;
             exit;
           end;
           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);
         hreg:=getintregister(list,OS_INT);
         if not (cs_create_pic in current_settings.moduleswitches) then
         if not (cs_create_pic in current_settings.moduleswitches) then
           begin
           begin
@@ -214,7 +214,7 @@ implementation
                 list.concat(taicpu.op_ref_reg(A_SETHI,href,hreg));
                 list.concat(taicpu.op_ref_reg(A_SETHI,href,hreg));
                 href.refaddr:=addr_low;
                 href.refaddr:=addr_low;
                 list.concat(taicpu.op_reg_ref_reg(A_OR,hreg,href,hreg));
                 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;
                 href.index:=current_procinfo.got;
               end
               end
             else
             else
@@ -340,7 +340,7 @@ implementation
                 a_load_ref_reg(list,hloc^.size,hloc^.size,href,hloc^.register);
                 a_load_ref_reg(list,hloc^.size,hloc^.size,href,hloc^.register);
               LOC_REFERENCE :
               LOC_REFERENCE :
                 begin
                 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);
                   a_load_ref_ref(list,hloc^.size,hloc^.size,href,href2);
                 end;
                 end;
               LOC_FPUREGISTER,LOC_CFPUREGISTER :
               LOC_FPUREGISTER,LOC_CFPUREGISTER :
@@ -580,7 +580,7 @@ implementation
             exit;
             exit;
           end;
           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
         if (cs_create_pic in current_settings.moduleswitches) then
           begin
           begin
             include(current_procinfo.flags,pi_needs_got);
             include(current_procinfo.flags,pi_needs_got);
@@ -591,7 +591,7 @@ implementation
                 list.concat(taicpu.op_ref_reg(A_SETHI,href,r));
                 list.concat(taicpu.op_ref_reg(A_SETHI,href,r));
                 href.refaddr:=addr_low;
                 href.refaddr:=addr_low;
                 list.concat(taicpu.op_reg_ref_reg(A_OR,r,href,r));
                 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;
                 href.index:=current_procinfo.got;
               end
               end
             else
             else
@@ -1022,7 +1022,7 @@ implementation
                  sethi  %hi(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
                  sethi  %hi(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
             2:   or     %l7, %lo(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
             2:   or     %l7, %lo(_GLOBAL_OFFSET_TABLE_+(.-1b)), %l7
                  add    %l7, %o7, %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;
             ref.refaddr:=addr_high;
             list.concat(taicpu.op_ref_reg(A_SETHI,ref,NR_L7));
             list.concat(taicpu.op_ref_reg(A_SETHI,ref,NR_L7));
             cg.a_label(list,hl);
             cg.a_label(list,hl);
@@ -1048,7 +1048,7 @@ implementation
       begin
       begin
         if paramanager.ret_in_param(current_procinfo.procdef.returndef,current_procinfo.procdef) then
         if paramanager.ret_in_param(current_procinfo.procdef.returndef,current_procinfo.procdef) then
           begin
           begin
-            reference_reset(hr,sizeof(pint));
+            reference_reset(hr,sizeof(pint),[]);
             hr.offset:=12;
             hr.offset:=12;
             hr.refaddr:=addr_full;
             hr.refaddr:=addr_full;
             if nostackframe then
             if nostackframe then
@@ -1151,14 +1151,14 @@ implementation
               src:=source
               src:=source
             else
             else
               begin
               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);
                 a_loadaddr_ref_reg(list,source,src.base);
               end;
               end;
             if (count<=4) and reference_is_reusable(dest) then
             if (count<=4) and reference_is_reusable(dest) then
               dst:=dest
               dst:=dest
             else
             else
               begin
               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);
                 a_loadaddr_ref_reg(list,dest,dst.base);
               end;
               end;
             { generate a loop }
             { generate a loop }
@@ -1230,8 +1230,8 @@ implementation
           g_concatcopy_move(list,source,dest,len)
           g_concatcopy_move(list,source,dest,len)
         else
         else
           begin
           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 }
             { load the address of source into src.base }
             src.base:=GetAddressRegister(list);
             src.base:=GetAddressRegister(list);
             a_loadaddr_ref_reg(list,source,src.base);
             a_loadaddr_ref_reg(list,source,src.base);

+ 2 - 2
compiler/sparc/hlcgcpu.pas

@@ -109,10 +109,10 @@ implementation
           if (procdef.extnumber=$ffff) then
           if (procdef.extnumber=$ffff) then
             Internalerror(200006139);
             Internalerror(200006139);
           { mov  0(%rdi),%rax ; load vmt}
           { 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);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_G1);
           { jmp *vmtoffs(%eax) ; method offs }
           { 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_ref_reg(A_LD,href,NR_G1));
           list.concat(taicpu.op_reg(A_JMP,NR_G1));
           list.concat(taicpu.op_reg(A_JMP,NR_G1));
           { Delay slot }
           { Delay slot }

+ 1 - 1
compiler/sparc/ncpucnv.pas

@@ -154,7 +154,7 @@ implementation
           begin
           begin
             current_asmdata.getglobaldatalabel(l1);
             current_asmdata.getglobaldatalabel(l1);
             current_asmdata.getjumplabel(l2);
             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);
             hregister:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
             hlcg.a_load_loc_reg(current_asmdata.CurrAsmList,left.resultdef,u32inttype,left.location,hregister);
             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 }
         { create reference }
         current_asmdata.getjumplabel(base);
         current_asmdata.getjumplabel(base);
         cg.a_label(current_asmdata.CurrAsmList,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;
         href.relsymbol:=base;
         { Generate the following code:
         { Generate the following code:
           .Lbase:
           .Lbase:
@@ -129,7 +129,7 @@ unit ncpuset;
         cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,OP_ADD,OS_ADDR,basereg,indexreg,basereg);
         cg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,OP_ADD,OS_ADDR,basereg,indexreg,basereg);
 
 
         jmpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         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;
         href.index:=basereg;
         cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,jmpreg);
         cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,jmpreg);
         href.index:=jmpreg;
         href.index:=jmpreg;

+ 4 - 4
compiler/sparc/rgcpu.pas

@@ -104,7 +104,7 @@ implementation
             else
             else
               hreg:=cg.getintregister(helplist,OS_ADDR);
               hreg:=cg.getintregister(helplist,OS_ADDR);
 
 
-            reference_reset(tmpref,sizeof(pint));
+            reference_reset(tmpref,sizeof(pint),[]);
             tmpref.offset:=spilltemp.offset;
             tmpref.offset:=spilltemp.offset;
             tmpref.refaddr:=addr_high;
             tmpref.refaddr:=addr_high;
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
@@ -112,7 +112,7 @@ implementation
             tmpref.refaddr:=addr_low;
             tmpref.refaddr:=addr_low;
             helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
             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;
             tmpref.index:=spilltemp.base;
 
 
             helpins:=spilling_create_load(tmpref,tempreg);
             helpins:=spilling_create_load(tmpref,tempreg);
@@ -140,7 +140,7 @@ implementation
             else
             else
               hreg:=cg.getintregister(helplist,OS_ADDR);
               hreg:=cg.getintregister(helplist,OS_ADDR);
 
 
-            reference_reset(tmpref,sizeof(aint));
+            reference_reset(tmpref,sizeof(aint),[]);
             tmpref.offset:=spilltemp.offset;
             tmpref.offset:=spilltemp.offset;
             tmpref.refaddr:=addr_high;
             tmpref.refaddr:=addr_high;
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
@@ -148,7 +148,7 @@ implementation
             tmpref.refaddr:=addr_low;
             tmpref.refaddr:=addr_low;
             helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
             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;
             tmpref.index:=spilltemp.base;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             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_symbol.Createname_global(ExtractFileName(ImportLibrary.Name)+'_index_'+tostr(ImportSymbol.ordnr),AT_FUNCTION,0,voidcodepointertype));
                     current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
                     current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
                   {$ifdef ARM}
                   {$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));
                     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(Taicpu.op_reg_ref(A_LDR,NR_R15,href));
                     current_asmdata.asmlists[al_imports].concat(Tai_label.Create(l5));
                     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));
                     current_asmdata.asmlists[al_imports].concat(tai_const.create_sym_offset(href.symbol,href.offset));
                   {$else ARM}
                   {$else ARM}
-                    reference_reset_symbol(href,l4,0,sizeof(pint));
+                    reference_reset_symbol(href,l4,0,sizeof(pint),[]);
 {$ifdef X86_64}
 {$ifdef X86_64}
                     href.base:=NR_RIP;
                     href.base:=NR_RIP;
 {$endif X86_64}
 {$endif X86_64}

+ 1 - 1
compiler/tgobj.pas

@@ -446,7 +446,7 @@ implementation
 {$else}
 {$else}
          list.concat(tai_tempalloc.alloc(tl^.pos,tl^.size));
          list.concat(tai_tempalloc.alloc(tl^.pos,tl^.size));
 {$endif}
 {$endif}
-         reference_reset_base(ref,current_procinfo.framepointer,tl^.pos,alignment);
+         reference_reset_base(ref,current_procinfo.framepointer,tl^.pos,alignment,[]);
       end;
       end;
 
 
 
 

+ 1 - 1
compiler/x86/aasmcpu.pas

@@ -3664,7 +3664,7 @@ implementation
       var
       var
         r: treference;
         r: treference;
       begin
       begin
-        reference_reset_symbol(r,s,0,1);
+        reference_reset_symbol(r,s,0,1,[]);
         r.refaddr:=addr_seg;
         r.refaddr:=addr_seg;
         loadref(opidx,r);
         loadref(opidx,r);
       end;
       end;

+ 34 - 34
compiler/x86/cgx86.pas

@@ -467,7 +467,7 @@ unit cgx86;
             else
             else
               begin
               begin
                 { don't use add, as the flags may contain a value }
                 { 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.index:=ref.index;
                 href.scalefactor:=ref.scalefactor;
                 href.scalefactor:=ref.scalefactor;
                 list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,hreg));
                 list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,hreg));
@@ -487,7 +487,7 @@ unit cgx86;
                     if (ref.base<>NR_NO) or
                     if (ref.base<>NR_NO) or
                        (ref.index<>NR_NO) then
                        (ref.index<>NR_NO) then
                       begin
                       begin
-                        reference_reset_symbol(href,ref.symbol,0,ref.alignment);
+                        reference_reset_symbol(href,ref.symbol,0,ref.alignment,[]);
                         hreg:=getaddressregister(list);
                         hreg:=getaddressregister(list);
                         href.refaddr:=addr_pic_no_got;
                         href.refaddr:=addr_pic_no_got;
                         href.base:=NR_RIP;
                         href.base:=NR_RIP;
@@ -503,7 +503,7 @@ unit cgx86;
                   end
                   end
                 else
                 else
                   begin
                   begin
-                    reference_reset_symbol(href,ref.symbol,0,ref.alignment);
+                    reference_reset_symbol(href,ref.symbol,0,ref.alignment,[]);
                     hreg:=getaddressregister(list);
                     hreg:=getaddressregister(list);
                     href.refaddr:=addr_pic;
                     href.refaddr:=addr_pic;
                     href.base:=NR_RIP;
                     href.base:=NR_RIP;
@@ -521,7 +521,7 @@ unit cgx86;
                 else
                 else
                   begin
                   begin
                     { don't use add, as the flags may contain a value }
                     { 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;
                     href.index:=hreg;
                     ref.base:=getaddressregister(list);
                     ref.base:=getaddressregister(list);
                     list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,ref.base));
                     list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,ref.base));
@@ -540,7 +540,7 @@ unit cgx86;
                   else
                   else
                     begin
                     begin
                       { Use temp register to load calculated 64-bit symbol address for complex references }
                       { 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.base:=NR_RIP;
                       href.refaddr:=addr_pic_no_got;
                       href.refaddr:=addr_pic_no_got;
                       hreg:=GetAddressRegister(list);
                       hreg:=GetAddressRegister(list);
@@ -556,7 +556,7 @@ unit cgx86;
                       else
                       else
                         begin
                         begin
                           { don't use add, as the flags may contain a value }
                           { 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;
                           href.index:=hreg;
                           ref.base:=getaddressregister(list);
                           ref.base:=getaddressregister(list);
                           list.concat(taicpu.op_ref_reg(A_LEA,S_Q,href,ref.base));
                           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
         else if (cs_create_pic in current_settings.moduleswitches) and
            assigned(ref.symbol) then
            assigned(ref.symbol) then
           begin
           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.base:=current_procinfo.got;
             href.refaddr:=addr_pic;
             href.refaddr:=addr_pic;
             include(current_procinfo.flags,pi_needs_got);
             include(current_procinfo.flags,pi_needs_got);
@@ -615,7 +615,7 @@ unit cgx86;
             else
             else
               begin
               begin
                 { don't use add, as the flags may contain a value }
                 { 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;
                 href.index:=hreg;
                 list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
                 list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
                 ref.base:=hreg;
                 ref.base:=hreg;
@@ -663,14 +663,14 @@ unit cgx86;
           begin
           begin
             { load the symbol into a register }
             { load the symbol into a register }
             hreg:=getaddressregister(list);
             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
             { 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 }
               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);
             a_load_ref_reg_internal(list,OS_ADDR,OS_ADDR,href,hreg,true);
             if ref.base<>NR_NO then
             if ref.base<>NR_NO then
               begin
               begin
                 { fold symbol register into base register }
                 { 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;
                 href.index:=ref.base;
                 hreg:=getaddressregister(list);
                 hreg:=getaddressregister(list);
                 a_loadaddr_ref_reg(list,href,hreg);
                 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)))
           list.concat(taicpu.op_sym(A_JMP,S_NO,current_asmdata.RefAsmSymbol(s,AT_FUNCTION)))
         else
         else
           begin
           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;
             r.refaddr:=addr_full;
             list.concat(taicpu.op_ref(A_JMP,S_NO,r));
             list.concat(taicpu.op_ref(A_JMP,S_NO,r));
           end;
           end;
@@ -857,7 +857,7 @@ unit cgx86;
               sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
               sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
             else
             else
               sym:=current_asmdata.WeakRefAsmSymbol(s,AT_FUNCTION);
               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
             if (cs_create_pic in current_settings.moduleswitches) and
                { darwin's assembler doesn't want @PLT after call symbols }
                { 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
                not(target_info.system in [system_x86_64_darwin,system_i386_iphonesim,system_x86_64_iphonesim]) then
@@ -872,7 +872,7 @@ unit cgx86;
           end
           end
         else
         else
           begin
           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;
             r.refaddr:=addr_full;
           end;
           end;
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
@@ -891,7 +891,7 @@ unit cgx86;
         r : treference;
         r : treference;
       begin
       begin
         sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION);
         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;
         r.refaddr:=addr_full;
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
       end;
       end;
@@ -1076,13 +1076,13 @@ unit cgx86;
                           begin
                           begin
                              reference_reset_base(tmpref,
                              reference_reset_base(tmpref,
                                g_indirect_sym_load(list,dirref.symbol.name,asmsym2indsymflags(dirref.symbol)),
                                g_indirect_sym_load(list,dirref.symbol.name,asmsym2indsymflags(dirref.symbol)),
-                               offset,sizeof(pint));
+                               offset,sizeof(pint),[]);
                              a_loadaddr_ref_reg(list,tmpref,r);
                              a_loadaddr_ref_reg(list,tmpref,r);
                           end
                           end
                        else
                        else
                          begin
                          begin
                            include(current_procinfo.flags,pi_needs_got);
                            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.symbol:=symbol;
                            tmpref.relsymbol:=current_procinfo.CurrGOTLabel;
                            tmpref.relsymbol:=current_procinfo.CurrGOTLabel;
                            list.concat(Taicpu.op_ref_reg(A_LEA,tcgsize2opsize[OS_ADDR],tmpref,r));
                            list.concat(Taicpu.op_ref_reg(A_LEA,tcgsize2opsize[OS_ADDR],tmpref,r));
@@ -1095,12 +1095,12 @@ unit cgx86;
                             then
                             then
                       begin
                       begin
 {$ifdef x86_64}
 {$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.refaddr:=addr_pic;
                         tmpref.base:=NR_RIP;
                         tmpref.base:=NR_RIP;
                         list.concat(taicpu.op_ref_reg(A_MOV,S_Q,tmpref,r));
                         list.concat(taicpu.op_ref_reg(A_MOV,S_Q,tmpref,r));
 {$else x86_64}
 {$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.refaddr:=addr_pic;
                         tmpref.base:=current_procinfo.got;
                         tmpref.base:=current_procinfo.got;
                         include(current_procinfo.flags,pi_needs_got);
                         include(current_procinfo.flags,pi_needs_got);
@@ -1159,7 +1159,7 @@ unit cgx86;
                       system_i386_linux,system_i386_android:
                       system_i386_linux,system_i386_android:
                         if segment=NR_GS then
                         if segment=NR_GS then
                           begin
                           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;
                             tmpref.segment:=NR_GS;
                             list.concat(Taicpu.op_ref_reg(A_ADD,tcgsize2opsize[OS_ADDR],tmpref,r));
                             list.concat(Taicpu.op_ref_reg(A_ADD,tcgsize2opsize[OS_ADDR],tmpref,r));
                           end
                           end
@@ -1666,7 +1666,7 @@ unit cgx86;
           not(cs_check_overflow in current_settings.localswitches) and
           not(cs_check_overflow in current_settings.localswitches) and
           (a>1) and ispowerof2(int64(a-1),power) and (power in [1..3]) then
           (a>1) and ispowerof2(int64(a-1),power) and (power in [1..3]) then
           begin
           begin
-            reference_reset_base(href,src,0,0);
+            reference_reset_base(href,src,0,0,[]);
             href.index:=src;
             href.index:=src;
             href.scalefactor:=a-1;
             href.scalefactor:=a-1;
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
             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
           not(cs_check_overflow in current_settings.localswitches) and
           (a>1) and ispowerof2(int64(a),power) and (power in [1..3]) then
           (a>1) and ispowerof2(int64(a),power) and (power in [1..3]) then
           begin
           begin
-            reference_reset_base(href,NR_NO,0,0);
+            reference_reset_base(href,NR_NO,0,0,[]);
             href.index:=src;
             href.index:=src;
             href.scalefactor:=a;
             href.scalefactor:=a;
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
@@ -1702,7 +1702,7 @@ unit cgx86;
 {$push} {$R-}{$Q-}
 {$push} {$R-}{$Q-}
             al := longint (a);
             al := longint (a);
 {$pop}
 {$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));
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
           end
           end
         else if (op=OP_SUB) and
         else if (op=OP_SUB) and
@@ -1713,7 +1713,7 @@ unit cgx86;
           ) and
           ) and
           not(cs_check_overflow in current_settings.localswitches) then
           not(cs_check_overflow in current_settings.localswitches) then
           begin
           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));
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
           end
           end
         else if (op in [OP_ROR,OP_ROL]) and
         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
         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
           not(cs_check_overflow in current_settings.localswitches) then
           begin
           begin
-            reference_reset_base(href,src1,0,0);
+            reference_reset_base(href,src1,0,0,[]);
             href.index:=src2;
             href.index:=src2;
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
             list.concat(taicpu.op_ref_reg(A_LEA,TCgSize2OpSize[size],href,dst));
           end
           end
@@ -2773,7 +2773,7 @@ unit cgx86;
         var
         var
           href : treference;
           href : treference;
         begin
         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 }
           { 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));
           list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
         end;
         end;
@@ -2801,7 +2801,7 @@ unit cgx86;
                     decrease_sp(localsize-4);
                     decrease_sp(localsize-4);
                     for i:=1 to localsize div winstackpagesize do
                     for i:=1 to localsize div winstackpagesize do
                       begin
                       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));
                          list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                       end;
                       end;
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                     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));
                       list.concat(Taicpu.op_const_reg(A_SUB,S_L,1,NR_EDI));
                     a_jmp_cond(list,OC_NE,again);
                     a_jmp_cond(list,OC_NE,again);
                     decrease_sp(localsize mod winstackpagesize-4);
                     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));
                     list.concat(Taicpu.op_ref_reg(A_MOV,S_L,href,NR_EDI));
                     a_reg_dealloc(list,NR_EDI);
                     a_reg_dealloc(list,NR_EDI);
                  end
                  end
@@ -2845,10 +2845,10 @@ unit cgx86;
                     decrease_sp(localsize);
                     decrease_sp(localsize);
                     for i:=1 to localsize div winstackpagesize do
                     for i:=1 to localsize div winstackpagesize do
                       begin
                       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));
                          list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                       end;
                       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));
                     list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                  end
                  end
                else
                else
@@ -2858,7 +2858,7 @@ unit cgx86;
                     list.concat(Taicpu.op_const_reg(A_MOV,S_Q,localsize div winstackpagesize,NR_R10));
                     list.concat(Taicpu.op_const_reg(A_MOV,S_Q,localsize div winstackpagesize,NR_R10));
                     a_label(list,again);
                     a_label(list,again);
                     decrease_sp(winstackpagesize);
                     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));
                     list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                     if UseIncDec then
                     if UseIncDec then
                       list.concat(Taicpu.op_reg(A_DEC,S_Q,NR_R10))
                       list.concat(Taicpu.op_reg(A_DEC,S_Q,NR_R10))
@@ -2986,14 +2986,14 @@ unit cgx86;
               end
               end
             else if current_settings.x86memorymodel=mm_huge then
             else if current_settings.x86memorymodel=mm_huge then
               begin
               begin
-                reference_reset(fardataseg,0);
+                reference_reset(fardataseg,0,[]);
                 fardataseg.refaddr:=addr_fardataseg;
                 fardataseg.refaddr:=addr_fardataseg;
                 list.concat(Taicpu.Op_ref_reg(A_MOV,S_W,fardataseg,NR_AX));
                 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));
                 list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
               end
               end
             else
             else
               begin
               begin
-                reference_reset(dgroup,0);
+                reference_reset(dgroup,0,[]);
                 dgroup.refaddr:=addr_dgroup;
                 dgroup.refaddr:=addr_dgroup;
                 list.concat(Taicpu.Op_ref_reg(A_MOV,S_W,dgroup,NR_AX));
                 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));
                 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
                       not (po_interrupt in current_procinfo.procdef.procoptions) then
                 begin
                 begin
                   list.concat(Taicpu.op_reg(A_PUSH,S_W,NR_DS));
                   list.concat(Taicpu.op_reg(A_PUSH,S_W,NR_DS));
-                  reference_reset(fardataseg,0);
+                  reference_reset(fardataseg,0,[]);
                   fardataseg.refaddr:=addr_fardataseg;
                   fardataseg.refaddr:=addr_fardataseg;
                   if current_procinfo.procdef.proccalloption=pocall_register then
                   if current_procinfo.procdef.proccalloption=pocall_register then
                     begin
                     begin
@@ -3137,7 +3137,7 @@ unit cgx86;
                 push_regs;
                 push_regs;
                 reference_reset_base(current_procinfo.save_regs_ref,
                 reference_reset_base(current_procinfo.save_regs_ref,
                   current_procinfo.framepointer,
                   current_procinfo.framepointer,
-                  -(localsize+regsize),sizeof(aint));
+                  -(localsize+regsize),sizeof(aint),[]);
               end;
               end;
 {$endif i386}
 {$endif i386}
           end;
           end;

+ 1 - 1
compiler/x86/hlcgx86.pas

@@ -77,7 +77,7 @@ implementation
        end;
        end;
 
 
       sym:=current_asmdata.RefAsmSymbol(externalname,AT_FUNCTION);
       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? }
       { create pic'ed? }
       if (cs_create_pic in current_settings.moduleswitches) and
       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
                     (power in [1..3]) and
                     not(cs_check_overflow in current_settings.localswitches) then
                     not(cs_check_overflow in current_settings.localswitches) then
                   begin
                   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.index:=left.location.register;
                     href.scalefactor:=int64(right.location.value)-1;
                     href.scalefactor:=int64(right.location.value)-1;
                     left.location.register:=cg.getintregister(current_asmdata.CurrAsmList,opsize);
                     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));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
                    { I got this constant from a test program (FK) }
                    { I got this constant from a test program (FK) }
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit($5f800000));
                    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);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,href);
                    current_asmdata.CurrAsmList.concat(Taicpu.Op_ref(A_FADD,S_FS,href));
                    current_asmdata.CurrAsmList.concat(Taicpu.Op_ref(A_FADD,S_FS,href));
                    cg.a_label(current_asmdata.CurrAsmList,l2);
                    cg.a_label(current_asmdata.CurrAsmList,l2);

+ 6 - 6
compiler/x86/nx86inl.pas

@@ -341,7 +341,7 @@ implementation
              case tfloatdef(resultdef).floattype of
              case tfloatdef(resultdef).floattype of
                s32real:
                s32real:
                  begin
                  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);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList, href);
                    if UseAVX then
                    if UseAVX then
                      current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
                      current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
@@ -351,7 +351,7 @@ implementation
                  end;
                  end;
                s64real:
                s64real:
                  begin
                  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);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList, href);
                    if UseAVX then
                    if UseAVX then
                      current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
                      current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg_reg(
@@ -403,7 +403,7 @@ implementation
 {$endif x86_64}
 {$endif x86_64}
           begin
           begin
             load_fpu_location(left);
             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);
             tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
             emit_ref(A_FISTP,S_IQ,location.reference);
             emit_ref(A_FISTP,S_IQ,location.reference);
             tcgx86(cg).dec_fpu_stack;
             tcgx86(cg).dec_fpu_stack;
@@ -449,7 +449,7 @@ implementation
             if (current_settings.fputype>=fpu_sse3) then
             if (current_settings.fputype>=fpu_sse3) then
               begin
               begin
                 load_fpu_location(left);
                 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);
                 tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
                 emit_ref(A_FISTTP,S_IQ,location.reference);
                 emit_ref(A_FISTTP,S_IQ,location.reference);
                 tcgx86(cg).dec_fpu_stack;
                 tcgx86(cg).dec_fpu_stack;
@@ -474,7 +474,7 @@ implementation
                 emit_const_ref(A_OR,S_W,$0f00,newcw);
                 emit_const_ref(A_OR,S_W,$0f00,newcw);
                 load_fpu_location(left);
                 load_fpu_location(left);
                 emit_ref(A_FLDCW,S_NO,newcw);
                 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);
                 tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
                 emit_ref(A_FISTP,S_IQ,location.reference);
                 emit_ref(A_FISTP,S_IQ,location.reference);
                 tcgx86(cg).dec_fpu_stack;
                 tcgx86(cg).dec_fpu_stack;
@@ -610,7 +610,7 @@ implementation
                  begin
                  begin
                    r:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
                    r:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
                    cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,r);
                    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));
                    current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_PREFETCHNTA,S_NO,ref));
                  end;
                  end;
                else
                else

+ 2 - 2
compiler/x86/nx86ld.pas

@@ -65,9 +65,9 @@ implementation
                 pd:=search_system_proc('fpc_tls_add');
                 pd:=search_system_proc('fpc_tls_add');
                 paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
                 paramanager.getintparaloc(current_asmdata.CurrAsmList,pd,1,paraloc1);
                 if not(vo_is_weak_external in gvs.varoptions) then
                 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
                 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);
                 cg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,href,paraloc1);
                 paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
                 paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
                 paraloc1.done;
                 paraloc1.done;

+ 1 - 1
compiler/x86/nx86mat.pas

@@ -183,7 +183,7 @@ interface
                 internalerror(2004110215);
                 internalerror(2004110215);
             end;
             end;
 
 
-            reference_reset_symbol(href,l1,0,resultdef.alignment);
+            reference_reset_symbol(href,l1,0,resultdef.alignment,[]);
 
 
             if UseAVX then
             if UseAVX then
               cg.a_opmm_ref_reg_reg(current_asmdata.CurrAsmList,OP_XOR,left.location.size,href,left.location.register,location.register,nil)
               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);
             cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,location.reference,hreg);
             { reference_reset_base kills the segment, so make sure we preserve it }
             { reference_reset_base kills the segment, so make sure we preserve it }
             saveseg:=location.reference.segment;
             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;
             location.reference.segment:=saveseg;
           end;
           end;
          { insert the new index register and scalefactor or
          { 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);
         indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_INT);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_INT,hregister,indexreg);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opcgsize,OS_INT,hregister,indexreg);
         { create reference }
         { 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.offset:=(-aint(min_))*sizeof(aint);
         href.index:=indexreg;
         href.index:=indexreg;
 {$ifdef i8086}
 {$ifdef i8086}

+ 4 - 4
compiler/x86_64/cgcpu.pas

@@ -254,7 +254,7 @@ unit cgcpu;
               begin
               begin
                 localsize:=align(localsize,target_info.stackalign)+xmmsize;
                 localsize:=align(localsize,target_info.stackalign)+xmmsize;
                 reference_reset_base(current_procinfo.save_regs_ref,NR_STACK_POINTER_REG,
                 reference_reset_base(current_procinfo.save_regs_ref,NR_STACK_POINTER_REG,
-                  localsize-xmmsize,tcgsize2size[OS_VECTOR]);
+                  localsize-xmmsize,tcgsize2size[OS_VECTOR],[]);
               end;
               end;
 
 
             { allocate stackframe space }
             { allocate stackframe space }
@@ -353,7 +353,7 @@ unit cgcpu;
         var
         var
           href : treference;
           href : treference;
         begin
         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 }
           { 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));
           list.concat(Taicpu.op_ref_reg(A_LEA,TCGSize2OpSize[OS_ADDR],href,NR_STACK_POINTER_REG));
         end;
         end;
@@ -399,7 +399,7 @@ unit cgcpu;
                   'add $constant,%rsp' and 'lea offset(FPREG),%rsp' as belonging to
                   'add $constant,%rsp' and 'lea offset(FPREG),%rsp' as belonging to
                   the function epilog.
                   the function epilog.
                   Neither 'leave' nor even 'mov %FPREG,%rsp' are allowed. }
                   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_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));
                 list.concat(Taicpu.op_reg(A_POP,tcgsize2opsize[OS_ADDR],current_procinfo.framepointer));
               end
               end
@@ -447,7 +447,7 @@ unit cgcpu;
         para2.init;
         para2.init;
         paramanager.getintparaloc(list,pd,1,para1);
         paramanager.getintparaloc(list,pd,1,para1);
         paramanager.getintparaloc(list,pd,2,para2);
         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!!
         { TODO: using RSP is correct only while the stack is fixed!!
           (true now, but will change if/when allocating from stack is implemented) }
           (true now, but will change if/when allocating from stack is implemented) }
         a_load_reg_cgpara(list,OS_ADDR,NR_STACK_POINTER_REG,para1);
         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 }
           { load vmt from first paramter }
           { win64 uses a different abi }
           { win64 uses a different abi }
           if target_info.system=system_x86_64_win64 then
           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
           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);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_RAX);
           { jmp *vmtoffs(%eax) ; method offs }
           { 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));
           list.concat(taicpu.op_ref(A_JMP,S_Q,href));
         end
         end
       else
       else
         begin
         begin
           sym:=current_asmdata.RefAsmSymbol(procdef.mangledname,AT_FUNCTION);
           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
           if (cs_create_pic in current_settings.moduleswitches) and
              { darwin/x86_64's assembler doesn't want @PLT after call symbols }
              { darwin/x86_64's assembler doesn't want @PLT after call symbols }
              not(target_info.system in systems_darwin) then
              not(target_info.system in systems_darwin) then

+ 1 - 1
compiler/x86_64/nx64add.pas

@@ -76,7 +76,7 @@ interface
         cgsize:TCgSize;
         cgsize:TCgSize;
         opsize:topsize;
         opsize:topsize;
       begin
       begin
-        reference_reset(ref,0);
+        reference_reset(ref,0,[]);
         reg:=NR_NO;
         reg:=NR_NO;
 
 
         cgsize:=def_cgsize(resultdef);
         cgsize:=def_cgsize(resultdef);

Некоторые файлы не были показаны из-за большого количества измененных файлов