Browse Source

* keep track of the temp position separately from the offset in references,
so that they can still be freed after the reference has been changed
(e.g. in case of array indexing or record field accesses) (mantis #33628)

git-svn-id: trunk@38814 -

Jonas Maebe 7 years ago
parent
commit
4686f61002
71 changed files with 382 additions and 381 deletions
  1. 12 12
      compiler/aarch64/cgcpu.pas
  2. 2 2
      compiler/aarch64/hlcgcpu.pas
  3. 1 1
      compiler/aarch64/ncpumem.pas
  4. 1 1
      compiler/aarch64/ncpuset.pas
  5. 1 1
      compiler/aarch64/rgcpu.pas
  6. 17 17
      compiler/arm/cgcpu.pas
  7. 3 3
      compiler/arm/hlcgcpu.pas
  8. 1 1
      compiler/arm/narminl.pas
  9. 6 6
      compiler/arm/rgcpu.pas
  10. 2 2
      compiler/avr/cgcpu.pas
  11. 1 1
      compiler/avr/raavrgas.pas
  12. 2 2
      compiler/avr/rgcpu.pas
  13. 10 10
      compiler/cgobj.pas
  14. 17 2
      compiler/cgutils.pas
  15. 18 24
      compiler/hlcgobj.pas
  16. 2 2
      compiler/i386/cgcpu.pas
  17. 10 10
      compiler/i386/hlcgcpu.pas
  18. 2 2
      compiler/i386/n386flw.pas
  19. 6 6
      compiler/i8086/cgcpu.pas
  20. 15 14
      compiler/i8086/hlcgcpu.pas
  21. 1 1
      compiler/i8086/n8086ld.pas
  22. 5 5
      compiler/jvm/hlcgcpu.pas
  23. 1 1
      compiler/jvm/njvmcnv.pas
  24. 1 1
      compiler/jvm/njvmld.pas
  25. 1 1
      compiler/jvm/njvmmem.pas
  26. 12 22
      compiler/llvm/hlcgllvm.pas
  27. 2 2
      compiler/llvm/nllvmcnv.pas
  28. 1 1
      compiler/llvm/nllvmcon.pas
  29. 2 2
      compiler/llvm/nllvminl.pas
  30. 1 1
      compiler/llvm/nllvmld.pas
  31. 4 4
      compiler/llvm/nllvmmem.pas
  32. 12 1
      compiler/llvm/tgllvm.pas
  33. 2 2
      compiler/m68k/aoptcpu.pas
  34. 20 20
      compiler/m68k/cgcpu.pas
  35. 8 8
      compiler/m68k/hlcgcpu.pas
  36. 2 2
      compiler/m68k/n68kcal.pas
  37. 1 1
      compiler/m68k/n68kmem.pas
  38. 2 2
      compiler/m68k/rgcpu.pas
  39. 1 1
      compiler/mips/cgcpu.pas
  40. 2 2
      compiler/mips/hlcgcpu.pas
  41. 2 2
      compiler/mips/rgcpu.pas
  42. 3 3
      compiler/ncgbas.pas
  43. 6 6
      compiler/ncgcal.pas
  44. 2 2
      compiler/ncgcnv.pas
  45. 3 3
      compiler/ncginl.pas
  46. 9 9
      compiler/ncgld.pas
  47. 9 9
      compiler/ncgmem.pas
  48. 2 2
      compiler/ncgutil.pas
  49. 6 1
      compiler/parabase.pas
  50. 1 0
      compiler/paramgr.pas
  51. 26 26
      compiler/powerpc/cgcpu.pas
  52. 2 2
      compiler/powerpc/nppccal.pas
  53. 12 12
      compiler/powerpc64/cgcpu.pas
  54. 5 5
      compiler/ppcgen/cgppc.pas
  55. 8 8
      compiler/ppcgen/hlcgppc.pas
  56. 1 1
      compiler/ppcgen/ngppcset.pas
  57. 1 1
      compiler/sparc64/cgcpu.pas
  58. 2 3
      compiler/sparc64/tgcpu.pas
  59. 5 6
      compiler/sparcgen/cgsparc.pas
  60. 2 14
      compiler/sparcgen/hlcgcpu.pas
  61. 1 1
      compiler/sparcgen/ncpuset.pas
  62. 2 2
      compiler/sparcgen/rgcpu.pas
  63. 1 1
      compiler/systems/t_win.pas
  64. 31 33
      compiler/tgobj.pas
  65. 19 19
      compiler/x86/cgx86.pas
  66. 1 1
      compiler/x86/nx86add.pas
  67. 1 1
      compiler/x86/nx86inl.pas
  68. 1 1
      compiler/x86/nx86mem.pas
  69. 3 3
      compiler/x86_64/cgcpu.pas
  70. 3 3
      compiler/x86_64/hlcgcpu.pas
  71. 2 2
      compiler/x86_64/nx64set.pas

+ 12 - 12
compiler/aarch64/cgcpu.pas

@@ -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,ctempposinvalid,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,ref.volatility);
+                      reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.temppos,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,ref.volatility);
+                  reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.temppos,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,ref.volatility);
+                            reference_reset_base(ref,preferred_newbasereg,ref.offset,ref.temppos,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,ref.volatility);
+                      reference_reset_base(ref,preferred_newbasereg,0,ref.temppos,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),ref.volatility);
+        reference_reset_base(ref,preferred_newbasereg,0,ref.temppos,newalignment(8,ref.offset),ref.volatility);
       end;
       end;
 
 
 
 
@@ -1525,7 +1525,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,ctempposinvalid,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 }
@@ -1573,7 +1573,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,ctempposinvalid,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 }
@@ -1649,7 +1649,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,ctempposinvalid,16,[]);
         ref.addressmode:=AM_POSTINDEXED;
         ref.addressmode:=AM_POSTINDEXED;
         { highest reg stored twice? }
         { highest reg stored twice? }
         regcount:=0;
         regcount:=0;
@@ -1720,7 +1720,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,ctempposinvalid,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;
@@ -1921,12 +1921,12 @@ implementation
           basereplaced:=true;
           basereplaced:=true;
           if forcepostindexing then
           if forcepostindexing then
             begin
             begin
-              reference_reset_base(ref,tmpreg,scaledoffset,ref.alignment,ref.volatility);
+              reference_reset_base(ref,tmpreg,scaledoffset,ref.temppos,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,ref.volatility);
+              reference_reset_base(ref,tmpreg,0,ref.temppos,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,ctempposinvalid,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),ctempposinvalid,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,location.reference.volatility);
+          reference_reset_base(location.reference,base,oldoffset,location.reference.temppos,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;

+ 1 - 1
compiler/aarch64/ncpuset.pas

@@ -128,7 +128,7 @@ implementation
         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,href.temppos,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,spilltemp.temppos,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)

+ 17 - 17
compiler/arm/cgcpu.pas

@@ -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,ref.volatility);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.temppos,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,ref.volatility);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.temppos,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),reference.temppos,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
@@ -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,location^.reference.temppos,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)
@@ -1683,7 +1683,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,hloc^.reference.temppos,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;
@@ -2796,7 +2796,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,source.volatility);
+                reference_reset_base(srcref,srcreg,0,source.temppos,source.alignment,source.volatility);
               end;
               end;
 
 
             while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
             while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
@@ -2810,7 +2810,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,dest.volatility);
+            reference_reset_base(dstref,destreg,0,dest.temppos,dest.alignment,dest.volatility);
             tmpregi2:=1;
             tmpregi2:=1;
             while (tmpregi2<=tmpregi) do
             while (tmpregi2<=tmpregi) do
               begin
               begin
@@ -2878,11 +2878,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,dest.volatility);
+                reference_reset_base(dstref,destreg,0,dest.temppos,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,source.volatility);
+                reference_reset_base(srcref,srcreg,0,dest.temppos,source.alignment,source.volatility);
 
 
                 countreg:=getintregister(list,OS_32);
                 countreg:=getintregister(list,OS_32);
 
 
@@ -3788,7 +3788,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,ref.volatility);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.temppos,ref.alignment,ref.volatility);
                      end
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -3821,7 +3821,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,ref.volatility);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.temppos,ref.alignment,ref.volatility);
                      end
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -3935,7 +3935,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),reference.temppos,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
@@ -4002,7 +4002,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,ref.volatility);
+            reference_reset_base(href,tmpreg,0,ref.temppos,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
@@ -4012,7 +4012,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,ref.volatility);
+            reference_reset_base(href,tmpreg,0,ref.temppos,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
@@ -4021,7 +4021,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,ref.volatility);
+            reference_reset_base(href,tmpreg,0,ref.temppos,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);
@@ -4339,7 +4339,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,ref.volatility);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.temppos,ref.alignment,ref.volatility);
                      end
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -4371,7 +4371,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,ref.volatility);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.temppos,ref.alignment,ref.volatility);
                      end
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;

+ 3 - 3
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,ctempposinvalid,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
@@ -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),ctempposinvalid,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]));
@@ -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),ctempposinvalid,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

+ 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,location.reference.volatility);
+                  reference_reset_base(ref,r,0,location.reference.temppos,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;

+ 6 - 6
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,spilltemp.temppos,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, spilltemp.temppos, 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), spilltemp.temppos, 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,spilltemp.temppos,sizeof(aint),[]);
           tmpref.index:=hreg;
           tmpref.index:=hreg;
         end;
         end;
 
 
@@ -483,7 +483,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,ctempposinvalid,sizeof(aint),[]);
             tmpref.index:=hreg;
             tmpref.index:=hreg;
 
 
             if spilltemp.index<>NR_NO then
             if spilltemp.index<>NR_NO then
@@ -543,7 +543,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,ctempposinvalid,sizeof(pint),[]);
             tmpref.index:=hreg;
             tmpref.index:=hreg;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             helplist.concat(spilling_create_store(tempreg,tmpref));

+ 2 - 2
compiler/avr/cgcpu.pas

@@ -194,7 +194,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,paraloc^.reference.temppos,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
@@ -348,7 +348,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,location^.reference.temppos,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)

+ 1 - 1
compiler/avr/raavrgas.pas

@@ -518,7 +518,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,ctempposinvalid,1,[]);
 
 
                   { add a constant expression? }
                   { add a constant expression? }
                   if actasmtoken=AS_PLUS then
                   if actasmtoken=AS_PLUS then

+ 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,cg.GetNextReg(spilltemp.base)));
             helplist.concat(taicpu.op_reg_reg(A_ADC,NR_R27,cg.GetNextReg(spilltemp.base)));
 
 
-            reference_reset_base(tmpref,NR_R26,0,1,[]);
+            reference_reset_base(tmpref,NR_R26,0,spilltemp.temppos,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,cg.GetNextReg(spilltemp.base)));
             helplist.concat(taicpu.op_reg_reg(A_ADC,NR_R27,cg.GetNextReg(spilltemp.base)));
 
 
-            reference_reset_base(tmpref,NR_R26,0,1,[]);
+            reference_reset_base(tmpref,NR_R26,0,spilltemp.temppos,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;

+ 10 - 10
compiler/cgobj.pas

@@ -965,7 +965,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.location^.reference.temppos,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:
@@ -996,7 +996,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.location^.reference.temppos,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
@@ -1125,7 +1125,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,location^.reference.temppos,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)
@@ -1341,7 +1341,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,paraloc.reference.temppos,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
@@ -1409,7 +1409,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,paraloc.reference.temppos,align,[]);
                case getregtype(reg) of
                case getregtype(reg) of
                  R_ADDRESSREGISTER,
                  R_ADDRESSREGISTER,
                  R_INTREGISTER :
                  R_INTREGISTER :
@@ -1838,7 +1838,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.location^.reference.temppos,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:
@@ -1879,7 +1879,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.location^.reference.temppos,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;
@@ -2293,7 +2293,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.location^.reference.temppos,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:
@@ -2334,7 +2334,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.location^.next^.reference.temppos,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
@@ -2693,7 +2693,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),reference.temppos,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

+ 17 - 2
compiler/cgutils.pas

@@ -44,6 +44,12 @@ unit cgutils;
       tcpuregisterset = set of 0..maxcpuregister;
       tcpuregisterset = set of 0..maxcpuregister;
       tcpuregisterarray = array of tsuperregister;
       tcpuregisterarray = array of tsuperregister;
 
 
+      { use record for type-safety; should only be accessed directly by temp
+        manager }
+      treftemppos = record
+        val: asizeint;
+      end;
+
 {$packset 1}
 {$packset 1}
       { a reference may be volatile for reading, writing, or both. E.g., local variables
       { 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
         inside try-blocks are volatile for writes (writes must not be removed, because at
@@ -61,6 +67,7 @@ unit cgutils;
          offset      : asizeint;
          offset      : asizeint;
          symbol,
          symbol,
          relsymbol   : tasmsymbol;
          relsymbol   : tasmsymbol;
+         temppos     : treftemppos;
 {$if defined(x86)}
 {$if defined(x86)}
          segment,
          segment,
 {$endif defined(x86)}
 {$endif defined(x86)}
@@ -100,6 +107,10 @@ unit cgutils;
          alignment : byte;
          alignment : byte;
       end;
       end;
 
 
+   const
+     ctempposinvalid: treftemppos = (val: low(treftemppos.val));
+
+   type
       tsubsetregister = record
       tsubsetregister = record
         subsetreg : tregister;
         subsetreg : tregister;
         startbit, bitlen: byte;
         startbit, bitlen: byte;
@@ -178,7 +189,7 @@ unit cgutils;
     {# 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; volatility: tvolatilityset);
+    procedure reference_reset_base(var ref : treference;base : tregister;offset : longint; temppos : treftemppos; alignment : longint; volatility: tvolatilityset);
     procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;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.
@@ -226,14 +237,16 @@ uses
 {$endif arm}
 {$endif arm}
         ref.alignment:=alignment;
         ref.alignment:=alignment;
         ref.volatility:=volatility;
         ref.volatility:=volatility;
+        ref.temppos:=ctempposinvalid;
       end;
       end;
 
 
 
 
-    procedure reference_reset_base(var ref: treference; base: tregister; offset, alignment: longint; volatility: tvolatilityset);
+    procedure reference_reset_base(var ref: treference; base: tregister; offset : longint; temppos : treftemppos ; alignment : longint; volatility: tvolatilityset);
       begin
       begin
         reference_reset(ref,alignment,volatility);
         reference_reset(ref,alignment,volatility);
         ref.base:=base;
         ref.base:=base;
         ref.offset:=offset;
         ref.offset:=offset;
+        ref.temppos:=temppos;
       end;
       end;
 
 
 
 
@@ -242,6 +255,7 @@ uses
         reference_reset(ref,alignment,volatility);
         reference_reset(ref,alignment,volatility);
         ref.symbol:=sym;
         ref.symbol:=sym;
         ref.offset:=offset;
         ref.offset:=offset;
+        ref.temppos:=ctempposinvalid;
       end;
       end;
 
 
 
 
@@ -282,6 +296,7 @@ uses
 {$endif arm}
 {$endif arm}
       l.reference.alignment:=alignment;
       l.reference.alignment:=alignment;
       l.reference.volatility:=volatility;
       l.reference.volatility:=volatility;
+      l.reference.temppos:=ctempposinvalid;
     end;
     end;
 
 
 
 

+ 18 - 24
compiler/hlcgobj.pas

@@ -122,10 +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; volatility: tvolatilityset); virtual;
-
-          {# Returns a reference corresponding to a temp }
-          procedure temp_to_ref(p: ptemprecord; out ref: treference); virtual;
+          procedure reference_reset_base(var ref: treference; regsize: tdef; reg: tregister; offset: longint; temppos: treftemppos; alignment: longint; volatility: tvolatilityset); virtual;
 
 
           {# Emit a label to the instruction stream. }
           {# Emit a label to the instruction stream. }
           procedure a_label(list : TAsmList;l : tasmlabel); inline;
           procedure a_label(list : TAsmList;l : tasmlabel); inline;
@@ -842,16 +839,12 @@ 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; volatility: tvolatilityset);
+    reg: tregister; offset: longint; temppos: treftemppos; alignment: longint; volatility: tvolatilityset);
     begin
     begin
       reference_reset(ref,alignment,volatility);
       reference_reset(ref,alignment,volatility);
       ref.base:=reg;
       ref.base:=reg;
       ref.offset:=offset;
       ref.offset:=offset;
-    end;
-
-  procedure thlcgobj.temp_to_ref(p: ptemprecord; out ref: treference);
-    begin
-      reference_reset_base(ref,voidstackpointertype,current_procinfo.framepointer,p^.pos,p^.alignment,[]);
+      ref.temppos:=temppos;
     end;
     end;
 
 
   procedure thlcgobj.a_label(list: TAsmList; l: tasmlabel); inline;
   procedure thlcgobj.a_label(list: TAsmList; l: tasmlabel); inline;
@@ -892,7 +885,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.location^.reference.temppos,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 +915,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.location^.reference.temppos,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 +1046,7 @@ implementation
               begin
               begin
                  if assigned(location^.next) then
                  if assigned(location^.next) then
                    internalerror(2017073001);
                    internalerror(2017073001);
-                 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,location^.reference.temppos,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
@@ -2467,7 +2460,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.temppos,result.ref.alignment,[]);
         end;
         end;
       result.ref.index:=tmpreg;
       result.ref.index:=tmpreg;
       tmpreg:=getintregister(list,ptruinttype);
       tmpreg:=getintregister(list,ptruinttype);
@@ -2548,7 +2541,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.location^.reference.temppos,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:
@@ -2580,7 +2573,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.location^.reference.temppos,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;
@@ -2594,7 +2587,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.temppos,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
@@ -2690,7 +2683,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.location^.reference.temppos,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:
@@ -4155,7 +4148,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,ctempposinvalid,alignment,[]);
             end;
             end;
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE :
           LOC_CREFERENCE :
@@ -4163,7 +4156,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,ctempposinvalid,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
@@ -4604,7 +4597,8 @@ 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].location^.reference.temppos,
+          tparavarsym(vs).paraloc[calleeside].alignment,[]);
     end;
     end;
 
 
   procedure thlcgobj.gen_entry_code(list: TAsmList);
   procedure thlcgobj.gen_entry_code(list: TAsmList);
@@ -4668,7 +4662,7 @@ implementation
             assigned(hp^.def) and
             assigned(hp^.def) and
             is_managed_type(hp^.def) then
             is_managed_type(hp^.def) then
           begin
           begin
-            temp_to_ref(hp,href);
+            tg.temp_to_ref(hp,href);
             g_initialize(list,hp^.def,href);
             g_initialize(list,hp^.def,href);
           end;
           end;
          hp:=hp^.next;
          hp:=hp^.next;
@@ -4688,7 +4682,7 @@ implementation
             is_managed_type(hp^.def) then
             is_managed_type(hp^.def) then
           begin
           begin
             include(current_procinfo.flags,pi_needs_implicit_finally);
             include(current_procinfo.flags,pi_needs_implicit_finally);
-            temp_to_ref(hp,href);
+            tg.temp_to_ref(hp,href);
             g_finalize(list,hp^.def,href);
             g_finalize(list,hp^.def,href);
           end;
           end;
          hp:=hp^.next;
          hp:=hp^.next;
@@ -5161,7 +5155,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.location^.reference.temppos,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

+ 2 - 2
compiler/i386/cgcpu.pas

@@ -187,7 +187,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,ctempposinvalid,4,[]);
                 g_concatcopy(list,r,href,len);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -300,7 +300,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,ctempposinvalid,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,ctempposinvalid,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.location^.reference.temppos,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,ctempposinvalid,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.location^.reference.temppos,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.location^.reference.temppos,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,ctempposinvalid,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,ctempposinvalid,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),ctempposinvalid,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),ctempposinvalid,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,ctempposinvalid,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));

+ 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,ctempposinvalid,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,ctempposinvalid,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);

+ 6 - 6
compiler/i8086/cgcpu.pas

@@ -1285,7 +1285,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,paraloc^.reference.temppos,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
@@ -1478,7 +1478,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,ctempposinvalid,4,[]);
                 g_concatcopy(list,r,href,len);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -2354,7 +2354,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,ctempposinvalid,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;
@@ -2722,16 +2722,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,reference.temppos,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,reference.temppos,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,reference.temppos,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;

+ 15 - 14
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; volatility: tvolatilityset); override;
+      procedure reference_reset_base(var ref: treference; regsize: tdef; reg: tregister; offset: longint; temppos: treftemppos; 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,ctempposinvalid,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.location^.reference.temppos,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,ctempposinvalid,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.location^.reference.temppos,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.Location^.reference.temppos,cgpara.alignment,[]);
                       cg.g_concatcopy(list,l.reference,href,stacksize);
                       cg.g_concatcopy(list,l.reference,href,stacksize);
                     end;
                     end;
                 end;
                 end;
@@ -266,7 +266,8 @@ 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; volatility: tvolatilityset);
+    reg: tregister; offset: longint; temppos: treftemppos; alignment: longint;
+    volatility: tvolatilityset);
     begin
     begin
       inherited;
       inherited;
 
 
@@ -519,7 +520,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,ctempposinvalid,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 +541,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,ctempposinvalid,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,ctempposinvalid,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 +567,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,ctempposinvalid,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),ctempposinvalid,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 +626,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,ctempposinvalid,2,[])
           else
           else
-            reference_reset_base(href,voidnearpointertype,NR_DI,4,2,[]);
+            reference_reset_base(href,voidnearpointertype,NR_DI,4,ctempposinvalid,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));

+ 1 - 1
compiler/i8086/n8086ld.pas

@@ -173,7 +173,7 @@ implementation
               reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname,AT_DATA),sizeof(pint),2,[]);
               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,ctempposinvalid,location.reference.alignment,[]);
           end
           end
         else
         else
           inherited generate_threadvar_access(gvs);
           inherited generate_threadvar_access(gvs);

+ 5 - 5
compiler/jvm/hlcgcpu.pas

@@ -1033,7 +1033,7 @@ implementation
               end;
               end;
             art_indexref:
             art_indexref:
               begin
               begin
-                cgutils.reference_reset_base(href,ref.indexbase,ref.indexoffset,4,ref.volatility);
+                cgutils.reference_reset_base(href,ref.indexbase,ref.indexoffset,ref.temppos,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;
@@ -1791,7 +1791,7 @@ implementation
               { 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,ref.volatility);
               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);
+              cgutils.reference_reset_base(tmploc.reference,getaddressregister(list,java_jlobject),0,tmploc.reference.temppos,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);
@@ -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,ctempposinvalid,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,ctempposinvalid,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
@@ -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,ctempposinvalid,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/njvmcnv.pas

@@ -831,7 +831,7 @@ 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,ctempposinvalid,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);

+ 1 - 1
compiler/jvm/njvmld.pas

@@ -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,ctempposinvalid,1,[]);
     ref.arrayreftype:=art_indexconst;
     ref.arrayreftype:=art_indexconst;
     ref.indexoffset:=0;
     ref.indexoffset:=0;
   end;
   end;

+ 1 - 1
compiler/jvm/njvmmem.pas

@@ -121,7 +121,7 @@ implementation
               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,[]);
             location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),4,[]);
-            reference_reset_base(location.reference,left.location.register,0,4,[]);
+            reference_reset_base(location.reference,left.location.register,0,ctempposinvalid,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

+ 12 - 22
compiler/llvm/hlcgllvm.pas

@@ -39,8 +39,6 @@ uses
     thlcgllvm = class(thlcgobj)
     thlcgllvm = class(thlcgobj)
       constructor create;
       constructor create;
 
 
-      procedure temp_to_ref(p: ptemprecord; out ref: treference); override;
-
       procedure a_load_ref_cgpara(list: TAsmList; size: tdef; const r: treference; const cgpara: TCGPara); override;
       procedure a_load_ref_cgpara(list: TAsmList; size: tdef; const r: treference; const cgpara: TCGPara); override;
       procedure a_load_const_cgpara(list: TAsmList; tosize: tdef; a: tcgint; const cgpara: TCGPara); override;
       procedure a_load_const_cgpara(list: TAsmList; tosize: tdef; a: tcgint; const cgpara: TCGPara); override;
      protected
      protected
@@ -188,14 +186,6 @@ implementation
     end;
     end;
 
 
 
 
-  procedure thlcgllvm.temp_to_ref(p: ptemprecord; out ref: treference);
-    begin
-      { on the LLVM target, every temp is independent and encoded via a
-        separate temp register whose superregister number is stored in p^.pos }
-      reference_reset_base(ref,voidstackpointertype,newreg(R_TEMPREGISTER,p^.pos,R_SUBWHOLE),0,p^.alignment,[]);
-    end;
-
-
   procedure thlcgllvm.a_load_ref_cgpara(list: TAsmList; size: tdef; const r: treference; const cgpara: TCGPara);
   procedure thlcgllvm.a_load_ref_cgpara(list: TAsmList; size: tdef; const r: treference; const cgpara: TCGPara);
     var
     var
       tmpref, initialref, ref: treference;
       tmpref, initialref, ref: treference;
@@ -252,7 +242,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,location^.reference.temppos,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 +307,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,initialref.volatility);
+          reference_reset_base(newref,cpointerdef.getreusable(newrefsize),reg,0,initialref.temppos,initialref.alignment,initialref.volatility);
           refsize:=newrefsize;
           refsize:=newrefsize;
         end
         end
       else
       else
@@ -468,7 +458,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^.reference.temppos, 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 +611,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,tmpref.volatility);
+                  reference_reset_base(sref,cpointerdef.getreusable(tosize),hreg,0,tmpref.temppos,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 +633,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,sref.volatility);
+              reference_reset_base(sref,cpointerdef.getreusable(fromsize),hreg2,0,sref.temppos,sref.alignment,sref.volatility);
               tosize:=fromsize;
               tosize:=fromsize;
             end;
             end;
         end
         end
@@ -1418,7 +1408,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,ref.volatility);
+      reference_reset_base(ref,todef,hreg,0,ref.temppos,ref.alignment,ref.volatility);
     end;
     end;
 
 
 
 
@@ -1455,7 +1445,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),recref.volatility);
+          reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,recref.temppos,newalignment(recref.alignment,field.fieldoffset),recref.volatility);
           { go to the parent }
           { go to the parent }
           currentstructdef:=parentdef;
           currentstructdef:=parentdef;
         end;
         end;
@@ -1469,7 +1459,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),recref.volatility);
+      reference_reset_base(recref,subscriptdef,newbase,field.offsetfromllvmfield,recref.temppos,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 +1666,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,destloc.reference.volatility);
+              reference_reset_base(href,cpointerdef.getreusable(llvmparadef),hreg,0,destloc.reference.temppos,destloc.reference.alignment,destloc.reference.volatility);
             end;
             end;
           index:=0;
           index:=0;
           ploc:=para.location;
           ploc:=para.location;
@@ -1848,9 +1838,9 @@ implementation
           if assigned(ref.symbol) then
           if assigned(ref.symbol) then
             reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment,ref.volatility)
             reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment,ref.volatility)
           else
           else
-            reference_reset_base(tmpref,ptrdef,ref.base,0,ref.alignment,ref.volatility);
+            reference_reset_base(tmpref,ptrdef,ref.base,0,ref.temppos,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,ref.volatility);
+          reference_reset_base(result,ptrdef,hreg2,0,ref.temppos,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
@@ -1890,7 +1880,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,ref.volatility);
+      reference_reset_base(result,ptrdef,hreg2,0,ref.temppos,ref.alignment,ref.volatility);
     end;
     end;
 
 
 
 

+ 2 - 2
compiler/llvm/nllvmcnv.pas

@@ -146,7 +146,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,location.reference.volatility);
+    reference_reset_base(location.reference,hreg,0,location.reference.temppos,location.reference.alignment,location.reference.volatility);
   end;
   end;
 
 
 
 
@@ -284,7 +284,7 @@ procedure tllvmtypeconvnode.second_nothing;
         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,left.location.reference.volatility);
         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);
+        reference_reset_base(location.reference,hreg,0,location.reference.temppos,location.reference.alignment,location.reference.volatility);
       end
       end
     else
     else
       location_copy(location,left.location);
       location_copy(location,left.location);

+ 1 - 1
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,location.reference.volatility);
+            hlcg.reference_reset_base(location.reference,resptrdef,hreg,0,location.reference.temppos,location.reference.alignment,location.reference.volatility);
           end;
           end;
       end;
       end;
 
 

+ 2 - 2
compiler/llvm/nllvminl.pas

@@ -187,7 +187,7 @@ implementation
            location_reset_ref(location,left.location.loc,def_cgsize(resultdef),left.location.reference.alignment,left.location.reference.volatility);
            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,left.location.reference.volatility);
+           hlcg.reference_reset_base(location.reference,cpointerdef.getreusable(resultdef),hregister,0,left.location.reference.temppos,left.location.reference.alignment,left.location.reference.volatility);
          end
          end
         else
         else
          begin
          begin
@@ -205,7 +205,7 @@ implementation
            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);
            { volatility of the ansistring/widestring refers to the volatility of the
            { volatility of the ansistring/widestring refers to the volatility of the
              string pointer, not of the string data }
              string pointer, not of the string data }
-           hlcg.reference_reset_base(href,cpointerdef.getreusable(lendef),left.location.register,-lendef.size,lendef.alignment,[]);
+           hlcg.reference_reset_base(href,cpointerdef.getreusable(lendef),left.location.register,-lendef.size,ctempposinvalid,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

@@ -131,7 +131,7 @@ procedure tllvmloadnode.pass_generate_code;
           current_asmdata.CurrAsmList.concat(
           current_asmdata.CurrAsmList.concat(
             taillvm.op_reg_tai_size(la_bitcast,selfreg,ai,voidcodepointertype)
             taillvm.op_reg_tai_size(la_bitcast,selfreg,ai,voidcodepointertype)
           );
           );
-          reference_reset_base(location.reference,selfreg,0,location.reference.alignment,location.reference.volatility);
+          reference_reset_base(location.reference,selfreg,0,ctempposinvalid,location.reference.alignment,location.reference.volatility);
         end;
         end;
     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,location.reference.volatility);
+            reference_reset_base(location.reference,newbase,0,location.reference.temppos,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,locref^.volatility);
+          reference_reset_base(locref^,hreg,0,locref^.temppos,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,location.reference.volatility);
+      reference_reset_base(location.reference,hreg,0,location.reference.temppos,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,sref.ref.volatility);
+      reference_reset_base(sref.ref,basereg,0,sref.ref.temppos,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);

+ 12 - 1
compiler/llvm/tgllvm.pas

@@ -64,6 +64,7 @@ unit tgllvm;
         destructor destroy; override;
         destructor destroy; override;
         procedure setfirsttemp(l: asizeint); override;
         procedure setfirsttemp(l: asizeint); override;
         function istemp(const ref: treference): boolean; override;
         function istemp(const ref: treference): boolean; override;
+        procedure temp_to_ref(p: ptemprecord; out ref: treference); override;
         procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference); override;
         procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference); override;
         procedure gethltemp(list: TAsmList; def: tdef; forcesize: asizeint; temptype: ttemptype; out ref: treference); override;
         procedure gethltemp(list: TAsmList; def: tdef; forcesize: asizeint; temptype: ttemptype; out ref: treference); override;
         procedure ungetiftemp(list: TAsmList; const ref: treference); override;
         procedure ungetiftemp(list: TAsmList; const ref: treference); override;
@@ -90,9 +91,10 @@ implementation
     procedure ttgllvm.alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference);
     procedure ttgllvm.alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference);
       var
       var
         tl: ptemprecord;
         tl: ptemprecord;
+        reg: tregister;
         oldfileinfo: tfileposinfo;
         oldfileinfo: tfileposinfo;
       begin
       begin
-        reference_reset_base(ref,cg.gettempregister(list),0,alignment,[]);
+        reg:=cg.gettempregister(list);
         new(tl);
         new(tl);
 
 
         tl^.temptype:=temptype;
         tl^.temptype:=temptype;
@@ -104,6 +106,7 @@ implementation
         tl^.next:=templist;
         tl^.next:=templist;
         tl^.nextfree:=nil;
         tl^.nextfree:=nil;
         templist:=tl;
         templist:=tl;
+        temp_to_ref(tl,ref);
         list.concat(tai_tempalloc.alloc(tl^.pos,tl^.size));
         list.concat(tai_tempalloc.alloc(tl^.pos,tl^.size));
         { TODO: add llvm.lifetime.start() for this allocation and afterwards
         { TODO: add llvm.lifetime.start() for this allocation and afterwards
             llvm.lifetime.end() for freetemp (if the llvm version supports it) }
             llvm.lifetime.end() for freetemp (if the llvm version supports it) }
@@ -141,6 +144,14 @@ implementation
       end;
       end;
 
 
 
 
+    procedure ttgllvm.temp_to_ref(p: ptemprecord; out ref: treference);
+      begin
+        { on the LLVM target, every temp is independent and encoded via a
+          separate temp register whose superregister number is stored in p^.pos }
+        reference_reset_base(ref,voidstackpointertype,newreg(R_TEMPREGISTER,p^.pos,R_SUBWHOLE),0,p^.alignment,[]);
+      end;
+
+
     constructor ttgllvm.create;
     constructor ttgllvm.create;
       begin
       begin
         inherited create;
         inherited create;

+ 2 - 2
compiler/m68k/aoptcpu.pas

@@ -291,9 +291,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,ctempposinvalid,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,ctempposinvalid,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;

+ 20 - 20
compiler/m68k/cgcpu.pas

@@ -302,7 +302,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, ctempposinvalid ,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
@@ -324,7 +324,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, ctempposinvalid, 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
@@ -365,7 +365,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, ctempposinvalid, 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);
@@ -389,7 +389,7 @@ unit cgcpu;
                 ofs:=0;
                 ofs:=0;
                 if (cgpara.intsize<cgpara.alignment) then
                 if (cgpara.intsize<cgpara.alignment) then
                   ofs:=cgpara.alignment-cgpara.intsize;
                   ofs:=cgpara.alignment-cgpara.intsize;
-                reference_reset_base(href,NR_STACK_POINTER_REG,ofs,cgpara.alignment,[]);
+                reference_reset_base(href,NR_STACK_POINTER_REG,ofs,ctempposinvalid,cgpara.alignment,[]);
                 g_concatcopy(list,r,href,cgpara.intsize);
                 g_concatcopy(list,r,href,cgpara.intsize);
               end
               end
             else
             else
@@ -485,7 +485,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,ref.volatility);
+                 reference_reset_base(href,ref.index,0,ref.temppos,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
@@ -523,7 +523,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,ref.volatility);
+                     reference_reset_base(href,ref.base,ref.offset,ref.temppos,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
@@ -637,13 +637,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,ctempposinvalid,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,ctempposinvalid,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);
@@ -812,7 +812,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,ref.volatility);
+        reference_reset_base(tmpref,tmpreg2,0,ctempposinvalid,1,ref.volatility);
         tmpref.direction:=dir_none;
         tmpref.direction:=dir_none;
 
 
         tmpreg:=getintregister(list,tosize);
         tmpreg:=getintregister(list,tosize);
@@ -991,7 +991,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,ref.volatility);
+        reference_reset_base(tmpref,tmpreg2,0,ctempposinvalid,1,ref.volatility);
         tmpref.direction:=dir_inc;
         tmpref.direction:=dir_inc;
 
 
         if isaddressregister(register) then
         if isaddressregister(register) then
@@ -1084,7 +1084,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, ctempposinvalid, 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
@@ -1118,7 +1118,7 @@ unit cgcpu;
             begin
             begin
               //list.concat(tai_comment.create(strpnew('a_loadfpu_ref_cgpara copy')));
               //list.concat(tai_comment.create(strpnew('a_loadfpu_ref_cgpara copy')));
               cgpara.check_simple_location;
               cgpara.check_simple_location;
-              reference_reset_base(href, NR_STACK_POINTER_REG, 0, cgpara.alignment, []);
+              reference_reset_base(href, NR_STACK_POINTER_REG, 0, ctempposinvalid, cgpara.alignment, []);
               href.direction := dir_dec;
               href.direction := dir_dec;
               case size of
               case size of
                 OS_F64:
                 OS_F64:
@@ -1738,12 +1738,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,source.volatility);
+         reference_reset_base(srcref,iregister,0,source.temppos,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,dest.volatility);
+         reference_reset_base(dstref,jregister,0,dest.temppos,dest.alignment,dest.volatility);
          dstrefp:=dstref;
          dstrefp:=dstref;
          dstrefp.direction := dir_inc;
          dstrefp.direction := dir_inc;
 
 
@@ -1900,7 +1900,7 @@ unit cgcpu;
 
 
                     hregister:=NR_A1;
                     hregister:=NR_A1;
                     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,ctempposinvalid,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     }
@@ -1915,11 +1915,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,ctempposinvalid,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,ctempposinvalid,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
@@ -2025,7 +2025,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,ctempposinvalid,sizeof(pint),[]);
               end;
               end;
 
 
             if size > 0 then
             if size > 0 then
@@ -2119,7 +2119,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,ctempposinvalid,sizeof(pint),[]);
           end;
           end;
 
 
         if size > 0 then
         if size > 0 then
@@ -2286,7 +2286,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),ctempposinvalid,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) }

+ 8 - 8
compiler/m68k/hlcgcpu.pas

@@ -122,7 +122,7 @@ implementation
         href: treference;
         href: treference;
       begin
       begin
         { move a0 which is self out of the way to the stack }
         { move a0 which is self out of the way to the stack }
-        reference_reset_base(href,voidpointertype,NR_STACK_POINTER_REG,offs,4,[]);
+        reference_reset_base(href,voidpointertype,NR_STACK_POINTER_REG,offs,ctempposinvalid,4,[]);
         list.concat(taicpu.op_reg_ref(A_MOVE,S_L,NR_A0,href));
         list.concat(taicpu.op_reg_ref(A_MOVE,S_L,NR_A0,href));
       end;
       end;
 
 
@@ -138,7 +138,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,ctempposinvalid,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;
 
 
@@ -147,7 +147,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,ctempposinvalid,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;
 
 
@@ -158,7 +158,7 @@ implementation
       begin
       begin
         if (procdef.extnumber=$ffff) then
         if (procdef.extnumber=$ffff) then
           internalerror(2017061401);
           internalerror(2017061401);
-        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),ctempposinvalid,4,[]);
 
 
         { handle-too-large-for-68k offsets }
         { handle-too-large-for-68k offsets }
         { I'm not even sure this is handled elsewhere in the compiler for VMTs, but lets play safe... (KB) }
         { I'm not even sure this is handled elsewhere in the compiler for VMTs, but lets play safe... (KB) }
@@ -169,12 +169,12 @@ implementation
           end;
           end;
 
 
         { push the method address to the stack }
         { push the method address to the stack }
-        reference_reset_base(href2,voidpointertype,NR_STACK_POINTER_REG,0,4,[]);
+        reference_reset_base(href2,voidpointertype,NR_STACK_POINTER_REG,0,ctempposinvalid,4,[]);
         href2.direction:=dir_dec;
         href2.direction:=dir_dec;
         list.concat(taicpu.op_ref_ref(A_MOVE,S_L,href,href2));
         list.concat(taicpu.op_ref_ref(A_MOVE,S_L,href,href2));
 
 
         { restore A0 from the stack }
         { restore A0 from the stack }
-        reference_reset_base(href2,voidpointertype,NR_STACK_POINTER_REG,offs+4,4,[]); { offs+4, because we used dir_dec above }
+        reference_reset_base(href2,voidpointertype,NR_STACK_POINTER_REG,offs+4,ctempposinvalid,4,[]); { offs+4, because we used dir_dec above }
         list.concat(taicpu.op_ref_reg(A_MOVE,S_L,href2,NR_A0));
         list.concat(taicpu.op_ref_reg(A_MOVE,S_L,href2,NR_A0));
 
 
         { pop the method address from the stack, and jump to it }
         { pop the method address from the stack, and jump to it }
@@ -187,9 +187,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),ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,location.reference.volatility);
+            reference_reset_base(location.reference,hreg,0,location.reference.temppos,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,spilltemp.temppos,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,spilltemp.temppos,sizeof(aint),[]);
             tmpref.index:=hreg;
             tmpref.index:=hreg;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             helplist.concat(spilling_create_store(tempreg,tmpref));

+ 1 - 1
compiler/mips/cgcpu.pas

@@ -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.location^.reference.temppos,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;

+ 2 - 2
compiler/mips/hlcgcpu.pas

@@ -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,ctempposinvalid,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), ctempposinvalid, 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

+ 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,spilltemp.temppos,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,spilltemp.temppos,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

+ 3 - 3
compiler/ncgbas.pas

@@ -166,7 +166,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),[]);
+                            sym.localloc.reference.temppos,newalignment(sym.localloc.reference.alignment,sofs),[]);
 {$ifdef x86}
 {$ifdef x86}
                           op.ref^.segment:=segment;
                           op.ref^.segment:=segment;
 {$endif x86}
 {$endif x86}
@@ -177,7 +177,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),[]);
+                        sym.localloc.reference.temppos,newalignment(sym.localloc.reference.alignment,sofs),[]);
                       op.ref^.index:=indexreg;
                       op.ref^.index:=indexreg;
 {$ifdef x86}
 {$ifdef x86}
                       op.ref^.segment:=segment;
                       op.ref^.segment:=segment;
@@ -201,7 +201,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,ctempposinvalid,1,[]);
                       op.ref^.index:=indexreg;
                       op.ref^.index:=indexreg;
 {$ifdef x86}
 {$ifdef x86}
                       op.ref^.scalefactor:=scale;
                       op.ref^.scalefactor:=scale;

+ 6 - 6
compiler/ncgcal.pas

@@ -457,12 +457,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,ctempposinvalid,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,ctempposinvalid,sizeof(pint),[]);
               cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,reg);
               cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,tmpref,reg);
-              reference_reset_base(tmpref,reg,-tprocdef(procdefinition).extnumber,sizeof(pint),[]);
+              reference_reset_base(tmpref,reg,-tprocdef(procdefinition).extnumber,ctempposinvalid,sizeof(pint),[]);
             end;
             end;
           else
           else
             begin
             begin
@@ -500,7 +500,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,ctempposinvalid,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);
@@ -798,12 +798,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,callerparaloc^.reference.temppos,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,tmpparaloc^.reference.temppos,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

+ 2 - 2
compiler/ncgcnv.pas

@@ -388,7 +388,7 @@ interface
                 end
                 end
               else
               else
             {$endif}
             {$endif}
-                hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment,location.reference.volatility);
+                hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,ctempposinvalid,location.reference.alignment,location.reference.volatility);
             end;
             end;
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE,
           LOC_CREFERENCE,
@@ -399,7 +399,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,ctempposinvalid,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

+ 3 - 3
compiler/ncginl.pas

@@ -275,7 +275,7 @@ implementation
              lendef:=ossinttype;
              lendef:=ossinttype;
            { volatility of the ansistring/widestring refers to the volatility of the
            { volatility of the ansistring/widestring refers to the volatility of the
              string pointer, not of the string data }
              string pointer, not of the string data }
-           hlcg.reference_reset_base(href,left.resultdef,left.location.register,-lendef.size,lendef.alignment,[]);
+           hlcg.reference_reset_base(href,left.resultdef,left.location.register,-lendef.size,ctempposinvalid,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 }
@@ -764,14 +764,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,ctempposinvalid,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),ctempposinvalid,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;

+ 9 - 9
compiler/ncgld.pas

@@ -244,7 +244,7 @@ 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,lvs.localloc.reference.volatility);
+        hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,lvs.localloc.reference.offset,lvs.localloc.reference.temppos,lvs.localloc.reference.alignment,lvs.localloc.reference.volatility);
       end;
       end;
 
 
 
 
@@ -345,7 +345,7 @@ implementation
                tv_rec,
                tv_rec,
                tfieldvarsym(tv_index_field),href);
                tfieldvarsym(tv_index_field),href);
              if size_opt then
              if size_opt then
-               hlcg.reference_reset_base(href,tfieldvarsym(tv_index_field).vardef,hreg_tv_rec,href.offset,href.alignment,[]);
+               hlcg.reference_reset_base(href,tfieldvarsym(tv_index_field).vardef,hreg_tv_rec,href.offset,href.temppos,href.alignment,[]);
              hlcg.a_load_ref_cgpara(current_asmdata.CurrAsmList,tfieldvarsym(tv_index_field).vardef,href,paraloc1);
              hlcg.a_load_ref_cgpara(current_asmdata.CurrAsmList,tfieldvarsym(tv_index_field).vardef,href,paraloc1);
              { Dealloc the threadvar record register before calling the helper function to allow  }
              { Dealloc the threadvar record register before calling the helper function to allow  }
              { the register allocator to assign non-mandatory real registers for hreg_tv_rec. }
              { the register allocator to assign non-mandatory real registers for hreg_tv_rec. }
@@ -378,11 +378,11 @@ implementation
              { load in the same "hregister" as above, so after this sequence
              { load in the same "hregister" as above, so after this sequence
                the address of the threadvar is always in hregister }
                the address of the threadvar is always in hregister }
              if size_opt then
              if size_opt then
-               hlcg.reference_reset_base(href,fieldptrdef,hreg_tv_rec,href.offset,href.alignment,[]);
+               hlcg.reference_reset_base(href,fieldptrdef,hreg_tv_rec,href.offset,href.temppos,href.alignment,[]);
              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,resultdef.alignment,[]);
+             hlcg.reference_reset_base(location.reference,fieldptrdef,hregister,0,ctempposinvalid,resultdef.alignment,[]);
            end;
            end;
        end;
        end;
 
 
@@ -474,7 +474,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,ctempposinvalid,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
@@ -530,7 +530,7 @@ implementation
                       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,[]);
                       location_reset_ref(location,LOC_REFERENCE,newsize,1,[]);
-                    hlcg.reference_reset_base(location.reference,voidpointertype,hregister,0,location.reference.alignment,[]);
+                    hlcg.reference_reset_base(location.reference,voidpointertype,hregister,0,ctempposinvalid,location.reference.alignment,[]);
                   end;
                   end;
 
 
                 { make const a LOC_CREFERENCE }
                 { make const a LOC_CREFERENCE }
@@ -607,7 +607,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,ctempposinvalid,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);
@@ -623,7 +623,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,ctempposinvalid,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);
@@ -633,7 +633,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,ctempposinvalid,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);

+ 9 - 9
compiler/ncgmem.pas

@@ -192,7 +192,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,ctempposinvalid,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;
@@ -372,7 +372,7 @@ implementation
                           end
                           end
                         else
                         else
                       {$endif}
                       {$endif}
-                          hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,location.reference.alignment,location.reference.volatility);
+                          hlcg.reference_reset_base(location.reference,left.resultdef,left.location.register,0,ctempposinvalid,location.reference.alignment,location.reference.volatility);
                       end;
                       end;
                     LOC_CREFERENCE,
                     LOC_CREFERENCE,
                     LOC_REFERENCE,
                     LOC_REFERENCE,
@@ -383,7 +383,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,location.reference.volatility);
+                           hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef),0,ctempposinvalid,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:
@@ -667,7 +667,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,location.reference.volatility);
+            reference_reset_base(location.reference,hreg,0,location.reference.temppos,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;
@@ -901,17 +901,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,location.reference.alignment,[]);
                   end;
                   end;
                 else
                 else
                   internalerror(2002032218);
                   internalerror(2002032218);
@@ -933,11 +933,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,ctempposinvalid,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,ctempposinvalid,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;

+ 2 - 2
compiler/ncgutil.pas

@@ -805,7 +805,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,paraloc^.reference.temppos,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;
@@ -936,7 +936,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,paraloc^.reference.temppos,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;

+ 6 - 1
compiler/parabase.pas

@@ -35,7 +35,12 @@ unit parabase;
     type
     type
        TCGParaReference = record
        TCGParaReference = record
           index       : tregister;
           index       : tregister;
-          offset      : aint;
+          { right now, the initial offset and the temppos of a para reference
+            is always the same; use separate names in case this would ever
+            change, or be different for a particular platform }
+          case byte of
+            0: (offset      : asizeint);
+            1: (temppos     : treftemppos);
        end;
        end;
 
 
        PCGParaLocation = ^TCGParaLocation;
        PCGParaLocation = ^TCGParaLocation;

+ 1 - 0
compiler/paramgr.pas

@@ -425,6 +425,7 @@ implementation
                       fillchar(href,sizeof(href),0);
                       fillchar(href,sizeof(href),0);
                       href.base:=paraloc^.reference.index;
                       href.base:=paraloc^.reference.index;
                       href.offset:=paraloc^.reference.offset;
                       href.offset:=paraloc^.reference.offset;
+                      href.temppos:=paraloc^.reference.temppos;
                       tg.ungetiftemp(list,href);
                       tg.ungetiftemp(list,href);
                     end;
                     end;
                 end;
                 end;

+ 26 - 26
compiler/powerpc/cgcpu.pas

@@ -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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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);
                 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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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);
@@ -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, ctempposinvalid, 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,ctempposinvalid,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, ctempposinvalid, 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, ctempposinvalid, 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,ctempposinvalid,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, ctempposinvalid, 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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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,ctempposinvalid,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 }

+ 2 - 2
compiler/powerpc/nppccal.pas

@@ -89,7 +89,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,ctempposinvalid,sizeof(pint),[]);
               do_call_ref(tmpref);
               do_call_ref(tmpref);
             end;
             end;
           system_powerpc_morphos:
           system_powerpc_morphos:
@@ -110,7 +110,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,ctempposinvalid,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);

+ 12 - 12
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, ctempposinvalid, 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, ctempposinvalid, 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], ctempposinvalid, 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], ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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;
@@ -1242,10 +1242,10 @@ begin
   if (not nostackframe) and (localsize > 0) and
   if (not nostackframe) and (localsize > 0) and
      tcpuprocinfo(current_procinfo).needstackframe then begin
      tcpuprocinfo(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, ctempposinvalid, 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, ctempposinvalid, 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], ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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)

+ 5 - 5
compiler/ppcgen/cgppc.pas

@@ -495,21 +495,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,ctempposinvalid,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,ctempposinvalid,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),ctempposinvalid,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);
@@ -517,7 +517,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,ctempposinvalid,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
@@ -538,7 +538,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,ctempposinvalid,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);

+ 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,ctempposinvalid,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),ctempposinvalid,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, ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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, ctempposinvalid, 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/ngppcset.pas

@@ -121,7 +121,7 @@ implementation
 
 
         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,href.temppos,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 }

+ 1 - 1
compiler/sparc64/cgcpu.pas

@@ -143,7 +143,7 @@ interface
               begin
               begin
                 hreg1:=getintregister(list,OS_ADDR);
                 hreg1:=getintregister(list,OS_ADDR);
                 a_loadaddr_ref_reg(list,href,hreg1);
                 a_loadaddr_ref_reg(list,href,hreg1);
-                reference_reset_base(href,hreg1,0,href.alignment,href.volatility);
+                reference_reset_base(href,hreg1,0,href.temppos,href.alignment,href.volatility);
               end;
               end;
             inc(href.offset,4);
             inc(href.offset,4);
             a_load_reg_ref(list,OS_32,OS_32,register,href);
             a_load_reg_ref(list,OS_32,OS_32,register,href);

+ 2 - 3
compiler/sparc64/tgcpu.pas

@@ -33,8 +33,7 @@ unit tgcpu;
 
 
     type
     type
       ttgsparc64 = class(ttgobj)
       ttgsparc64 = class(ttgobj)
-      protected
-        procedure alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference);override;
+        procedure temp_to_ref(p: ptemprecord; out ref: treference); override;
       end;
       end;
 
 
 implementation
 implementation
@@ -42,7 +41,7 @@ implementation
 uses
 uses
   cpubase;
   cpubase;
 
 
-procedure ttgsparc64.alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference);
+procedure ttgsparc64.temp_to_ref(p: ptemprecord; out ref: treference);
   begin
   begin
     inherited;
     inherited;
     inc(ref.offset,STACK_BIAS);
     inc(ref.offset,STACK_BIAS);

+ 5 - 6
compiler/sparcgen/cgsparc.pas

@@ -212,7 +212,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,href.temppos,sizeof(pint),[]);
                 href.index:=current_procinfo.got;
                 href.index:=current_procinfo.got;
               end
               end
             else
             else
@@ -338,8 +338,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,[]);
+                  reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,hloc^.reference.temppos,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]);
 
 
@@ -539,7 +538,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,ctempposinvalid,sizeof(pint),[]);
                 href.index:=current_procinfo.got;
                 href.index:=current_procinfo.got;
               end
               end
             else
             else
@@ -1157,14 +1156,14 @@ implementation
               src:=source
               src:=source
             else
             else
               begin
               begin
-                reference_reset_base(src,getintregister(list,OS_ADDR),0,sizeof(aint),source.volatility);
+                reference_reset_base(src,getintregister(list,OS_ADDR),0,source.temppos,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),dest.volatility);
+                reference_reset_base(dst,getintregister(list,OS_ADDR),0,dest.temppos,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 }

+ 2 - 14
compiler/sparcgen/hlcgcpu.pas

@@ -40,9 +40,6 @@ interface
     thlcgcpu = class(thlcg2ll)
     thlcgcpu = class(thlcg2ll)
      procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
      procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
      procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
      procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
-{$ifdef SPARC64}
-     procedure temp_to_ref(p: ptemprecord; out ref: treference);override;
-{$endif SPARC64}
     end;
     end;
 
 
   procedure create_hlcodegen;
   procedure create_hlcodegen;
@@ -114,10 +111,10 @@ implementation
           if (procdef.extnumber=$ffff) then
           if (procdef.extnumber=$ffff) then
             Internalerror(200006139);
             Internalerror(200006139);
           { load vmt }
           { load vmt }
-          reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(pint),[]);
+          reference_reset_base(href,voidpointertype,paraloc^.register,0,ctempposinvalid,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 to method }
           { jmp to method }
-          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),ctempposinvalid,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);
           list.concat(taicpu.op_reg(A_JMP,NR_G1));
           list.concat(taicpu.op_reg(A_JMP,NR_G1));
           { Delay slot }
           { Delay slot }
@@ -138,15 +135,6 @@ implementation
     end;
     end;
 
 
 
 
-{$ifdef SPARC64}
-  procedure thlcgcpu.temp_to_ref(p : ptemprecord; out ref : treference);
-    begin
-      inherited;
-      inc(ref.offset,STACK_BIAS);
-    end;
-{$endif SPARC64}
-
-
   procedure create_hlcodegen;
   procedure create_hlcodegen;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;

+ 1 - 1
compiler/sparcgen/ncpuset.pas

@@ -142,7 +142,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,ctempposinvalid,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;

+ 2 - 2
compiler/sparcgen/rgcpu.pas

@@ -123,7 +123,7 @@ implementation
               Internalerror(2017090901);
               Internalerror(2017090901);
 {$endif SPARC}
 {$endif SPARC}
 
 
-            reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
+            reference_reset_base(tmpref,hreg,0,spilltemp.temppos,sizeof(aint),[]);
             tmpref.index:=spilltemp.base;
             tmpref.index:=spilltemp.base;
 
 
             helpins:=spilling_create_load(tmpref,tempreg);
             helpins:=spilling_create_load(tmpref,tempreg);
@@ -170,7 +170,7 @@ implementation
               Internalerror(2017090901);
               Internalerror(2017090901);
 {$endif SPARC}
 {$endif SPARC}
 
 
-            reference_reset_base(tmpref,hreg,0,sizeof(aint),[]);
+            reference_reset_base(tmpref,hreg,0,spilltemp.temppos,sizeof(aint),[]);
             tmpref.index:=spilltemp.base;
             tmpref.index:=spilltemp.base;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             helplist.concat(spilling_create_store(tempreg,tmpref));

+ 1 - 1
compiler/systems/t_win.pas

@@ -527,7 +527,7 @@ implementation
                   {$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,ctempposinvalid,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),[]);

+ 31 - 33
compiler/tgobj.pas

@@ -62,7 +62,7 @@ unit tgobj;
           { contains all free temps using nextfree links }
           { contains all free temps using nextfree links }
           tempfreelist  : ptemprecord;
           tempfreelist  : ptemprecord;
           procedure alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference); virtual;
           procedure alloctemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref: treference); virtual;
-          procedure freetemp(list: TAsmList; pos: asizeint; temptypes: ttemptypeset);virtual;
+          procedure freetemp(list: TAsmList; pos: treftemppos; temptypes: ttemptypeset);virtual;
           procedure gettempinternal(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref : treference);
           procedure gettempinternal(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; def: tdef; fini: boolean; out ref : treference);
        public
        public
           { contains all temps }
           { contains all temps }
@@ -103,6 +103,9 @@ unit tgobj;
           function sizeoftemp(list: TAsmList; const ref: treference): asizeint;
           function sizeoftemp(list: TAsmList; const ref: treference): asizeint;
           function changetemptype(list: TAsmList; const ref:treference;temptype:ttemptype):boolean;
           function changetemptype(list: TAsmList; const ref:treference;temptype:ttemptype):boolean;
           function gettypeoftemp(const ref:treference): ttemptype;
           function gettypeoftemp(const ref:treference): ttemptype;
+          {# Returns a reference corresponding to a temp }
+          procedure temp_to_ref(p: ptemprecord; out ref: treference); virtual;
+
 
 
           {# Returns TRUE if the reference ref is allocated in temporary volatile memory space,
           {# Returns TRUE if the reference ref is allocated in temporary volatile memory space,
              otherwise returns FALSE.
              otherwise returns FALSE.
@@ -443,11 +446,11 @@ 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,[]);
+         temp_to_ref(tl,ref);
       end;
       end;
 
 
 
 
-    procedure ttgobj.FreeTemp(list: TAsmList; pos: asizeint; temptypes: ttemptypeset);
+    procedure ttgobj.FreeTemp(list: TAsmList; pos: treftemppos; temptypes: ttemptypeset);
       var
       var
          hp,hnext,hprev,hprevfree : ptemprecord;
          hp,hnext,hprev,hprevfree : ptemprecord;
       begin
       begin
@@ -456,13 +459,13 @@ implementation
          hprevfree:=nil;
          hprevfree:=nil;
          while assigned(hp) do
          while assigned(hp) do
           begin
           begin
-            if (hp^.pos=pos) then
+            if (hp^.pos=pos.val) then
              begin
              begin
                { check if already freed }
                { check if already freed }
                if hp^.temptype in FreeTempTypes then
                if hp^.temptype in FreeTempTypes then
                 begin
                 begin
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
-                  Comment(V_Warning,'tgobj: (FreeTemp) temp at pos '+tostr(pos)+ ' is already free !');
+                  Comment(V_Warning,'tgobj: (FreeTemp) temp at pos '+tostr(pos.val)+ ' is already free !');
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp is already freed'));
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp is already freed'));
 {$endif}
 {$endif}
                   exit;
                   exit;
@@ -471,7 +474,7 @@ implementation
                if not(hp^.temptype in temptypes) then
                if not(hp^.temptype in temptypes) then
                 begin
                 begin
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
-                  Comment(V_Debug,'tgobj: (Freetemp) temp at pos '+tostr(pos)+ ' has different type ('+TempTypeStr[hp^.temptype]+'), not releasing');
+                  Comment(V_Debug,'tgobj: (Freetemp) temp at pos '+tostr(pos.val)+ ' has different type ('+TempTypeStr[hp^.temptype]+'), not releasing');
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp has wrong type ('+TempTypeStr[hp^.temptype]+') not releasing'));
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp has wrong type ('+TempTypeStr[hp^.temptype]+') not releasing'));
 {$endif}
 {$endif}
                   exit;
                   exit;
@@ -571,21 +574,7 @@ implementation
 
 
     function ttgobj.istemp(const ref : treference) : boolean;
     function ttgobj.istemp(const ref : treference) : boolean;
       begin
       begin
-         { ref.index = R_NO was missing
-           led to problems with local arrays
-           with lower bound > 0 (PM) }
-         if direction = 1 then
-           begin
-             istemp:=(ref.base=current_procinfo.framepointer) and
-                     (ref.index=NR_NO) and
-                     (ref.offset>=firsttemp);
-           end
-        else
-           begin
-             istemp:=(ref.base=current_procinfo.framepointer) and
-                     (ref.index=NR_NO) and
-                     (ref.offset<firsttemp);
-           end;
+         istemp:=ref.temppos.val<>ctempposinvalid.val;
       end;
       end;
 
 
 
 
@@ -597,7 +586,7 @@ implementation
          hp:=templist;
          hp:=templist;
          while assigned(hp) do
          while assigned(hp) do
            begin
            begin
-             if (hp^.pos=ref.offset) then
+             if (hp^.pos=ref.temppos.val) then
                begin
                begin
                  sizeoftemp := hp^.size;
                  sizeoftemp := hp^.size;
                  exit;
                  exit;
@@ -605,8 +594,8 @@ implementation
              hp := hp^.next;
              hp := hp^.next;
            end;
            end;
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
-         comment(v_debug,'tgobj: (SizeOfTemp) temp at pos '+tostr(ref.offset)+' not found !');
-         list.concat(tai_tempalloc.allocinfo(ref.offset,0,'temp not found'));
+         comment(v_debug,'tgobj: (SizeOfTemp) temp at pos '+tostr(ref.temppos.val)+' not found !');
+         list.concat(tai_tempalloc.allocinfo(ref.temppos.val,0,'temp not found'));
 {$endif}
 {$endif}
       end;
       end;
 
 
@@ -619,14 +608,14 @@ implementation
          hp:=templist;
          hp:=templist;
          while assigned(hp) do
          while assigned(hp) do
           begin
           begin
-            if (hp^.pos=ref.offset) then
+            if (hp^.pos=ref.temppos.val) then
              begin
              begin
                if hp^.temptype<>tt_free then
                if hp^.temptype<>tt_free then
                 begin
                 begin
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
                   if hp^.temptype=temptype then
                   if hp^.temptype=temptype then
                     Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
                     Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
-                       ' at pos '+tostr(ref.offset)+ ' is already of the correct type !');
+                       ' at pos '+tostr(ref.temppos.val)+ ' is already of the correct type !');
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'type changed to '+TempTypeStr[temptype]));
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'type changed to '+TempTypeStr[temptype]));
 {$endif}
 {$endif}
                   ChangeTempType:=true;
                   ChangeTempType:=true;
@@ -636,7 +625,7 @@ implementation
                 begin
                 begin
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
                    Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
                    Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
-                      ' at pos '+tostr(ref.offset)+ ' is already freed !');
+                      ' at pos '+tostr(ref.temppos.val)+ ' is already freed !');
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp is already freed'));
                   list.concat(tai_tempalloc.allocinfo(hp^.pos,hp^.size,'temp is already freed'));
 {$endif}
 {$endif}
                 end;
                 end;
@@ -646,8 +635,8 @@ implementation
           end;
           end;
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
          Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
          Comment(V_Warning,'tgobj: (ChangeTempType) temp'+
-            ' at pos '+tostr(ref.offset)+ ' not found !');
-         list.concat(tai_tempalloc.allocinfo(ref.offset,0,'temp not found'));
+            ' at pos '+tostr(ref.temppos.val)+ ' not found !');
+         list.concat(tai_tempalloc.allocinfo(ref.temppos.val,0,'temp not found'));
 {$endif}
 {$endif}
       end;
       end;
 
 
@@ -659,7 +648,7 @@ implementation
          hp:=templist;
          hp:=templist;
          while assigned(hp) do
          while assigned(hp) do
           begin
           begin
-            if (hp^.pos=ref.offset) then
+            if (hp^.pos=ref.temppos.val) then
              begin
              begin
                if hp^.temptype<>tt_free then
                if hp^.temptype<>tt_free then
                  result:=hp^.temptype
                  result:=hp^.temptype
@@ -673,16 +662,25 @@ implementation
       end;
       end;
 
 
 
 
+    procedure ttgobj.temp_to_ref(p: ptemprecord; out ref: treference);
+      var
+        t: treftemppos;
+      begin
+        t.val:=p^.pos;
+        reference_reset_base(ref,current_procinfo.framepointer,p^.pos,t,p^.alignment,[]);
+      end;
+
+
     procedure ttgobj.UnGetTemp(list: TAsmList; const ref : treference);
     procedure ttgobj.UnGetTemp(list: TAsmList; const ref : treference);
       begin
       begin
-        FreeTemp(list,ref.offset,[tt_normal,tt_noreuse,tt_persistent,tt_regallocator]);
+        FreeTemp(list,ref.temppos,[tt_normal,tt_noreuse,tt_persistent,tt_regallocator]);
       end;
       end;
 
 
 
 
     procedure ttgobj.UnGetIfTemp(list: TAsmList; const ref : treference);
     procedure ttgobj.UnGetIfTemp(list: TAsmList; const ref : treference);
       begin
       begin
         if istemp(ref) then
         if istemp(ref) then
-          FreeTemp(list,ref.offset,[tt_normal]);
+          FreeTemp(list,ref.temppos,[tt_normal]);
       end;
       end;
 
 
 
 
@@ -701,7 +699,7 @@ implementation
 
 
     procedure ttgobj.UnGetLocal(list: TAsmList; const ref : treference);
     procedure ttgobj.UnGetLocal(list: TAsmList; const ref : treference);
       begin
       begin
-        FreeTemp(list,ref.offset,[tt_persistent]);
+        FreeTemp(list,ref.temppos,[tt_persistent]);
       end;
       end;
 
 
 end.
 end.

+ 19 - 19
compiler/x86/cgx86.pas

@@ -503,7 +503,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.temppos,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));
@@ -557,7 +557,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.temppos,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));
@@ -592,7 +592,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.temppos,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));
@@ -651,7 +651,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.temppos,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;
@@ -706,7 +706,7 @@ unit cgx86;
             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,ref.alignment,[]);
+                reference_reset_base(href,hreg,0,ctempposinvalid,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);
@@ -1117,13 +1117,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,ctempposinvalid,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.temppos,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));
@@ -2023,7 +2023,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,ctempposinvalid,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));
@@ -2032,7 +2032,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,ctempposinvalid,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));
@@ -2059,7 +2059,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,ctempposinvalid,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
@@ -2070,7 +2070,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,ctempposinvalid,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
@@ -2099,7 +2099,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,ctempposinvalid,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
@@ -3177,7 +3177,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,ctempposinvalid,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;
@@ -3205,7 +3205,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,ctempposinvalid,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));
@@ -3229,7 +3229,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,ctempposinvalid,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
@@ -3249,10 +3249,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,ctempposinvalid,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,ctempposinvalid,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
@@ -3262,7 +3262,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,ctempposinvalid,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))
@@ -3543,7 +3543,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),ctempposinvalid,sizeof(aint),[]);
               end;
               end;
 {$endif i386}
 {$endif i386}
           end;
           end;

+ 1 - 1
compiler/x86/nx86add.pas

@@ -177,7 +177,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,ctempposinvalid,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/nx86inl.pas

@@ -670,7 +670,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,left.location.reference.volatility);
+                   reference_reset_base(ref,r,0,left.location.reference.temppos,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

+ 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,location.reference.volatility);
+            reference_reset_base(location.reference,hreg,0,location.reference.temppos,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

+ 3 - 3
compiler/x86_64/cgcpu.pas

@@ -234,7 +234,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,ctempposinvalid,tcgsize2size[OS_VECTOR],[]);
               end;
               end;
 
 
             { allocate stackframe space }
             { allocate stackframe space }
@@ -333,7 +333,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,ctempposinvalid,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;
@@ -381,7 +381,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,ctempposinvalid,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

+ 3 - 3
compiler/x86_64/hlcgcpu.pas

@@ -87,12 +87,12 @@ implementation
           { load vmt from first paramter }
           { load vmt from first paramter }
           { win64 uses a different abi }
           { win64 uses a different abi }
           if x86_64_use_ms_abi(procdef.proccalloption) then
           if x86_64_use_ms_abi(procdef.proccalloption) then
-            reference_reset_base(href,voidpointertype,NR_RCX,0,sizeof(pint),[])
+            reference_reset_base(href,voidpointertype,NR_RCX,0,ctempposinvalid,sizeof(pint),[])
           else
           else
-            reference_reset_base(href,voidpointertype,NR_RDI,0,sizeof(pint),[]);
+            reference_reset_base(href,voidpointertype,NR_RDI,0,ctempposinvalid,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),ctempposinvalid,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

+ 2 - 2
compiler/x86_64/nx64set.pas

@@ -123,13 +123,13 @@ implementation
         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,-aint(min_)*4,4,[]);
+        reference_reset_base(href,basereg,-aint(min_)*4,ctempposinvalid,4,[]);
         href.index:=indexreg;
         href.index:=indexreg;
         href.scalefactor:=4;
         href.scalefactor:=4;
         jumpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         jumpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_S32,OS_ADDR,href,jumpreg);
         cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_S32,OS_ADDR,href,jumpreg);
         { add table address }
         { add table address }
-        reference_reset_base(href,basereg,0,sizeof(pint),[]);
+        reference_reset_base(href,basereg,0,ctempposinvalid,sizeof(pint),[]);
         href.index:=jumpreg;
         href.index:=jumpreg;
         href.scalefactor:=1;
         href.scalefactor:=1;
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,jumpreg);
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,jumpreg);