Bladeren bron

* the compiler now explicitly keeps track of the minimally guaranteed
alignment for each memory reference (mantis #12137, and
test/packages/fcl-registry/tregistry1.pp on sparc). This also
enables better code generation for packed records in many cases.
o several changes were made to the compiler to minimise the chances
of accidentally forgetting to set the alignment of memory references
in the future:
- reference_reset*() now has an extra alignment parameter
- location_reset() can now only be used for non LOC_(C)REFERENCE,
use location_reset_ref() for those (split the tloc enum so the
compiler can catch errors using range checking)

git-svn-id: trunk@12719 -

Jonas Maebe 16 jaren geleden
bovenliggende
commit
7d459cf12a
54 gewijzigde bestanden met toevoegingen van 543 en 386 verwijderingen
  1. 1 0
      .gitattributes
  2. 1 1
      compiler/aasmtai.pas
  3. 28 28
      compiler/arm/cgcpu.pas
  4. 1 1
      compiler/arm/narmcnv.pas
  5. 1 1
      compiler/arm/narmcon.pas
  6. 1 1
      compiler/arm/narminl.pas
  7. 1 1
      compiler/arm/narmset.pas
  8. 5 5
      compiler/arm/rgcpu.pas
  9. 3 3
      compiler/avr/cgcpu.pas
  10. 13 4
      compiler/cg64f32.pas
  11. 7 3
      compiler/cgbase.pas
  12. 16 17
      compiler/cgobj.pas
  13. 30 14
      compiler/cgutils.pas
  14. 18 0
      compiler/cutils.pas
  15. 1 1
      compiler/expunix.pas
  16. 21 6
      compiler/globals.pas
  17. 6 6
      compiler/i386/cgcpu.pas
  18. 1 1
      compiler/i386/n386mem.pas
  19. 5 5
      compiler/i386/popt386.pas
  20. 3 3
      compiler/i386/rropt386.pas
  21. 6 6
      compiler/m68k/cgcpu.pas
  22. 3 3
      compiler/m68k/n68kcal.pas
  23. 6 0
      compiler/ncal.pas
  24. 10 5
      compiler/ncgbas.pas
  25. 17 10
      compiler/ncgcal.pas
  26. 15 8
      compiler/ncgcnv.pas
  27. 8 8
      compiler/ncgcon.pas
  28. 2 2
      compiler/ncgflw.pas
  29. 14 15
      compiler/ncginl.pas
  30. 43 30
      compiler/ncgld.pas
  31. 31 21
      compiler/ncgmem.pas
  32. 1 1
      compiler/ncgopt.pas
  33. 66 45
      compiler/ncgutil.pas
  34. 1 0
      compiler/parabase.pas
  35. 27 27
      compiler/powerpc/cgcpu.pas
  36. 6 6
      compiler/powerpc/nppccal.pas
  37. 22 22
      compiler/powerpc64/cgcpu.pas
  38. 14 14
      compiler/ppcgen/cgppc.pas
  39. 1 1
      compiler/ppcgen/ngppcinl.pas
  40. 1 1
      compiler/ppu.pas
  41. 1 1
      compiler/procinfo.pas
  42. 16 16
      compiler/sparc/cgcpu.pas
  43. 1 1
      compiler/sparc/ncpucnv.pas
  44. 2 2
      compiler/sparc/ncpuset.pas
  45. 5 4
      compiler/sparc/rgcpu.pas
  46. 4 4
      compiler/systems/t_win.pas
  47. 17 17
      compiler/x86/cgx86.pas
  48. 1 1
      compiler/x86/nx86cnv.pas
  49. 6 6
      compiler/x86/nx86inl.pas
  50. 1 1
      compiler/x86/nx86mat.pas
  51. 1 1
      compiler/x86/nx86set.pas
  52. 5 5
      compiler/x86_64/cgcpu.pas
  53. 1 1
      compiler/x86_64/nx64cnv.pas
  54. 25 0
      tests/webtbs/tw12137.pp

+ 1 - 0
.gitattributes

@@ -8710,6 +8710,7 @@ tests/webtbs/tw12051.pp svneol=native#text/plain
 tests/webtbs/tw1207.pp svneol=native#text/plain
 tests/webtbs/tw1207.pp svneol=native#text/plain
 tests/webtbs/tw12076.pp svneol=native#text/plain
 tests/webtbs/tw12076.pp svneol=native#text/plain
 tests/webtbs/tw12109.pp svneol=native#text/plain
 tests/webtbs/tw12109.pp svneol=native#text/plain
+tests/webtbs/tw12137.pp svneol=native#text/plain
 tests/webtbs/tw12151.pp svneol=native#text/plain
 tests/webtbs/tw12151.pp svneol=native#text/plain
 tests/webtbs/tw12186.pp svneol=native#text/plain
 tests/webtbs/tw12186.pp svneol=native#text/plain
 tests/webtbs/tw12202.pp svneol=native#text/plain
 tests/webtbs/tw12202.pp svneol=native#text/plain

+ 1 - 1
compiler/aasmtai.pas

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

+ 28 - 28
compiler/arm/cgcpu.pas

@@ -203,7 +203,7 @@ unit cgcpu;
             a_load_const_reg(list,size,a,paraloc.location^.register);
             a_load_const_reg(list,size,a,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
-               reference_reset(ref);
+               reference_reset(ref,paraloc.alignment);
                ref.base:=paraloc.location^.reference.index;
                ref.base:=paraloc.location^.reference.index;
                ref.offset:=paraloc.location^.reference.offset;
                ref.offset:=paraloc.location^.reference.offset;
                a_load_const_ref(list,size,a,ref);
                a_load_const_ref(list,size,a,ref);
@@ -230,7 +230,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);
+                  reference_reset_base(ref,location^.reference.index,location^.reference.offset,paraloc.alignment);
                   { doubles in softemu mode have a strange order of registers and references }
                   { doubles in softemu mode have a strange order of registers and references }
                   if location^.size=OS_32 then
                   if location^.size=OS_32 then
                     g_concatcopy(list,tmpref,ref,4)
                     g_concatcopy(list,tmpref,ref,4)
@@ -273,7 +273,7 @@ unit cgcpu;
             a_loadaddr_ref_reg(list,r,paraloc.location^.register);
             a_loadaddr_ref_reg(list,r,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
-              reference_reset(ref);
+              reference_reset(ref,paraloc.alignment);
               ref.base := paraloc.location^.reference.index;
               ref.base := paraloc.location^.reference.index;
               ref.offset := paraloc.location^.reference.offset;
               ref.offset := paraloc.location^.reference.offset;
               tmpreg := getintregister(list,OS_ADDR);
               tmpreg := getintregister(list,OS_ADDR);
@@ -675,7 +675,7 @@ unit cgcpu;
             end
             end
           else
           else
             begin
             begin
-               reference_reset(hr);
+               reference_reset(hr,4);
 
 
                current_asmdata.getjumplabel(l);
                current_asmdata.getjumplabel(l);
                cg.a_label(current_procinfo.aktlocaldata,l);
                cg.a_label(current_procinfo.aktlocaldata,l);
@@ -737,7 +737,7 @@ unit cgcpu;
             )
             )
            ) then
            ) then
           begin
           begin
-            reference_reset(tmpref);
+            reference_reset(tmpref,4);
 
 
             { load symbol }
             { load symbol }
             tmpreg:=getintregister(list,OS_INT);
             tmpreg:=getintregister(list,OS_INT);
@@ -968,7 +968,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);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
                      end
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -1000,7 +1000,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);
+                       reference_reset_base(usedtmpref,tmpreg2,0,ref.alignment);
                      end
                      end
                    else
                    else
                      usedtmpref:=ref;
                      usedtmpref:=ref;
@@ -1181,7 +1181,7 @@ unit cgcpu;
                 end;
                 end;
               LOC_REFERENCE :
               LOC_REFERENCE :
                 begin
                 begin
-                  reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset);
+                  reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,paraloc.alignment);
                   { concatcopy should choose the best way to copy the data }
                   { concatcopy should choose the best way to copy the data }
                   g_concatcopy(list,href,href2,tcgsize2size[size]);
                   g_concatcopy(list,href,href2,tcgsize2size[size]);
                 end;
                 end;
@@ -1336,7 +1336,7 @@ unit cgcpu;
                 list.concat(taicpu.op_reg_reg(A_MOV,NR_R12,NR_STACK_POINTER_REG));
                 list.concat(taicpu.op_reg_reg(A_MOV,NR_R12,NR_STACK_POINTER_REG));
               end;
               end;
             { save int registers }
             { save int registers }
-            reference_reset(ref);
+            reference_reset(ref,4);
             ref.index:=NR_STACK_POINTER_REG;
             ref.index:=NR_STACK_POINTER_REG;
             ref.addressmode:=AM_PREINDEXED;
             ref.addressmode:=AM_PREINDEXED;
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
             regs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall);
@@ -1372,18 +1372,18 @@ unit cgcpu;
                     for i:=1 to localsize div winstackpagesize do
                     for i:=1 to localsize div winstackpagesize do
                       begin
                       begin
                         if localsize-i*winstackpagesize<4096 then
                         if localsize-i*winstackpagesize<4096 then
-                          reference_reset_base(href,NR_STACK_POINTER_REG,-(localsize-i*winstackpagesize))
+                          reference_reset_base(href,NR_STACK_POINTER_REG,-(localsize-i*winstackpagesize),4)
                         else
                         else
                           begin
                           begin
                             a_load_const_reg(list,OS_ADDR,-(localsize-i*winstackpagesize),NR_R12);
                             a_load_const_reg(list,OS_ADDR,-(localsize-i*winstackpagesize),NR_R12);
-                            reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                            reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
                             href.index:=NR_R12;
                             href.index:=NR_R12;
                           end;
                           end;
                         { the data stored doesn't matter }
                         { the data stored doesn't matter }
                         list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                         list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                       end;
                       end;
                     a_reg_dealloc(list,NR_R12);
                     a_reg_dealloc(list,NR_R12);
-                    reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                    reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
                     { the data stored doesn't matter }
                     { the data stored doesn't matter }
                     list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                     list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                  end
                  end
@@ -1394,7 +1394,7 @@ unit cgcpu;
                     a_label(list,again);
                     a_label(list,again);
                     { always shifterop }
                     { always shifterop }
                     list.concat(Taicpu.op_reg_reg_const(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,winstackpagesize));
                     list.concat(Taicpu.op_reg_reg_const(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,winstackpagesize));
-                    reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                    reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
                     { the data stored doesn't matter }
                     { the data stored doesn't matter }
                     list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                     list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                     list.concat(Taicpu.op_reg_reg_const(A_SUB,NR_R12,NR_R12,1));
                     list.concat(Taicpu.op_reg_reg_const(A_SUB,NR_R12,NR_R12,1));
@@ -1407,7 +1407,7 @@ unit cgcpu;
                         list.concat(taicpu.op_reg_reg_reg(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,NR_R12));
                         list.concat(taicpu.op_reg_reg_reg(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,NR_R12));
                       end;
                       end;
                     a_reg_dealloc(list,NR_R12);
                     a_reg_dealloc(list,NR_R12);
-                    reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                    reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
                     { the data stored doesn't matter }
                     { the data stored doesn't matter }
                     list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                     list.concat(Taicpu.op_reg_ref(A_STR,NR_R0,href));
                  end
                  end
@@ -1431,7 +1431,7 @@ unit cgcpu;
 
 
             if firstfloatreg<>RS_NO then
             if firstfloatreg<>RS_NO then
               begin
               begin
-                reference_reset(ref);
+                reference_reset(ref,4);
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                   begin
                   begin
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
@@ -1474,7 +1474,7 @@ unit cgcpu;
 
 
             if firstfloatreg<>RS_NO then
             if firstfloatreg<>RS_NO then
               begin
               begin
-                reference_reset(ref);
+                reference_reset(ref,4);
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                 if tg.direction*tarmprocinfo(current_procinfo).floatregstart>=1023 then
                   begin
                   begin
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
                     a_load_const_reg(list,OS_ADDR,-tarmprocinfo(current_procinfo).floatregstart,NR_R12);
@@ -1516,7 +1516,7 @@ unit cgcpu;
                   list.concat(taicpu.op_reg_reg(A_MOV,NR_R15,NR_R14))
                   list.concat(taicpu.op_reg_reg(A_MOV,NR_R15,NR_R14))
                 else
                 else
                   begin
                   begin
-                    reference_reset(ref);
+                    reference_reset(ref,4);
                     ref.index:=NR_STACK_POINTER_REG;
                     ref.index:=NR_STACK_POINTER_REG;
                     ref.addressmode:=AM_PREINDEXED;
                     ref.addressmode:=AM_PREINDEXED;
                     list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,regs),PF_FD));
                     list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,regs),PF_FD));
@@ -1525,7 +1525,7 @@ unit cgcpu;
             else
             else
               begin
               begin
                 { restore int registers and return }
                 { restore int registers and return }
-                reference_reset(ref);
+                reference_reset(ref,4);
                 ref.index:=NR_FRAME_POINTER_REG;
                 ref.index:=NR_FRAME_POINTER_REG;
                 list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall)+[RS_R11,RS_R13,RS_R15]),PF_EA));
                 list.concat(setoppostfix(taicpu.op_ref_regset(A_LDM,ref,rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(pocall_stdcall)+[RS_R11,RS_R13,RS_R15]),PF_EA));
               end;
               end;
@@ -1610,7 +1610,7 @@ unit cgcpu;
           if the symbol is absolute or relative there.
           if the symbol is absolute or relative there.
         }
         }
         { create consts entry }
         { create consts entry }
-        reference_reset(tmpref);
+        reference_reset(tmpref,4);
         current_asmdata.getjumplabel(l);
         current_asmdata.getjumplabel(l);
         cg.a_label(current_procinfo.aktlocaldata,l);
         cg.a_label(current_procinfo.aktlocaldata,l);
         tmpref.symboldata:=current_procinfo.aktlocaldata.last;
         tmpref.symboldata:=current_procinfo.aktlocaldata.last;
@@ -1784,7 +1784,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);
+                reference_reset_base(srcref,srcreg,0,source.alignment);
               end;
               end;
 
 
             while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
             while (len div 4 <> 0) and (tmpregi<maxtmpreg) do
@@ -1798,7 +1798,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);
+            reference_reset_base(dstref,destreg,0,dest.alignment);
             tmpregi2:=1;
             tmpregi2:=1;
             while (tmpregi2<=tmpregi) do
             while (tmpregi2<=tmpregi) do
               begin
               begin
@@ -1866,11 +1866,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);
+                reference_reset_base(dstref,destreg,0,dest.alignment);
 
 
                 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);
+                reference_reset_base(srcref,srcreg,0,source.alignment);
 
 
                 countreg:=getintregister(list,OS_32);
                 countreg:=getintregister(list,OS_32);
 
 
@@ -2010,7 +2010,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));
+                    reference_reset_base(href,reference.index,reference.offset+sizeof(aint),sizeof(pint));
                     if is_shifter_const(ioffset,shift) then
                     if is_shifter_const(ioffset,shift) then
                       a_op_const_ref(list,OP_SUB,size,ioffset,href)
                       a_op_const_ref(list,OP_SUB,size,ioffset,href)
                     else
                     else
@@ -2038,7 +2038,7 @@ unit cgcpu;
         var
         var
           href : treference;
           href : treference;
         begin
         begin
-          reference_reset_base(href,NR_R0,0);
+          reference_reset_base(href,NR_R0,0,sizeof(pint));
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
         end;
         end;
 
 
@@ -2050,7 +2050,7 @@ unit cgcpu;
           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,NR_R12,procdef._class.vmtmethodoffset(procdef.extnumber));
+          reference_reset_base(href,NR_R12,procdef._class.vmtmethodoffset(procdef.extnumber),sizeof(pint));
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R12);
           list.concat(taicpu.op_reg_reg(A_MOV,NR_PC,NR_R12));
           list.concat(taicpu.op_reg_reg(A_MOV,NR_PC,NR_R12));
         end;
         end;
@@ -2139,10 +2139,10 @@ unit cgcpu;
         if not(cs_create_pic in current_settings.moduleswitches) then
         if not(cs_create_pic in current_settings.moduleswitches) then
           begin
           begin
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$slp');
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$slp');
-            reference_reset_symbol(href,l1,0);
+            reference_reset_symbol(href,l1,0,sizeof(pint));
             href.refaddr:=addr_full;
             href.refaddr:=addr_full;
             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);
+            reference_reset_base(href,NR_R12,0,sizeof(pint));
             current_asmdata.asmlists[al_imports].concat(taicpu.op_reg_ref(A_LDR,NR_R15,href));
             current_asmdata.asmlists[al_imports].concat(taicpu.op_reg_ref(A_LDR,NR_R15,href));
             current_asmdata.asmlists[al_imports].concat(Tai_symbol.Create(l1,0));
             current_asmdata.asmlists[al_imports].concat(Tai_symbol.Create(l1,0));
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$lazy_ptr');
             l1 := current_asmdata.RefAsmSymbol('L'+s+'$lazy_ptr');

+ 1 - 1
compiler/arm/narmcnv.pas

@@ -144,7 +144,7 @@ implementation
 
 
                   current_asmdata.getdatalabel(l1);
                   current_asmdata.getdatalabel(l1);
                   current_asmdata.getjumplabel(l2);
                   current_asmdata.getjumplabel(l2);
-                  reference_reset_symbol(href,l1,0);
+                  reference_reset_symbol(href,l1,0,const_align(8));
 
 
                   current_asmdata.CurrAsmList.concat(Taicpu.op_reg_const(A_CMP,left.location.register,0));
                   current_asmdata.CurrAsmList.concat(Taicpu.op_reg_const(A_CMP,left.location.register,0));
                   cg.a_jmp_flags(current_asmdata.CurrAsmList,F_GE,l2);
                   cg.a_jmp_flags(current_asmdata.CurrAsmList,F_GE,l2);

+ 1 - 1
compiler/arm/narmcon.pas

@@ -62,7 +62,7 @@ interface
          hiloswapped : boolean;
          hiloswapped : boolean;
 
 
       begin
       begin
-        location_reset(location,LOC_CREFERENCE,def_cgsize(resultdef));
+        location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),4);
         lastlabel:=nil;
         lastlabel:=nil;
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
         hiloswapped:=is_double_hilo_swapped;
         hiloswapped:=is_double_hilo_swapped;

+ 1 - 1
compiler/arm/narminl.pas

@@ -213,7 +213,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);
+                  reference_reset_base(ref,r,0,left.location.reference.alignment);
                   { 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;

+ 1 - 1
compiler/arm/narmset.pas

@@ -103,7 +103,7 @@ implementation
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opsize,OS_INT,hregister,indexreg);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opsize,OS_INT,hregister,indexreg);
         cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_+1,indexreg,indexreg);
         cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_+1,indexreg,indexreg);
         { create reference }
         { create reference }
-        reference_reset(href);
+        reference_reset(href,4);
         href.base:=NR_PC;
         href.base:=NR_PC;
         href.index:=indexreg;
         href.index:=indexreg;
         href.shiftmode:=SM_LSL;
         href.shiftmode:=SM_LSL;

+ 5 - 5
compiler/arm/rgcpu.pas

@@ -46,7 +46,7 @@ unit rgcpu;
   implementation
   implementation
 
 
     uses
     uses
-      verbose, cutils,
+      verbose, cutils,globtype,
       cgobj,
       cgobj,
       procinfo;
       procinfo;
 
 
@@ -75,7 +75,7 @@ unit rgcpu;
         if abs(spilltemp.offset)>4095 then
         if abs(spilltemp.offset)>4095 then
           begin
           begin
             helplist:=TAsmList.create;
             helplist:=TAsmList.create;
-            reference_reset(tmpref);
+            reference_reset(tmpref,sizeof(aint));
             { create consts entry }
             { create consts entry }
             current_asmdata.getjumplabel(l);
             current_asmdata.getjumplabel(l);
             cg.a_label(current_procinfo.aktlocaldata,l);
             cg.a_label(current_procinfo.aktlocaldata,l);
@@ -93,7 +93,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);
+            reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(aint));
             tmpref.index:=hreg;
             tmpref.index:=hreg;
 
 
             if spilltemp.index<>NR_NO then
             if spilltemp.index<>NR_NO then
@@ -121,7 +121,7 @@ unit rgcpu;
         if abs(spilltemp.offset)>4095 then
         if abs(spilltemp.offset)>4095 then
           begin
           begin
             helplist:=TAsmList.create;
             helplist:=TAsmList.create;
-            reference_reset(tmpref);
+            reference_reset(tmpref,sizeof(aint));
             { create consts entry }
             { create consts entry }
             current_asmdata.getjumplabel(l);
             current_asmdata.getjumplabel(l);
             cg.a_label(current_procinfo.aktlocaldata,l);
             cg.a_label(current_procinfo.aktlocaldata,l);
@@ -141,7 +141,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);
+            reference_reset_base(tmpref,current_procinfo.framepointer,0,sizeof(pint));
             tmpref.index:=hreg;
             tmpref.index:=hreg;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             helplist.concat(spilling_create_store(tempreg,tmpref));

+ 3 - 3
compiler/avr/cgcpu.pas

@@ -154,7 +154,7 @@ unit cgcpu;
             a_load_const_reg(list,size,a,paraloc.location^.register);
             a_load_const_reg(list,size,a,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
-               reference_reset(ref);
+               reference_reset(ref,paraloc.alignment);
                ref.base:=paraloc.location^.reference.index;
                ref.base:=paraloc.location^.reference.index;
                ref.offset:=paraloc.location^.reference.offset;
                ref.offset:=paraloc.location^.reference.offset;
                a_load_const_ref(list,size,a,ref);
                a_load_const_ref(list,size,a,ref);
@@ -181,7 +181,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);
+                  reference_reset_base(ref,location^.reference.index,location^.reference.offset,araloc.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)
@@ -217,7 +217,7 @@ unit cgcpu;
             a_loadaddr_ref_reg(list,r,paraloc.location^.register);
             a_loadaddr_ref_reg(list,r,paraloc.location^.register);
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
-              reference_reset(ref);
+              reference_reset(ref,paraloc.alignment);
               ref.base := paraloc.location^.reference.index;
               ref.base := paraloc.location^.reference.index;
               ref.offset := paraloc.location^.reference.offset;
               ref.offset := paraloc.location^.reference.offset;
               tmpreg := getintregister(list,OS_ADDR);
               tmpreg := getintregister(list,OS_ADDR);

+ 13 - 4
compiler/cg64f32.pas

@@ -98,7 +98,7 @@ unit cg64f32;
 
 
     uses
     uses
        globtype,systems,constexp,
        globtype,systems,constexp,
-       verbose,
+       verbose,cutils,
        symbase,symconst,symdef,symtable,defutil,paramgr;
        symbase,symconst,symdef,symtable,defutil,paramgr;
 
 
 {****************************************************************************
 {****************************************************************************
@@ -171,9 +171,15 @@ unit cg64f32;
             move(cgpara.location^,paralochi^,sizeof(paralochi^));
             move(cgpara.location^,paralochi^,sizeof(paralochi^));
             { for big endian low is at +4, for little endian high }
             { for big endian low is at +4, for little endian high }
             if target_info.endian = endian_big then
             if target_info.endian = endian_big then
-              inc(cgparalo.location^.reference.offset,4)
+              begin
+                inc(cgparalo.location^.reference.offset,4);
+                cgparalo.alignment:=newalignment(cgparalo.alignment,4);
+              end
             else
             else
-              inc(cgparahi.location^.reference.offset,4);
+              begin
+                inc(cgparahi.location^.reference.offset,4);
+                cgparahi.alignment:=newalignment(cgparahi.alignment,4);
+              end;
           end;
           end;
         { fix size }
         { fix size }
         paraloclo^.size:=cgparalo.size;
         paraloclo^.size:=cgparalo.size;
@@ -754,7 +760,10 @@ unit cg64f32;
 
 
              if (temploc.loc in [LOC_REFERENCE,LOC_CREFERENCE]) and
              if (temploc.loc in [LOC_REFERENCE,LOC_CREFERENCE]) and
                 (target_info.endian = endian_big) then
                 (target_info.endian = endian_big) then
-               inc(temploc.reference.offset,4);
+               begin
+                 inc(temploc.reference.offset,4);
+                 temploc.reference.alignment:=newalignment(temploc.reference.alignment,4);
+               end;
 
 
              cg.g_rangecheck(list,temploc,hdef,todef);
              cg.g_rangecheck(list,temploc,hdef,todef);
              hdef.owner.deletedef(hdef);
              hdef.owner.deletedef(hdef);

+ 7 - 3
compiler/cgbase.pas

@@ -38,8 +38,6 @@ interface
          LOC_CONSTANT,     { constant value }
          LOC_CONSTANT,     { constant value }
          LOC_JUMP,         { boolean results only, jump to false or true label }
          LOC_JUMP,         { boolean results only, jump to false or true label }
          LOC_FLAGS,        { boolean results only, flags are set }
          LOC_FLAGS,        { boolean results only, flags are set }
-         LOC_CREFERENCE,   { in memory constant value reference (cannot change) }
-         LOC_REFERENCE,    { in memory value }
          LOC_REGISTER,     { in a processor register }
          LOC_REGISTER,     { in a processor register }
          LOC_CREGISTER,    { Constant register which shouldn't be modified }
          LOC_CREGISTER,    { Constant register which shouldn't be modified }
          LOC_FPUREGISTER,  { FPU stack }
          LOC_FPUREGISTER,  { FPU stack }
@@ -56,9 +54,15 @@ interface
          LOC_CSUBSETREG,
          LOC_CSUBSETREG,
          { contiguous subset of bits in memory }
          { contiguous subset of bits in memory }
          LOC_SUBSETREF,
          LOC_SUBSETREF,
-         LOC_CSUBSETREF
+         LOC_CSUBSETREF,
+         { keep these last for range checking purposes }
+         LOC_CREFERENCE,   { in memory constant value reference (cannot change) }
+         LOC_REFERENCE     { in memory value }
        );
        );
 
 
+       TCGNonRefLoc=low(TCGLoc)..pred(LOC_CREFERENCE);
+       TCGRefLoc=LOC_CREFERENCE..LOC_REFERENCE;
+
        { since we have only 16bit offsets, we need to be able to specify the high
        { since we have only 16bit offsets, we need to be able to specify the high
          and lower 16 bits of the address of a symbol of up to 64 bit }
          and lower 16 bits of the address of a symbol of up to 64 bit }
        trefaddr = (
        trefaddr = (

+ 16 - 17
compiler/cgobj.pas

@@ -854,7 +854,7 @@ implementation
               a_load_reg_reg(list,size,cgpara.location^.size,r,cgpara.location^.register);
               a_load_reg_reg(list,size,cgpara.location^.size,r,cgpara.location^.register);
             LOC_REFERENCE,LOC_CREFERENCE:
             LOC_REFERENCE,LOC_CREFERENCE:
               begin
               begin
-                 reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset);
+                 reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
                  a_load_reg_ref(list,size,cgpara.location^.size,r,ref);
                  a_load_reg_ref(list,size,cgpara.location^.size,r,ref);
               end
               end
             else
             else
@@ -873,7 +873,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);
+                 reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
                  a_load_const_ref(list,cgpara.location^.size,a,ref);
                  a_load_const_ref(list,cgpara.location^.size,a,ref);
               end
               end
             else
             else
@@ -892,9 +892,7 @@ implementation
               a_load_ref_reg(list,size,cgpara.location^.size,r,cgpara.location^.register);
               a_load_ref_reg(list,size,cgpara.location^.size,r,cgpara.location^.register);
             LOC_REFERENCE,LOC_CREFERENCE:
             LOC_REFERENCE,LOC_CREFERENCE:
               begin
               begin
-                 reference_reset(ref);
-                 ref.base:=cgpara.location^.reference.index;
-                 ref.offset:=cgpara.location^.reference.offset;
+                 reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
                  if (size <> OS_NO) and
                  if (size <> OS_NO) and
                     (tcgsize2size[size] < sizeof(aint)) then
                     (tcgsize2size[size] < sizeof(aint)) then
                    begin
                    begin
@@ -2146,7 +2144,7 @@ implementation
         tmpreg : tregister;
         tmpreg : tregister;
         i : longint;
         i : longint;
       begin
       begin
-        if ref.alignment<>0 then
+        if ref.alignment<tcgsize2size[fromsize] then
           begin
           begin
             tmpref:=ref;
             tmpref:=ref;
             { we take care of the alignment now }
             { we take care of the alignment now }
@@ -2171,6 +2169,7 @@ implementation
                 end;
                 end;
               OS_32,OS_S32:
               OS_32,OS_S32:
                 begin
                 begin
+                  { could add an optimised case for ref.alignment=2 }
                   tmpreg:=getintregister(list,OS_32);
                   tmpreg:=getintregister(list,OS_32);
                   a_load_reg_reg(list,fromsize,OS_32,register,tmpreg);
                   a_load_reg_reg(list,fromsize,OS_32,register,tmpreg);
                   if target_info.endian=endian_big then
                   if target_info.endian=endian_big then
@@ -2528,7 +2527,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);
+                reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
                 a_loadfpu_reg_ref(list,size,size,r,ref);
                 a_loadfpu_reg_ref(list,size,size,r,ref);
               end;
               end;
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
@@ -2555,7 +2554,7 @@ implementation
             a_loadfpu_ref_reg(list,size,size,ref,cgpara.location^.register);
             a_loadfpu_ref_reg(list,size,size,ref,cgpara.location^.register);
           LOC_REFERENCE,LOC_CREFERENCE:
           LOC_REFERENCE,LOC_CREFERENCE:
             begin
             begin
-              reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset);
+              reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
               { concatcopy should choose the best way to copy the data }
               { concatcopy should choose the best way to copy the data }
               g_concatcopy(list,ref,href,tcgsize2size[size]);
               g_concatcopy(list,ref,href,tcgsize2size[size]);
             end;
             end;
@@ -2952,7 +2951,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);
+              reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset,cgpara.alignment);
               a_loadmm_reg_ref(list,size,cgpara.location^.size,reg,href,shuffle);
               a_loadmm_reg_ref(list,size,cgpara.location^.size,reg,href,shuffle);
             end
             end
           else
           else
@@ -3141,7 +3140,7 @@ implementation
           end
           end
          else
          else
           begin
           begin
-            reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0);
+            reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
             paramanager.allocparaloc(list,cgpara2);
             paramanager.allocparaloc(list,cgpara2);
             a_paramaddr_ref(list,href,cgpara2);
             a_paramaddr_ref(list,href,cgpara2);
             paramanager.allocparaloc(list,cgpara1);
             paramanager.allocparaloc(list,cgpara1);
@@ -3190,7 +3189,7 @@ implementation
           begin
           begin
             if needrtti then
             if needrtti then
              begin
              begin
-               reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0);
+               reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
                tempreg2:=getaddressregister(list);
                tempreg2:=getaddressregister(list);
                a_loadaddr_ref_reg(list,href,tempreg2);
                a_loadaddr_ref_reg(list,href,tempreg2);
              end;
              end;
@@ -3211,7 +3210,7 @@ implementation
           end
           end
          else
          else
           begin
           begin
-            reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0);
+            reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
             paramanager.allocparaloc(list,cgpara2);
             paramanager.allocparaloc(list,cgpara2);
             a_paramaddr_ref(list,href,cgpara2);
             a_paramaddr_ref(list,href,cgpara2);
             paramanager.allocparaloc(list,cgpara1);
             paramanager.allocparaloc(list,cgpara1);
@@ -3244,7 +3243,7 @@ implementation
            a_load_const_ref(list,OS_ADDR,0,ref)
            a_load_const_ref(list,OS_ADDR,0,ref)
          else
          else
            begin
            begin
-              reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0);
+              reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
               paramanager.allocparaloc(list,cgpara2);
               paramanager.allocparaloc(list,cgpara2);
               a_paramaddr_ref(list,href,cgpara2);
               a_paramaddr_ref(list,href,cgpara2);
               paramanager.allocparaloc(list,cgpara1);
               paramanager.allocparaloc(list,cgpara1);
@@ -3279,7 +3278,7 @@ implementation
             end
             end
          else
          else
            begin
            begin
-              reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0);
+              reference_reset_symbol(href,RTTIWriter.get_rtti_label(t,initrtti),0,sizeof(pint));
               paramanager.allocparaloc(list,cgpara2);
               paramanager.allocparaloc(list,cgpara2);
               a_paramaddr_ref(list,href,cgpara2);
               a_paramaddr_ref(list,href,cgpara2);
               paramanager.allocparaloc(list,cgpara1);
               paramanager.allocparaloc(list,cgpara1);
@@ -3527,7 +3526,7 @@ implementation
         paramanager.getintparaloc(pocall_default,2,cgpara2);
         paramanager.getintparaloc(pocall_default,2,cgpara2);
         if (cs_check_object in current_settings.localswitches) then
         if (cs_check_object in current_settings.localswitches) then
          begin
          begin
-           reference_reset_symbol(hrefvmt,current_asmdata.RefAsmSymbol(objdef.vmt_mangledname),0);
+           reference_reset_symbol(hrefvmt,current_asmdata.RefAsmSymbol(objdef.vmt_mangledname),0,sizeof(pint));
            paramanager.allocparaloc(list,cgpara2);
            paramanager.allocparaloc(list,cgpara2);
            a_paramaddr_ref(list,hrefvmt,cgpara2);
            a_paramaddr_ref(list,hrefvmt,cgpara2);
            paramanager.allocparaloc(list,cgpara1);
            paramanager.allocparaloc(list,cgpara1);
@@ -3795,7 +3794,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(aint));
+                    reference_reset_base(href,reference.index,reference.offset+sizeof(pint),sizeof(pint));
                     a_op_const_ref(list,OP_SUB,size,ioffset,href);
                     a_op_const_ref(list,OP_SUB,size,ioffset,href);
                   end
                   end
                 else
                 else
@@ -3845,7 +3844,7 @@ implementation
 {$endif cpu64bitaddr}
 {$endif cpu64bitaddr}
                 end;
                 end;
               result := getaddressregister(list);
               result := getaddressregister(list);
-              reference_reset_symbol(ref,l,0);
+              reference_reset_symbol(ref,l,0,sizeof(pint));
               { a_load_ref_reg will turn this into a pic-load if needed }
               { a_load_ref_reg will turn this into a pic-load if needed }
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,result);
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,ref,result);
             end;
             end;

+ 30 - 14
compiler/cgutils.pas

@@ -126,12 +126,12 @@ unit cgutils;
     { trerefence handling }
     { trerefence handling }
 
 
     {# Clear to zero a treference }
     {# Clear to zero a treference }
-    procedure reference_reset(var ref : treference);
+    procedure reference_reset(var ref : treference; alignment: longint);
     {# 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 : longint);
-    procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset : longint);
+    procedure reference_reset_base(var ref : treference;base : tregister;offset, alignment : longint);
+    procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint);
     { 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.
     }
     }
@@ -139,7 +139,10 @@ unit cgutils;
 
 
     { tlocation handling }
     { tlocation handling }
 
 
-    procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
+    { cannot be used for loc_(c)reference, because that one requires an alignment }
+    procedure location_reset(var l : tlocation;lt:TCGNonRefLoc;lsize:TCGSize);
+    { for loc_(c)reference }
+    procedure location_reset_ref(var l : tlocation;lt:TCGRefLoc;lsize:TCGSize; alignment: longint);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_swap(var destloc,sourceloc : tlocation);
     procedure location_swap(var destloc,sourceloc : tlocation);
 
 
@@ -154,32 +157,34 @@ unit cgutils;
 implementation
 implementation
 
 
 uses
 uses
-  systems;
+  systems,
+  verbose;
 
 
 {****************************************************************************
 {****************************************************************************
                                   TReference
                                   TReference
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure reference_reset(var ref : treference);
+    procedure reference_reset(var ref : treference; alignment: longint);
       begin
       begin
         FillChar(ref,sizeof(treference),0);
         FillChar(ref,sizeof(treference),0);
 {$ifdef arm}
 {$ifdef arm}
         ref.signindex:=1;
         ref.signindex:=1;
 {$endif arm}
 {$endif arm}
+        ref.alignment:=alignment;
       end;
       end;
 
 
 
 
-    procedure reference_reset_base(var ref : treference;base : tregister;offset : longint);
+    procedure reference_reset_base(var ref : treference;base : tregister;offset, alignment : longint);
       begin
       begin
-        reference_reset(ref);
+        reference_reset(ref,alignment);
         ref.base:=base;
         ref.base:=base;
         ref.offset:=offset;
         ref.offset:=offset;
       end;
       end;
 
 
 
 
-    procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset : longint);
+    procedure reference_reset_symbol(var ref : treference;sym : tasmsymbol;offset, alignment : longint);
       begin
       begin
-        reference_reset(ref);
+        reference_reset(ref,alignment);
         ref.symbol:=sym;
         ref.symbol:=sym;
         ref.offset:=offset;
         ref.offset:=offset;
       end;
       end;
@@ -202,17 +207,28 @@ uses
                                   TLocation
                                   TLocation
 ****************************************************************************}
 ****************************************************************************}
 
 
-    procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize);
+    procedure location_reset(var l : tlocation;lt:TCGNonRefLoc;lsize:TCGSize);
       begin
       begin
         FillChar(l,sizeof(tlocation),0);
         FillChar(l,sizeof(tlocation),0);
         l.loc:=lt;
         l.loc:=lt;
         l.size:=lsize;
         l.size:=lsize;
-{$ifdef arm}
         if l.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
         if l.loc in [LOC_REFERENCE,LOC_CREFERENCE] then
-          l.reference.signindex:=1;
-{$endif arm}
+          { call location_reset_ref instead }
+          internalerror(2009020705);
       end;
       end;
 
 
+    procedure location_reset_ref(var l: tlocation; lt: tcgrefloc; lsize: tcgsize;
+      alignment: longint);
+    begin
+      FillChar(l,sizeof(tlocation),0);
+      l.loc:=lt;
+      l.size:=lsize;
+{$ifdef arm}
+      l.reference.signindex:=1;
+{$endif arm}
+      l.reference.alignment:=alignment;
+    end;
+
 
 
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
     procedure location_copy(var destloc:tlocation; const sourceloc : tlocation);
       begin
       begin

+ 18 - 0
compiler/cutils.pas

@@ -44,6 +44,11 @@ interface
     function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
     {# Return value @var(i) aligned on @var(a) boundary }
     {# Return value @var(i) aligned on @var(a) boundary }
     function align(i,a:longint):longint;{$ifdef USEINLINE}inline;{$endif}
     function align(i,a:longint):longint;{$ifdef USEINLINE}inline;{$endif}
+    { if you have an address aligned using "oldalignment" and add an
+      offset of (a multiple of) offset to it, this function calculates
+      the new minimally guaranteed alignment
+    }
+    function newalignment(oldalignment: longint; offset: int64): longint;
     {# Return @var(b) with the bit order reversed }
     {# Return @var(b) with the bit order reversed }
     function reverse_byte(b: byte): byte;
     function reverse_byte(b: byte): byte;
 
 
@@ -200,6 +205,19 @@ implementation
            max:=b;
            max:=b;
       end;
       end;
 
 
+
+    function newalignment(oldalignment: longint; offset: int64): longint;
+      var
+        i,
+        localoffset: longint;
+      begin
+        localoffset:=longint(offset);
+        while (localoffset mod oldalignment)<>0 do
+          oldalignment:=oldalignment div 2;
+        newalignment:=oldalignment;
+      end;
+
+
     function reverse_byte(b: byte): byte;
     function reverse_byte(b: byte): byte;
       const
       const
         reverse_nible:array[0..15] of 0..15 =
         reverse_nible:array[0..15] of 0..15 =

+ 1 - 1
compiler/expunix.pas

@@ -156,7 +156,7 @@ begin
              begin
              begin
 {$ifdef x86}
 {$ifdef x86}
                sym:=current_asmdata.RefAsmSymbol(pd.mangledname);
                sym:=current_asmdata.RefAsmSymbol(pd.mangledname);
-               reference_reset_symbol(r,sym,0);
+               reference_reset_symbol(r,sym,0,sizeof(pint));
                if cs_create_pic in current_settings.moduleswitches then
                if cs_create_pic in current_settings.moduleswitches then
                  r.refaddr:=addr_pic
                  r.refaddr:=addr_pic
                else
                else

+ 21 - 6
compiler/globals.pas

@@ -441,10 +441,12 @@ interface
 
 
     {# Routine to get the required alignment for size of data, which will
     {# Routine to get the required alignment for size of data, which will
        be placed in bss segment, according to the current alignment requirements }
        be placed in bss segment, according to the current alignment requirements }
-    function var_align(siz: longint): shortint;
+    function var_align(want_align: longint): shortint;
+    function var_align_size(siz: longint): shortint;
     {# Routine to get the required alignment for size of data, which will
     {# Routine to get the required alignment for size of data, which will
        be placed in data/const segment, according to the current alignment requirements }
        be placed in data/const segment, according to the current alignment requirements }
-    function const_align(siz: longint): shortint;
+    function const_align(want_align: longint): shortint;
+    function const_align_size(siz: longint): shortint;
 {$ifdef ARM}
 {$ifdef ARM}
     function is_double_hilo_swapped: boolean;{$ifdef USEINLINE}inline;{$endif}
     function is_double_hilo_swapped: boolean;{$ifdef USEINLINE}inline;{$endif}
 {$endif ARM}
 {$endif ARM}
@@ -1250,19 +1252,32 @@ implementation
       end;
       end;
 
 
 
 
-    function var_align(siz: longint): shortint;
+    function var_align(want_align: longint): shortint;
+      begin
+        var_align := used_align(want_align,current_settings.alignment.varalignmin,current_settings.alignment.varalignmax);
+      end;
+
+
+    function var_align_size(siz: longint): shortint;
       begin
       begin
         siz := size_2_align(siz);
         siz := size_2_align(siz);
-        var_align := used_align(siz,current_settings.alignment.varalignmin,current_settings.alignment.varalignmax);
+        var_align_size := var_align(siz);
       end;
       end;
 
 
 
 
-    function const_align(siz: longint): shortint;
+    function const_align(want_align: longint): shortint;
+      begin
+        const_align := used_align(want_align,current_settings.alignment.constalignmin,current_settings.alignment.constalignmax);
+      end;
+
+
+    function const_align_size(siz: longint): shortint;
       begin
       begin
         siz := size_2_align(siz);
         siz := size_2_align(siz);
-        const_align := used_align(siz,current_settings.alignment.constalignmin,current_settings.alignment.constalignmax);
+        const_align_size := const_align(siz);
       end;
       end;
 
 
+
 {$ifdef ARM}
 {$ifdef ARM}
     function is_double_hilo_swapped: boolean;{$ifdef USEINLINE}inline;{$endif}
     function is_double_hilo_swapped: boolean;{$ifdef USEINLINE}inline;{$endif}
       begin
       begin

+ 6 - 6
compiler/i386/cgcpu.pas

@@ -193,7 +193,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);
+                reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
                 g_concatcopy(list,r,href,len);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -576,7 +576,7 @@ unit cgcpu;
                 selfoffsetfromsp:=2*sizeof(aint)
                 selfoffsetfromsp:=2*sizeof(aint)
               else
               else
                 selfoffsetfromsp:=sizeof(aint);
                 selfoffsetfromsp:=sizeof(aint);
-              reference_reset_base(href,NR_ESP,selfoffsetfromsp+offs);
+              reference_reset_base(href,NR_ESP,selfoffsetfromsp+offs,4);
               cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
               cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
             end;
             end;
         end;
         end;
@@ -586,7 +586,7 @@ unit cgcpu;
           href : treference;
           href : treference;
         begin
         begin
           { mov  0(%eax),%eax ; load vmt}
           { mov  0(%eax),%eax ; load vmt}
-          reference_reset_base(href,NR_EAX,0);
+          reference_reset_base(href,NR_EAX,0,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;
 
 
@@ -597,7 +597,7 @@ unit cgcpu;
           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,NR_EAX,procdef._class.vmtmethodoffset(procdef.extnumber));
+          reference_reset_base(href,NR_EAX,procdef._class.vmtmethodoffset(procdef.extnumber),4);
           list.concat(taicpu.op_ref(op,S_L,href));
           list.concat(taicpu.op_ref(op,S_L,href));
         end;
         end;
 
 
@@ -608,7 +608,7 @@ unit cgcpu;
           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,NR_EAX,procdef._class.vmtmethodoffset(procdef.extnumber));
+          reference_reset_base(href,NR_EAX,procdef._class.vmtmethodoffset(procdef.extnumber),4);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_EAX);
         end;
         end;
 
 
@@ -669,7 +669,7 @@ unit cgcpu;
                 loadvmttoeax;
                 loadvmttoeax;
                 loadmethodoffstoeax;
                 loadmethodoffstoeax;
                 { mov %eax,4(%esp) }
                 { mov %eax,4(%esp) }
-                reference_reset_base(href,NR_ESP,4);
+                reference_reset_base(href,NR_ESP,4,4);
                 list.concat(taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                 list.concat(taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                 { pop  %eax }
                 { pop  %eax }
                 list.concat(taicpu.op_reg(A_POP,S_L,NR_EAX));
                 list.concat(taicpu.op_reg(A_POP,S_L,NR_EAX));

+ 1 - 1
compiler/i386/n386mem.pas

@@ -120,7 +120,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);
+            reference_reset_base(location.reference,hreg,0,location.reference.alignment);
           end;
           end;
          { insert the new index register and scalefactor or
          { insert the new index register and scalefactor or
            do the multiplication manual }
            do the multiplication manual }

+ 5 - 5
compiler/i386/popt386.pas

@@ -177,7 +177,7 @@ begin
                            ((taicpu(hp1).opcode=A_Jcc) and
                            ((taicpu(hp1).opcode=A_Jcc) and
                             (taicpu(hp1).condition in [C_O,C_NO])))) then
                             (taicpu(hp1).condition in [C_O,C_NO])))) then
                       begin
                       begin
-                        reference_reset(tmpref);
+                        reference_reset(tmpref,1);
                         case taicpu(p).oper[0]^.val Of
                         case taicpu(p).oper[0]^.val Of
                           3: begin
                           3: begin
                              {imul 3, reg1, reg2 to
                              {imul 3, reg1, reg2 to
@@ -233,7 +233,7 @@ begin
                                         taicpu(p).oper[1]^.reg,taicpu(p).oper[1]^.reg);
                                         taicpu(p).oper[1]^.reg,taicpu(p).oper[1]^.reg);
                                     end;
                                     end;
                                   InsertLLItem(asml,p, p.next, hp1);
                                   InsertLLItem(asml,p, p.next, hp1);
-                                  reference_reset(tmpref);
+                                  reference_reset(tmpref,2);
                                   TmpRef.index := taicpu(p).oper[1]^.reg;
                                   TmpRef.index := taicpu(p).oper[1]^.reg;
                                   TmpRef.ScaleFactor := 2;
                                   TmpRef.ScaleFactor := 2;
                                   if (taicpu(p).ops = 3) then
                                   if (taicpu(p).ops = 3) then
@@ -320,7 +320,7 @@ begin
                                          hp1 :=  taicpu.op_ref_reg(A_LEA, S_L, TmpRef, taicpu(p).oper[1]^.reg);
                                          hp1 :=  taicpu.op_ref_reg(A_LEA, S_L, TmpRef, taicpu(p).oper[1]^.reg);
                                        end;
                                        end;
                                      InsertLLItem(asml,p, p.next, hp1);
                                      InsertLLItem(asml,p, p.next, hp1);
-                                     reference_reset(tmpref);
+                                     reference_reset(tmpref,2);
                                      TmpRef.index := taicpu(p).oper[1]^.reg;
                                      TmpRef.index := taicpu(p).oper[1]^.reg;
                                      if (taicpu(p).ops = 3) then
                                      if (taicpu(p).ops = 3) then
                                        begin
                                        begin
@@ -1563,7 +1563,7 @@ begin
                           TmpBool1 := True; {should we check the next instruction?}
                           TmpBool1 := True; {should we check the next instruction?}
                           TmpBool2 := False; {have we found an add/sub which could be
                           TmpBool2 := False; {have we found an add/sub which could be
                                               integrated in the lea?}
                                               integrated in the lea?}
-                          reference_reset(tmpref);
+                          reference_reset(tmpref,2);
                           TmpRef.index := taicpu(p).oper[1]^.reg;
                           TmpRef.index := taicpu(p).oper[1]^.reg;
                           TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                           TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                           while TmpBool1 and
                           while TmpBool1 and
@@ -1654,7 +1654,7 @@ begin
                     {changes "shl $2, %reg" to "lea (,%reg,4), %reg"
                     {changes "shl $2, %reg" to "lea (,%reg,4), %reg"
                             "shl $3, %reg" to "lea (,%reg,8), %reg}
                             "shl $3, %reg" to "lea (,%reg,8), %reg}
                               begin
                               begin
-                                reference_reset(tmpref);
+                                reference_reset(tmpref,2);
                                 TmpRef.index := taicpu(p).oper[1]^.reg;
                                 TmpRef.index := taicpu(p).oper[1]^.reg;
                                 TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                                 TmpRef.scalefactor := 1 shl taicpu(p).oper[0]^.val;
                                 hp1 := taicpu.Op_ref_reg(A_LEA,S_L,TmpRef, taicpu(p).oper[1]^.reg);
                                 hp1 := taicpu.Op_ref_reg(A_LEA,S_L,TmpRef, taicpu(p).oper[1]^.reg);

+ 3 - 3
compiler/i386/rropt386.pas

@@ -135,7 +135,7 @@ begin
       end;
       end;
     A_INC,A_DEC:
     A_INC,A_DEC:
       begin
       begin
-        reference_reset(tmpref);
+        reference_reset(tmpref,1);
         tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
         tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
         case p.opcode of
         case p.opcode of
           A_INC:
           A_INC:
@@ -150,7 +150,7 @@ begin
       end;
       end;
     A_SUB,A_ADD:
     A_SUB,A_ADD:
       begin
       begin
-        reference_reset(tmpref);
+        reference_reset(tmpref,1);
         tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
         tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
         case p.oper[0]^.typ of
         case p.oper[0]^.typ of
           top_const:
           top_const:
@@ -182,7 +182,7 @@ begin
       end;
       end;
     A_SHL:
     A_SHL:
       begin
       begin
-        reference_reset(tmpref);
+        reference_reset(tmpref,2);
         tmpref.index := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
         tmpref.index := newreg(R_INTREGISTER,reg1,R_SUBWHOLE);
         tmpref.scalefactor := 1 shl p.oper[0]^.val;
         tmpref.scalefactor := 1 shl p.oper[0]^.val;
         p.opcode := A_LEA;
         p.opcode := A_LEA;

+ 6 - 6
compiler/m68k/cgcpu.pas

@@ -255,7 +255,7 @@ unit cgcpu;
             else
             else
               pushsize:=int_cgsize(cgpara.alignment);
               pushsize:=int_cgsize(cgpara.alignment);
 
 
-            reference_reset_base(ref, NR_STACK_POINTER_REG, 0);
+            reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment);
             ref.direction := dir_dec;
             ref.direction := dir_dec;
             list.concat(taicpu.op_reg_ref(A_MOVE,tcgsize2opsize[pushsize],makeregsize(list,r,pushsize),ref));
             list.concat(taicpu.op_reg_ref(A_MOVE,tcgsize2opsize[pushsize],makeregsize(list,r,pushsize),ref));
           end
           end
@@ -280,7 +280,7 @@ unit cgcpu;
             else
             else
               pushsize:=int_cgsize(cgpara.alignment);
               pushsize:=int_cgsize(cgpara.alignment);
 
 
-            reference_reset_base(ref, NR_STACK_POINTER_REG, 0);
+            reference_reset_base(ref, NR_STACK_POINTER_REG, 0, cgpara.alignment);
             ref.direction := dir_dec;
             ref.direction := dir_dec;
             list.concat(taicpu.op_const_ref(A_MOVE,tcgsize2opsize[pushsize],a,ref));
             list.concat(taicpu.op_const_ref(A_MOVE,tcgsize2opsize[pushsize],a,ref));
           end
           end
@@ -320,7 +320,7 @@ unit cgcpu;
           else
           else
             pushsize:=int_cgsize(cgpara.alignment);
             pushsize:=int_cgsize(cgpara.alignment);
 
 
-          reference_reset_base(ref, NR_STACK_POINTER_REG, 0);
+          reference_reset_base(ref, NR_STACK_POINTER_REG, 0, tcgsize2size[paraloc^.size]);
           ref.direction := dir_dec;
           ref.direction := dir_dec;
 
 
           if tcgsize2size[paraloc^.size]<cgpara.alignment then
           if tcgsize2size[paraloc^.size]<cgpara.alignment then
@@ -350,7 +350,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);
+                reference_reset_base(href,NR_STACK_POINTER_REG,0,cgpara.alignment);
                 g_concatcopy(list,r,href,len);
                 g_concatcopy(list,r,href,len);
               end
               end
             else
             else
@@ -475,13 +475,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);
+            reference_reset_base(tmpref,reg,0,4);
 	  end
 	  end
 	else
 	else
 	  begin
 	  begin
 	    { if we have a data register, we need to move it to an address register first }
 	    { if we have a data register, we need to move it to an address register first }
 	    tmpreg:=getaddressregister(list);
 	    tmpreg:=getaddressregister(list);
-            reference_reset_base(tmpref,tmpreg,0);
+            reference_reset_base(tmpref,tmpreg,0,4);
 	    list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg,tmpreg));
 	    list.concat(taicpu.op_reg_reg(A_MOVE,S_L,reg,tmpreg));
 	  end;
 	  end;
 	list.concat(taicpu.op_ref(A_JSR,S_NO,tmpref));
 	list.concat(taicpu.op_ref(A_JSR,S_NO,tmpref));

+ 3 - 3
compiler/m68k/n68kcal.pas

@@ -59,16 +59,16 @@ implementation
                 begin
                 begin
 		  { save base pointer on syscalls }
 		  { save base pointer on syscalls }
 		  { FIXME: probably this will need to be extended to save all regs (KB) }
 		  { FIXME: probably this will need to be extended to save all regs (KB) }
-                  reference_reset_base(tmpref2, NR_STACK_POINTER_REG, 0);
+                  reference_reset_base(tmpref2, NR_STACK_POINTER_REG, 0, 4);
                   tmpref2.direction := dir_dec;
                   tmpref2.direction := dir_dec;
 		  current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_MOVE,S_L,NR_FRAME_POINTER_REG,tmpref2));
 		  current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_MOVE,S_L,NR_FRAME_POINTER_REG,tmpref2));
 		  
 		  
 		  { the actuall call }
 		  { the actuall call }
-                  reference_reset_base(tmpref,NR_A6,-tprocdef(procdefinition).extnumber);
+                  reference_reset_base(tmpref,NR_A6,-tprocdef(procdefinition).extnumber,4);
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_JSR,S_NO,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_ref(A_JSR,S_NO,tmpref));
 		  
 		  
 		  { restore frame pointer }
 		  { restore frame pointer }
-                  reference_reset_base(tmpref2, NR_STACK_POINTER_REG, 0);
+                  reference_reset_base(tmpref2, NR_STACK_POINTER_REG, 0, 4);
                   tmpref2.direction := dir_inc;
                   tmpref2.direction := dir_inc;
 		  current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_MOVE,S_L,tmpref2,NR_FRAME_POINTER_REG));
 		  current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(A_MOVE,S_L,tmpref2,NR_FRAME_POINTER_REG));
                 end
                 end

+ 6 - 0
compiler/ncal.pas

@@ -1781,6 +1781,7 @@ implementation
     function tcallnode.funcret_can_be_reused:boolean;
     function tcallnode.funcret_can_be_reused:boolean;
       var
       var
         realassignmenttarget: tnode;
         realassignmenttarget: tnode;
+        alignment: longint;
       begin
       begin
         result:=false;
         result:=false;
 
 
@@ -1857,6 +1858,11 @@ implementation
               and the parameter will point to the same address. That means that a change of the result variable
               and the parameter will point to the same address. That means that a change of the result variable
               will result also in a change of the parameter value }
               will result also in a change of the parameter value }
             result:=not foreachnodestatic(left,@check_funcret_used_as_para,tloadnode(realassignmenttarget).symtableentry);
             result:=not foreachnodestatic(left,@check_funcret_used_as_para,tloadnode(realassignmenttarget).symtableentry);
+            { ensure that it is aligned using the default alignment }
+            alignment:=tabstractvarsym(tloadnode(realassignmenttarget).symtableentry).vardef.alignment;
+            if (used_align(alignment,target_info.alignment.localalignmin,target_info.alignment.localalignmax)<>
+                used_align(alignment,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax)) then
+              result:=false;
             exit;
             exit;
           end;
           end;
       end;
       end;

+ 10 - 5
compiler/ncgbas.pas

@@ -167,14 +167,16 @@ interface
                           begin
                           begin
                             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));
                           end;
                           end;
                       end
                       end
                     else
                     else
                       begin
                       begin
                         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));
                         op.ref^.index:=indexreg;
                         op.ref^.index:=indexreg;
 {$ifdef x86}
 {$ifdef x86}
                         op.ref^.scalefactor:=scale;
                         op.ref^.scalefactor:=scale;
@@ -191,7 +193,8 @@ interface
                       begin
                       begin
                         op.typ:=top_ref;
                         op.typ:=top_ref;
                         new(op.ref);
                         new(op.ref);
-                        reference_reset_base(op.ref^,sym.localloc.register,sofs);
+                        { no idea about the actual alignment }
+                        reference_reset_base(op.ref^,sym.localloc.register,sofs,1);
                         op.ref^.index:=indexreg;
                         op.ref^.index:=indexreg;
 {$ifdef x86}
 {$ifdef x86}
                         op.ref^.scalefactor:=scale;
                         op.ref^.scalefactor:=scale;
@@ -380,7 +383,7 @@ interface
         { get a (persistent) temp }
         { get a (persistent) temp }
         if tempinfo^.typedef.needs_inittable then
         if tempinfo^.typedef.needs_inittable then
           begin
           begin
-            location_reset(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef));
+            location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0);
             tg.GetTempTyped(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.temptype,tempinfo^.location.reference);
             tg.GetTempTyped(current_asmdata.CurrAsmList,tempinfo^.typedef,tempinfo^.temptype,tempinfo^.location.reference);
             { the temp could have been used previously either because the memory location was reused or
             { the temp could have been used previously either because the memory location was reused or
               because we're in a loop }
               because we're in a loop }
@@ -428,7 +431,7 @@ interface
           end
           end
         else
         else
           begin
           begin
-            location_reset(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef));
+            location_reset_ref(tempinfo^.location,LOC_REFERENCE,def_cgsize(tempinfo^.typedef),0);
             tg.GetTemp(current_asmdata.CurrAsmList,size,tempinfo^.typedef.alignment,tempinfo^.temptype,tempinfo^.location.reference);
             tg.GetTemp(current_asmdata.CurrAsmList,size,tempinfo^.typedef.alignment,tempinfo^.temptype,tempinfo^.location.reference);
           end;
           end;
         include(tempinfo^.flags,ti_valid);
         include(tempinfo^.flags,ti_valid);
@@ -449,6 +452,7 @@ interface
           LOC_REFERENCE:
           LOC_REFERENCE:
             begin
             begin
               inc(location.reference.offset,offset);
               inc(location.reference.offset,offset);
+              location.reference.alignment:=newalignment(location.reference.alignment,offset);
               { ti_valid should be excluded if it's a normal temp }
               { ti_valid should be excluded if it's a normal temp }
             end;
             end;
           LOC_REGISTER,
           LOC_REGISTER,
@@ -474,6 +478,7 @@ interface
         { adapt location }
         { adapt location }
         location.reference := ref;
         location.reference := ref;
         inc(location.reference.offset,offset);
         inc(location.reference.offset,offset);
+        location.reference.alignment:=newalignment(location.reference.alignment,offset);
       end;
       end;
 
 
 
 

+ 17 - 10
compiler/ncgcal.pas

@@ -149,10 +149,10 @@ implementation
                  if tempcgpara.location^.reference.index=NR_STACK_POINTER_REG then
                  if tempcgpara.location^.reference.index=NR_STACK_POINTER_REG then
                    begin
                    begin
                      cg.g_stackpointer_alloc(current_asmdata.CurrAsmList,size);
                      cg.g_stackpointer_alloc(current_asmdata.CurrAsmList,size);
-                     reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                     reference_reset_base(href,NR_STACK_POINTER_REG,0,sizeof(pint));
                    end
                    end
                  else
                  else
-                   reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset);
+                   reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset,tempcgpara.alignment);
                  cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.location.size,left.location.size,left.location.register,href);
                  cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.location.size,left.location.size,left.location.register,href);
                end;
                end;
              LOC_MMREGISTER,
              LOC_MMREGISTER,
@@ -162,10 +162,10 @@ implementation
                  if tempcgpara.location^.reference.index=NR_STACK_POINTER_REG then
                  if tempcgpara.location^.reference.index=NR_STACK_POINTER_REG then
                    begin
                    begin
                      cg.g_stackpointer_alloc(current_asmdata.CurrAsmList,size);
                      cg.g_stackpointer_alloc(current_asmdata.CurrAsmList,size);
-                     reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                     reference_reset_base(href,NR_STACK_POINTER_REG,0,sizeof(pint));
                    end
                    end
                  else
                  else
-                   reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset);
+                   reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset,tempcgpara.alignment);
                  cg.a_loadmm_reg_ref(current_asmdata.CurrAsmList,left.location.size,left.location.size,left.location.register,href,mms_movescalar);
                  cg.a_loadmm_reg_ref(current_asmdata.CurrAsmList,left.location.size,left.location.size,left.location.register,href,mms_movescalar);
                end;
                end;
              LOC_REFERENCE,
              LOC_REFERENCE,
@@ -177,7 +177,7 @@ implementation
                    cg.a_param_ref(current_asmdata.CurrAsmList,left.location.size,left.location.reference,tempcgpara)
                    cg.a_param_ref(current_asmdata.CurrAsmList,left.location.size,left.location.reference,tempcgpara)
                  else
                  else
                    begin
                    begin
-                     reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset);
+                     reference_reset_base(href,tempcgpara.location^.reference.index,tempcgpara.location^.reference.offset,tempcgpara.alignment);
                      cg.g_concatcopy(current_asmdata.CurrAsmList,left.location.reference,href,size);
                      cg.g_concatcopy(current_asmdata.CurrAsmList,left.location.reference,href,size);
                    end;
                    end;
                end;
                end;
@@ -388,7 +388,7 @@ implementation
              if (parasym.varspez=vs_out) and
              if (parasym.varspez=vs_out) and
                 (left.resultdef.needs_inittable) then
                 (left.resultdef.needs_inittable) then
                begin
                begin
-                 location_get_data_ref(current_asmdata.CurrAsmList,left.location,href,false);
+                 location_get_data_ref(current_asmdata.CurrAsmList,left.location,href,false,sizeof(pint));
                  cg.g_decrrefcount(current_asmdata.CurrAsmList,left.resultdef,href);
                  cg.g_decrrefcount(current_asmdata.CurrAsmList,left.resultdef,href);
                end;
                end;
 
 
@@ -557,7 +557,7 @@ implementation
                   if cgsize in [OS_128,OS_S128] then
                   if cgsize in [OS_128,OS_S128] then
                     begin
                     begin
                       tg.GetTemp(current_asmdata.CurrAsmList,16,8,tt_normal,ref);
                       tg.GetTemp(current_asmdata.CurrAsmList,16,8,tt_normal,ref);
-                      location_reset(location,LOC_REFERENCE,OS_NO);
+                      location_reset_ref(location,LOC_REFERENCE,OS_NO,0);
                       location.reference:=ref;
                       location.reference:=ref;
                       cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_64,OS_64,procdefinition.funcretloc[callerside].register,ref);
                       cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_64,OS_64,procdefinition.funcretloc[callerside].register,ref);
                       inc(ref.offset,8);
                       inc(ref.offset,8);
@@ -749,6 +749,8 @@ implementation
          sizeleft: aint;
          sizeleft: aint;
          htempref,
          htempref,
          href : treference;
          href : treference;
+         calleralignment,
+         tmpalignment: longint;
        begin
        begin
          { copy all resources to the allocated registers }
          { copy all resources to the allocated registers }
          ppn:=tcgcallparanode(left);
          ppn:=tcgcallparanode(left);
@@ -762,6 +764,11 @@ implementation
                  paramanager.freeparaloc(current_asmdata.CurrAsmList,ppn.tempcgpara);
                  paramanager.freeparaloc(current_asmdata.CurrAsmList,ppn.tempcgpara);
                  tmpparaloc:=ppn.tempcgpara.location;
                  tmpparaloc:=ppn.tempcgpara.location;
                  sizeleft:=ppn.tempcgpara.intsize;
                  sizeleft:=ppn.tempcgpara.intsize;
+                 calleralignment:=ppn.parasym.paraloc[callerside].alignment;
+                 tmpalignment:=ppn.tempcgpara.alignment;
+                 if (tmpalignment=0) or
+                    (calleralignment=0) then
+                   internalerror(2009020701);
                  callerparaloc:=ppn.parasym.paraloc[callerside].location;
                  callerparaloc:=ppn.parasym.paraloc[callerside].location;
                  while assigned(callerparaloc) do
                  while assigned(callerparaloc) do
                    begin
                    begin
@@ -808,12 +815,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);
+                                reference_reset_base(href,callerparaloc^.reference.index,callerparaloc^.reference.offset,calleralignment);
                               { copy parameters in case they were moved to a temp. location because we've a fixed stack }
                               { copy parameters in case they were moved to a temp. location because we've a fixed stack }
                               case tmpparaloc^.loc of
                               case tmpparaloc^.loc of
                               LOC_REFERENCE:
                               LOC_REFERENCE:
                                   begin
                                   begin
-                                    reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset);
+                                    reference_reset_base(htempref,tmpparaloc^.reference.index,tmpparaloc^.reference.offset,tmpalignment);
                                     { use concatcopy, because it can also be a float which fails when
                                     { use concatcopy, because it can also be a float which fails when
                                       load_ref_ref is used }
                                       load_ref_ref is used }
                                     if (ppn.tempcgpara.size <> OS_NO) then
                                     if (ppn.tempcgpara.size <> OS_NO) then
@@ -967,7 +974,7 @@ implementation
 {$ifndef x86}
 {$ifndef x86}
                  pvreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
                  pvreg:=cg.getintregister(current_asmdata.CurrAsmList,OS_ADDR);
 {$endif not x86}
 {$endif not x86}
-                 reference_reset_base(href,vmtreg,vmtoffset);
+                 reference_reset_base(href,vmtreg,vmtoffset,sizeof(pint));
 {$ifndef x86}
 {$ifndef x86}
                  cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,pvreg);
                  cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,pvreg);
 {$endif not x86}
 {$endif not x86}

+ 15 - 8
compiler/ncgcnv.pas

@@ -99,7 +99,10 @@ interface
               begin
               begin
                 location.size:=newsize;
                 location.size:=newsize;
                 if (target_info.endian = ENDIAN_BIG) then
                 if (target_info.endian = ENDIAN_BIG) then
-                  inc(location.reference.offset,leftsize-ressize);
+                  begin
+                    inc(location.reference.offset,leftsize-ressize);
+                    location.reference.alignment:=newalignment(location.reference.alignment,leftsize-ressize);
+                  end;
               end
               end
             else
             else
               location_force_reg(current_asmdata.CurrAsmList,location,newsize,false);
               location_force_reg(current_asmdata.CurrAsmList,location,newsize,false);
@@ -145,6 +148,7 @@ interface
            cst_shortstring :
            cst_shortstring :
              begin
              begin
                inc(left.location.reference.offset);
                inc(left.location.reference.offset);
+               location.reference.alignment:=1;
                location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
                location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
                cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register);
                cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register);
              end;
              end;
@@ -154,7 +158,8 @@ interface
              begin
              begin
                if tstringconstnode(left).len=0 then
                if tstringconstnode(left).len=0 then
                 begin
                 begin
-                  reference_reset(hr);
+                  { FPC_EMPTYCHAR is a widechar -> 2 bytes }
+                  reference_reset(hr,2);
                   hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR');
                   hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR');
                   location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
                   location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
                   cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,hr,location.register);
                   cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,hr,location.register);
@@ -207,7 +212,8 @@ interface
     procedure tcgtypeconvnode.second_pointer_to_array;
     procedure tcgtypeconvnode.second_pointer_to_array;
 
 
       begin
       begin
-        location_reset(location,LOC_REFERENCE,OS_NO);
+        { assume natural alignment }
+        location_reset_ref(location,LOC_REFERENCE,OS_NO,resultdef.alignment);
         case left.location.loc of
         case left.location.loc of
           LOC_CREGISTER,
           LOC_CREGISTER,
           LOC_REGISTER :
           LOC_REGISTER :
@@ -239,11 +245,11 @@ interface
 
 
     procedure tcgtypeconvnode.second_char_to_string;
     procedure tcgtypeconvnode.second_char_to_string;
       begin
       begin
-         location_reset(location,LOC_REFERENCE,OS_NO);
+         location_reset_ref(location,LOC_REFERENCE,OS_NO,2);
          case tstringdef(resultdef).stringtype of
          case tstringdef(resultdef).stringtype of
            st_shortstring :
            st_shortstring :
              begin
              begin
-               tg.GetTemp(current_asmdata.CurrAsmList,256,1,tt_normal,location.reference);
+               tg.GetTemp(current_asmdata.CurrAsmList,256,2,tt_normal,location.reference);
                cg.a_load_loc_ref(current_asmdata.CurrAsmList,left.location.size,left.location,
                cg.a_load_loc_ref(current_asmdata.CurrAsmList,left.location.size,left.location,
                  location.reference);
                  location.reference);
                location_freetemp(current_asmdata.CurrAsmList,left.location);
                location_freetemp(current_asmdata.CurrAsmList,left.location);
@@ -274,7 +280,7 @@ interface
              { round them down to the proper precision }
              { round them down to the proper precision }
              tg.gettemp(current_asmdata.currasmlist,resultdef.size,resultdef.alignment,tt_normal,tr);
              tg.gettemp(current_asmdata.currasmlist,resultdef.size,resultdef.alignment,tt_normal,tr);
              cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.location.size,location.size,left.location.register,tr);
              cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,left.location.size,location.size,left.location.register,tr);
-             location_reset(left.location,LOC_REFERENCE,location.size);
+             location_reset_ref(left.location,LOC_REFERENCE,location.size,tr.alignment);
              left.location.reference:=tr;
              left.location.reference:=tr;
            end;
            end;
 {$endif x86}
 {$endif x86}
@@ -369,7 +375,7 @@ interface
 
 
     begin
     begin
       tg.gettemp(current_asmdata.currasmlist,2*sizeof(puint),sizeof(puint),tt_normal,r);
       tg.gettemp(current_asmdata.currasmlist,2*sizeof(puint),sizeof(puint),tt_normal,r);
-      location_reset(location,LOC_REFERENCE,OS_NO);
+      location_reset_ref(location,LOC_REFERENCE,OS_NO,0);
       location.reference:=r;
       location.reference:=r;
       cg.a_load_const_ref(current_asmdata.currasmlist,OS_ADDR,0,r);
       cg.a_load_const_ref(current_asmdata.currasmlist,OS_ADDR,0,r);
       inc(r.offset,sizeof(puint));
       inc(r.offset,sizeof(puint));
@@ -472,7 +478,8 @@ interface
               internalerror(2002032214);
               internalerror(2002032214);
          end;
          end;
          cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_ADDR,OC_NE,0,location.register,l1);
          cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_ADDR,OC_NE,0,location.register,l1);
-         reference_reset(hr);
+         { FPC_EMPTYCHAR is a widechar -> 2 bytes }
+         reference_reset(hr,2);
          hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR');
          hr.symbol:=current_asmdata.RefAsmSymbol('FPC_EMPTYCHAR');
          cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,hr,location.register);
          cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,hr,location.register);
          cg.a_label(current_asmdata.CurrAsmList,l1);
          cg.a_label(current_asmdata.CurrAsmList,l1);

+ 8 - 8
compiler/ncgcon.pas

@@ -85,7 +85,7 @@ implementation
         i : longint;
         i : longint;
         b : byte;
         b : byte;
       begin
       begin
-        location_reset(location,LOC_CREFERENCE,OS_NO);
+        location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(maxalign));
         current_asmdata.getdatalabel(l);
         current_asmdata.getdatalabel(l);
         maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
         maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
         new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata,l.name,const_align(maxalign));
         new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata,l.name,const_align(maxalign));
@@ -118,7 +118,7 @@ implementation
 {$endif ARM}
 {$endif ARM}
 
 
       begin
       begin
-        location_reset(location,LOC_CREFERENCE,def_cgsize(resultdef));
+        location_reset_ref(location,LOC_CREFERENCE,def_cgsize(resultdef),const_align(resultdef.alignment));
         lastlabel:=nil;
         lastlabel:=nil;
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
         realait:=floattype2ait[tfloatdef(resultdef).floattype];
 {$ifdef ARM}
 {$ifdef ARM}
@@ -167,7 +167,7 @@ implementation
                   current_asmdata.getdatalabel(lastlabel);
                   current_asmdata.getdatalabel(lastlabel);
                   lab_real:=lastlabel;
                   lab_real:=lastlabel;
                   maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
                   maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
-                  new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(resultdef.size));
+                  new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(resultdef.alignment));
                   current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel));
                   current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel));
                   case realait of
                   case realait of
                     ait_real_32bit :
                     ait_real_32bit :
@@ -405,13 +405,13 @@ implementation
          if cst_type in [cst_ansistring, cst_widestring, cst_unicodestring] then
          if cst_type in [cst_ansistring, cst_widestring, cst_unicodestring] then
            begin
            begin
              location_reset(location, LOC_REGISTER, OS_ADDR);
              location_reset(location, LOC_REGISTER, OS_ADDR);
-             reference_reset_symbol(href, lab_str, 0);
+             reference_reset_symbol(href, lab_str, 0, const_align(sizeof(pint)));
              location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
              location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
              cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
              cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
            end
            end
          else
          else
            begin
            begin
-             location_reset(location, LOC_CREFERENCE, def_cgsize(resultdef));
+             location_reset_ref(location, LOC_CREFERENCE, def_cgsize(resultdef), const_align(sizeof(pint)));
              location.reference.symbol:=lab_str;
              location.reference.symbol:=lab_str;
            end;
            end;
       end;
       end;
@@ -464,7 +464,7 @@ implementation
            i           : longint;
            i           : longint;
            neededtyp   : taiconst_type;
            neededtyp   : taiconst_type;
         begin
         begin
-          location_reset(location,LOC_CREFERENCE,OS_NO);
+          location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(8));
           neededtyp:=aitconst_8bit;
           neededtyp:=aitconst_8bit;
           lastlabel:=nil;
           lastlabel:=nil;
           { const already used ? }
           { const already used ? }
@@ -534,7 +534,7 @@ implementation
                    current_asmdata.getdatalabel(lastlabel);
                    current_asmdata.getdatalabel(lastlabel);
                    lab_set:=lastlabel;
                    lab_set:=lastlabel;
                    maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
                    maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
-                   new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(sizeof(pint)));
+                   new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.name,const_align(8));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel));
                    if (source_info.endian=target_info.endian) then
                    if (source_info.endian=target_info.endian) then
 {$if defined(FPC_NEW_BIGENDIAN_SETS) or defined(FPC_LITTLE_ENDIAN)}
 {$if defined(FPC_NEW_BIGENDIAN_SETS) or defined(FPC_LITTLE_ENDIAN)}
@@ -583,7 +583,7 @@ implementation
         tmplabel : TAsmLabel;
         tmplabel : TAsmLabel;
         i : integer;
         i : integer;
       begin
       begin
-        location_reset(location,LOC_CREFERENCE,OS_NO);
+        location_reset_ref(location,LOC_CREFERENCE,OS_NO,const_align(16));
         { label for GUID }
         { label for GUID }
         current_asmdata.getdatalabel(tmplabel);
         current_asmdata.getdatalabel(tmplabel);
         current_asmdata.asmlists[al_typedconsts].concat(tai_align.create(const_align(16)));
         current_asmdata.asmlists[al_typedconsts].concat(tai_align.create(const_align(16)));

+ 2 - 2
compiler/ncgflw.pas

@@ -960,7 +960,7 @@ implementation
                    { get current address }
                    { get current address }
                    current_asmdata.getaddrlabel(a);
                    current_asmdata.getaddrlabel(a);
                    cg.a_label(current_asmdata.CurrAsmList,a);
                    cg.a_label(current_asmdata.CurrAsmList,a);
-                   reference_reset_symbol(href2,a,0);
+                   reference_reset_symbol(href2,a,0,1);
                    { push current frame }
                    { push current frame }
                    paramanager.allocparaloc(current_asmdata.CurrAsmList,paraloc3);
                    paramanager.allocparaloc(current_asmdata.CurrAsmList,paraloc3);
                    cg.a_param_reg(current_asmdata.CurrAsmList,OS_ADDR,NR_FRAME_POINTER_REG,paraloc3);
                    cg.a_param_reg(current_asmdata.CurrAsmList,OS_ADDR,NR_FRAME_POINTER_REG,paraloc3);
@@ -1296,7 +1296,7 @@ implementation
          current_asmdata.getjumplabel(nextonlabel);
          current_asmdata.getjumplabel(nextonlabel);
 
 
          { send the vmt parameter }
          { send the vmt parameter }
-         reference_reset_symbol(href2,current_asmdata.RefAsmSymbol(excepttype.vmt_mangledname),0);
+         reference_reset_symbol(href2,current_asmdata.RefAsmSymbol(excepttype.vmt_mangledname),0,sizeof(pint));
          paramanager.getintparaloc(pocall_default,1,paraloc1);
          paramanager.getintparaloc(pocall_default,1,paraloc1);
          paramanager.allocparaloc(current_asmdata.CurrAsmList,paraloc1);
          paramanager.allocparaloc(current_asmdata.CurrAsmList,paraloc1);
          cg.a_paramaddr_ref(current_asmdata.CurrAsmList,href2,paraloc1);
          cg.a_paramaddr_ref(current_asmdata.CurrAsmList,href2,paraloc1);

+ 14 - 15
compiler/ncginl.pas

@@ -265,7 +265,7 @@ implementation
         if left.nodetype=typen then
         if left.nodetype=typen then
           begin
           begin
             hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
             hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
-            reference_reset_symbol(href,current_asmdata.RefAsmSymbol(tobjectdef(left.resultdef).vmt_mangledname),0);
+            reference_reset_symbol(href,current_asmdata.RefAsmSymbol(tobjectdef(left.resultdef).vmt_mangledname),0,sizeof(pint));
             cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
             cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
           end
           end
         else
         else
@@ -284,7 +284,7 @@ implementation
                   else
                   else
                    begin
                    begin
                      { load VMT pointer }
                      { load VMT pointer }
-                     reference_reset_base(hrefvmt,left.location.register,tobjectdef(left.resultdef).vmt_offset);
+                     reference_reset_base(hrefvmt,left.location.register,tobjectdef(left.resultdef).vmt_offset,sizeof(pint));
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hrefvmt,hregister);
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hrefvmt,hregister);
                    end
                    end
                 end;
                 end;
@@ -297,14 +297,17 @@ implementation
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,hregister);
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,hregister);
                      cg.g_maybe_testself(current_asmdata.CurrAsmList,hregister);
                      cg.g_maybe_testself(current_asmdata.CurrAsmList,hregister);
                      { load VMT pointer }
                      { load VMT pointer }
-                     reference_reset_base(hrefvmt,hregister,tobjectdef(left.resultdef).vmt_offset);
+                     reference_reset_base(hrefvmt,hregister,tobjectdef(left.resultdef).vmt_offset,sizeof(pint));
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hrefvmt,hregister);
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hrefvmt,hregister);
                    end
                    end
                   else
                   else
                    begin
                    begin
                      { load VMT pointer, but not for classrefdefs }
                      { load VMT pointer, but not for classrefdefs }
                      if (left.resultdef.typ=objectdef) then
                      if (left.resultdef.typ=objectdef) then
-                       inc(left.location.reference.offset,tobjectdef(left.resultdef).vmt_offset);
+                       begin
+                         inc(left.location.reference.offset,tobjectdef(left.resultdef).vmt_offset);
+                         left.location.reference.alignment:=newalignment(left.location.reference.alignment,tobjectdef(left.resultdef).vmt_offset);
+                       end;
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,hregister);
                      cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,hregister);
                    end;
                    end;
                 end;
                 end;
@@ -315,7 +318,7 @@ implementation
         { in sizeof load size }
         { in sizeof load size }
         if inlinenumber=in_sizeof_x then
         if inlinenumber=in_sizeof_x then
            begin
            begin
-             reference_reset_base(href,hregister,0);
+             reference_reset_base(href,hregister,0,sizeof(pint));
              hregister:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT);
              hregister:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT);
              cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,href,hregister);
              cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,href,hregister);
            end;
            end;
@@ -348,13 +351,13 @@ implementation
            cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_ADDR,OC_EQ,0,left.location.register,lengthlab);
            cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_ADDR,OC_EQ,0,left.location.register,lengthlab);
            if is_widestring(left.resultdef) and (tf_winlikewidestring in target_info.flags) then
            if is_widestring(left.resultdef) and (tf_winlikewidestring in target_info.flags) then
              begin
              begin
-               reference_reset_base(href,left.location.register,-sizeof(dword));
+               reference_reset_base(href,left.location.register,-sizeof(dword),sizeof(dword));
                hregister:=cg.makeregsize(current_asmdata.CurrAsmList,left.location.register,OS_INT);
                hregister:=cg.makeregsize(current_asmdata.CurrAsmList,left.location.register,OS_INT);
                cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_32,OS_INT,href,hregister);
                cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_32,OS_INT,href,hregister);
              end
              end
            else
            else
              begin
              begin
-               reference_reset_base(href,left.location.register,-sizeof(pint));
+               reference_reset_base(href,left.location.register,-sizeof(pint),sizeof(pint));
                hregister:=cg.makeregsize(current_asmdata.CurrAsmList,left.location.register,OS_INT);
                hregister:=cg.makeregsize(current_asmdata.CurrAsmList,left.location.register,OS_INT);
                cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,href,hregister);
                cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,href,hregister);
              end;
              end;
@@ -508,7 +511,7 @@ 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_symbol(href,RTTIWriter.get_rtti_label(left.resultdef,fullrtti),0);
+          reference_reset_symbol(href,RTTIWriter.get_rtti_label(left.resultdef,fullrtti),0,sizeof(pint));
           cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
           cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
         end;
         end;
 
 
@@ -691,7 +694,7 @@ implementation
         end
         end
       else
       else
         begin
         begin
-          location_reset(location,LOC_REFERENCE,OS_ADDR);
+          location_reset_ref(location,LOC_REFERENCE,OS_ADDR,sizeof(pint));
           location.reference.base:=frame_reg;
           location.reference.base:=frame_reg;
         end;
         end;
     end;
     end;
@@ -704,18 +707,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);
+            reference_reset_base(frame_ref,NR_STACK_POINTER_REG,{current_procinfo.calc_stackframe_size}tg.lasttemp,sizeof(pint));
             cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
             cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
           end
           end
         else
         else
           begin
           begin
             location_reset(location,LOC_REGISTER,OS_ADDR);
             location_reset(location,LOC_REGISTER,OS_ADDR);
             location.register:=cg.getaddressregister(current_asmdata.currasmlist);
             location.register:=cg.getaddressregister(current_asmdata.currasmlist);
-          {$ifdef cpu64bitaddr}
-            reference_reset_base(frame_ref,current_procinfo.framepointer,8);
-          {$else}
-            reference_reset_base(frame_ref,current_procinfo.framepointer,4);
-          {$endif}
+            reference_reset_base(frame_ref,current_procinfo.framepointer,sizeof(pint),sizeof(pint));
             cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
             cg.a_load_ref_reg(current_asmdata.currasmlist,OS_ADDR,OS_ADDR,frame_ref,location.register);
           end;
           end;
       end;
       end;

+ 43 - 30
compiler/ncgld.pas

@@ -56,7 +56,7 @@ implementation
       systems,
       systems,
       verbose,globtype,globals,constexp,
       verbose,globtype,globals,constexp,
       nutils,
       nutils,
-      symconst,symtype,symdef,symsym,defutil,paramgr,
+      symtable,symconst,symtype,symdef,symsym,defutil,paramgr,
       ncnv,ncon,nmem,nbas,ncgrtti,
       ncnv,ncon,nmem,nbas,ncgrtti,
       aasmbase,aasmtai,aasmdata,aasmcpu,
       aasmbase,aasmtai,aasmdata,aasmcpu,
       cgbase,pass_2,
       cgbase,pass_2,
@@ -225,7 +225,8 @@ implementation
       begin
       begin
         { we don't know the size of all arrays }
         { we don't know the size of all arrays }
         newsize:=def_cgsize(resultdef);
         newsize:=def_cgsize(resultdef);
-        location_reset(location,LOC_REFERENCE,newsize);
+        { alignment is overridden per case below }
+        location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment);
         case symtableentry.typ of
         case symtableentry.typ of
            absolutevarsym :
            absolutevarsym :
               begin
               begin
@@ -249,7 +250,7 @@ implementation
              begin
              begin
                 if tconstsym(symtableentry).consttyp=constresourcestring then
                 if tconstsym(symtableentry).consttyp=constresourcestring then
                   begin
                   begin
-                     location_reset(location,LOC_CREFERENCE,OS_ADDR);
+                     location_reset_ref(location,LOC_CREFERENCE,OS_ADDR,sizeof(pint));
                      location.reference.symbol:=current_asmdata.RefAsmSymbol(make_mangledname('RESSTR',symtableentry.owner,symtableentry.name));
                      location.reference.symbol:=current_asmdata.RefAsmSymbol(make_mangledname('RESSTR',symtableentry.owner,symtableentry.name));
                      { Resourcestring layout:
                      { Resourcestring layout:
                          TResourceStringRecord = Packed Record
                          TResourceStringRecord = Packed Record
@@ -269,12 +270,19 @@ implementation
                gvs:=tstaticvarsym(symtableentry);
                gvs:=tstaticvarsym(symtableentry);
                if ([vo_is_dll_var,vo_is_external] * gvs.varoptions <> []) then
                if ([vo_is_dll_var,vo_is_external] * gvs.varoptions <> []) then
                  begin
                  begin
+                  { assume external variables use the default alignment }
+                  location.reference.alignment:=gvs.vardef.alignment;
                    location.reference.base := cg.g_indirect_sym_load(current_asmdata.CurrAsmList,tstaticvarsym(symtableentry).mangledname,
                    location.reference.base := cg.g_indirect_sym_load(current_asmdata.CurrAsmList,tstaticvarsym(symtableentry).mangledname,
                      vo_is_weak_external in gvs.varoptions);
                      vo_is_weak_external in gvs.varoptions);
                    if (location.reference.base <> NR_NO) then
                    if (location.reference.base <> NR_NO) then
                      exit;
                      exit;
+                 end
+               else
+                 begin
+                   location.reference.alignment:=var_align(gvs.vardef.alignment);
                  end;
                  end;
 
 
+
                if (vo_is_dll_var in gvs.varoptions) then
                if (vo_is_dll_var in gvs.varoptions) then
                { DLL variable }
                { DLL variable }
                  begin
                  begin
@@ -284,7 +292,7 @@ implementation
                    else
                    else
                      location.reference.symbol:=current_asmdata.WeakRefAsmSymbol(tstaticvarsym(symtableentry).mangledname);
                      location.reference.symbol:=current_asmdata.WeakRefAsmSymbol(tstaticvarsym(symtableentry).mangledname);
                    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);
+                   reference_reset_base(location.reference,hregister,0,location.reference.alignment);
                  end
                  end
                { Thread variable }
                { Thread variable }
                else if (vo_is_thread_var in gvs.varoptions) and
                else if (vo_is_thread_var in gvs.varoptions) and
@@ -294,9 +302,9 @@ implementation
                       begin
                       begin
                         if gvs.localloc.loc=LOC_INVALID then
                         if gvs.localloc.loc=LOC_INVALID then
                           if not(vo_is_weak_external in gvs.varoptions) then
                           if not(vo_is_weak_external in gvs.varoptions) then
-                            reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname),0)
+                            reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname),0,location.reference.alignment)
                           else
                           else
-                            reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),0)
+                            reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),0,location.reference.alignment)
                         else
                         else
                           location:=gvs.localloc;
                           location:=gvs.localloc;
 {$ifdef i386}
 {$ifdef i386}
@@ -326,14 +334,14 @@ implementation
                         paraloc1.init;
                         paraloc1.init;
                         paramanager.getintparaloc(pocall_default,1,paraloc1);
                         paramanager.getintparaloc(pocall_default,1,paraloc1);
                         hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
                         hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
-                        reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE'),0);
+                        reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_THREADVAR_RELOCATE'),0,sizeof(pint));
                         cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister);
                         cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister);
                         cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_ADDR,OC_EQ,0,hregister,norelocatelab);
                         cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,OS_ADDR,OC_EQ,0,hregister,norelocatelab);
                         { don't save the allocated register else the result will be destroyed later }
                         { don't save the allocated register else the result will be destroyed later }
                         if not(vo_is_weak_external in gvs.varoptions) then
                         if not(vo_is_weak_external in gvs.varoptions) then
-                          reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname),0)
+                          reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname),0,sizeof(pint))
                         else
                         else
-                          reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),0);
+                          reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),0,sizeof(pint));
                         paramanager.allocparaloc(current_asmdata.CurrAsmList,paraloc1);
                         paramanager.allocparaloc(current_asmdata.CurrAsmList,paraloc1);
                         cg.a_param_ref(current_asmdata.CurrAsmList,OS_32,href,paraloc1);
                         cg.a_param_ref(current_asmdata.CurrAsmList,OS_32,href,paraloc1);
                         paramanager.freeparaloc(current_asmdata.CurrAsmList,paraloc1);
                         paramanager.freeparaloc(current_asmdata.CurrAsmList,paraloc1);
@@ -352,9 +360,9 @@ implementation
                             0 - Threadvar index
                             0 - Threadvar index
                             4 - Threadvar value in single threading }
                             4 - Threadvar value in single threading }
                         if not(vo_is_weak_external in gvs.varoptions) then
                         if not(vo_is_weak_external in gvs.varoptions) then
-                          reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname),sizeof(pint))
+                          reference_reset_symbol(href,current_asmdata.RefAsmSymbol(gvs.mangledname),sizeof(pint),sizeof(pint))
                         else
                         else
-                          reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),sizeof(pint));
+                          reference_reset_symbol(href,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),sizeof(pint),sizeof(pint));
                         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
                         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister);
                         cg.a_label(current_asmdata.CurrAsmList,endrelocatelab);
                         cg.a_label(current_asmdata.CurrAsmList,endrelocatelab);
                         location.reference.base:=hregister;
                         location.reference.base:=hregister;
@@ -365,9 +373,9 @@ implementation
                   begin
                   begin
                     if gvs.localloc.loc=LOC_INVALID then
                     if gvs.localloc.loc=LOC_INVALID then
                       if not(vo_is_weak_external in gvs.varoptions) then
                       if not(vo_is_weak_external in gvs.varoptions) then
-                        reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname),0)
+                        reference_reset_symbol(location.reference,current_asmdata.RefAsmSymbol(gvs.mangledname),0,location.reference.alignment)
                       else
                       else
-                        reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),0)
+                        reference_reset_symbol(location.reference,current_asmdata.WeakRefAsmSymbol(gvs.mangledname),0,location.reference.alignment)
                     else
                     else
                       location:=gvs.localloc;
                       location:=gvs.localloc;
                   end;
                   end;
@@ -376,7 +384,6 @@ implementation
                 if (gvs.varspez=vs_const) and
                 if (gvs.varspez=vs_const) and
                    (location.loc=LOC_REFERENCE) then
                    (location.loc=LOC_REFERENCE) then
                   location.loc:=LOC_CREFERENCE;
                   location.loc:=LOC_CREFERENCE;
-                location.reference.alignment:=gvs.vardef.alignment;
               end;
               end;
             paravarsym,
             paravarsym,
             localvarsym :
             localvarsym :
@@ -390,13 +397,13 @@ implementation
                       internalerror(200309286);
                       internalerror(200309286);
                     if vs.localloc.loc<>LOC_REFERENCE then
                     if vs.localloc.loc<>LOC_REFERENCE then
                       internalerror(200409241);
                       internalerror(200409241);
-                    reference_reset_base(location.reference,left.location.register,vs.localloc.reference.offset);
+                    reference_reset_base(location.reference,left.location.register,vs.localloc.reference.offset,vs.localloc.reference.alignment);
                   end
                   end
                 else
                 else
                   location:=vs.localloc;
                   location:=vs.localloc;
 
 
                 { handle call by reference variables when they are not
                 { handle call by reference variables when they are not
-                  alreayd copied to local copies. Also ignore the reference
+                  already copied to local copies. Also ignore the reference
                   when we need to load the self pointer for objects }
                   when we need to load the self pointer for objects }
                 if is_addr_param_load then
                 if is_addr_param_load then
                   begin
                   begin
@@ -409,7 +416,12 @@ implementation
                         location.size:=OS_ADDR;
                         location.size:=OS_ADDR;
                         cg.a_load_loc_reg(current_asmdata.CurrAsmList,location.size,location,hregister);
                         cg.a_load_loc_reg(current_asmdata.CurrAsmList,location.size,location,hregister);
                       end;
                       end;
-                    location_reset(location,LOC_REFERENCE,newsize);
+                    { assume packed records may always be unaligned }
+                    if not(resultdef.typ in [recorddef,objectdef]) or
+                       (tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
+                      location_reset_ref(location,LOC_REFERENCE,newsize,resultdef.alignment)
+                    else
+                      location_reset_ref(location,LOC_REFERENCE,newsize,1);
                     location.reference.base:=hregister;
                     location.reference.base:=hregister;
                   end;
                   end;
 
 
@@ -425,9 +437,9 @@ implementation
                  if assigned(left) then
                  if assigned(left) then
                    begin
                    begin
                      {$if sizeof(pint) = 4}
                      {$if sizeof(pint) = 4}
-                        location_reset(location,LOC_CREFERENCE,OS_64);
+                        location_reset_ref(location,LOC_CREFERENCE,OS_64,sizeof(pint));
                      {$else} {$if sizeof(pint) = 8}
                      {$else} {$if sizeof(pint) = 8}
-                        location_reset(location,LOC_CREFERENCE,OS_128);
+                        location_reset_ref(location,LOC_CREFERENCE,OS_128,sizeof(pint));
                      {$else}
                      {$else}
                         internalerror(20020520);
                         internalerror(20020520);
                      {$endif} {$endif}
                      {$endif} {$endif}
@@ -473,12 +485,12 @@ implementation
                          if (left.resultdef.typ<>classrefdef) then
                          if (left.resultdef.typ<>classrefdef) then
                            begin
                            begin
                              { load vmt pointer }
                              { load vmt pointer }
-                             reference_reset_base(href,hregister,0);
+                             reference_reset_base(href,hregister,0,sizeof(pint));
                              hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
                              hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
                              cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister);
                              cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister);
                            end;
                            end;
                          { load method address }
                          { load method address }
-                         reference_reset_base(href,hregister,procdef._class.vmtmethodoffset(procdef.extnumber));
+                         reference_reset_base(href,hregister,procdef._class.vmtmethodoffset(procdef.extnumber),sizeof(pint));
                          hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
                          hregister:=cg.getaddressregister(current_asmdata.CurrAsmList);
                          cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister);
                          cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister);
                          { ... and store it }
                          { ... and store it }
@@ -487,7 +499,7 @@ implementation
                      else
                      else
                        begin
                        begin
                          { load address of the function }
                          { load address of the function }
-                         reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0);
+                         reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0,sizeof(pint));
                          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);
                          cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hregister,location.reference);
                          cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hregister,location.reference);
@@ -562,7 +574,7 @@ implementation
               not is_constnode(right) then
               not is_constnode(right) then
             begin
             begin
               location_force_mem(current_asmdata.CurrAsmList,right.location);
               location_force_mem(current_asmdata.CurrAsmList,right.location);
-              location_get_data_ref(current_asmdata.CurrAsmList,right.location,href,false);
+              location_get_data_ref(current_asmdata.CurrAsmList,right.location,href,false,sizeof(pint));
               cg.g_incrrefcount(current_asmdata.CurrAsmList,right.resultdef,href);
               cg.g_incrrefcount(current_asmdata.CurrAsmList,right.resultdef,href);
             end;
             end;
            if codegenerror then
            if codegenerror then
@@ -574,7 +586,7 @@ implementation
            { decrement destination reference counter }
            { decrement destination reference counter }
            if (left.resultdef.needs_inittable) then
            if (left.resultdef.needs_inittable) then
              begin
              begin
-               location_get_data_ref(current_asmdata.CurrAsmList,left.location,href,false);
+               location_get_data_ref(current_asmdata.CurrAsmList,left.location,href,false,sizeof(pint));
                cg.g_decrrefcount(current_asmdata.CurrAsmList,left.resultdef,href);
                cg.g_decrrefcount(current_asmdata.CurrAsmList,left.resultdef,href);
              end;
              end;
            if codegenerror then
            if codegenerror then
@@ -587,7 +599,7 @@ implementation
            { decrement destination reference counter }
            { decrement destination reference counter }
            if (left.resultdef.needs_inittable) then
            if (left.resultdef.needs_inittable) then
              begin
              begin
-               location_get_data_ref(current_asmdata.CurrAsmList,left.location,href,false);
+               location_get_data_ref(current_asmdata.CurrAsmList,left.location,href,false,sizeof(pint));
                cg.g_decrrefcount(current_asmdata.CurrAsmList,left.resultdef,href);
                cg.g_decrrefcount(current_asmdata.CurrAsmList,left.resultdef,href);
              end;
              end;
            if codegenerror then
            if codegenerror then
@@ -609,7 +621,7 @@ implementation
               (right.nodetype<>stringconstn) then
               (right.nodetype<>stringconstn) then
              begin
              begin
                location_force_mem(current_asmdata.CurrAsmList,right.location);
                location_force_mem(current_asmdata.CurrAsmList,right.location);
-               location_get_data_ref(current_asmdata.CurrAsmList,right.location,href,false);
+               location_get_data_ref(current_asmdata.CurrAsmList,right.location,href,false,sizeof(pint));
                cg.g_incrrefcount(current_asmdata.CurrAsmList,right.resultdef,href);
                cg.g_incrrefcount(current_asmdata.CurrAsmList,right.resultdef,href);
              end;
              end;
 
 
@@ -765,7 +777,7 @@ implementation
                             if releaseright then
                             if releaseright then
                               location_freetemp(current_asmdata.CurrAsmList,right.location);
                               location_freetemp(current_asmdata.CurrAsmList,right.location);
                             releaseright:=true;
                             releaseright:=true;
-                            location_reset(right.location,LOC_REFERENCE,left.location.size);
+                            location_reset_ref(right.location,LOC_REFERENCE,left.location.size,0);
                             right.location.reference:=href;
                             right.location.reference:=href;
                           end;
                           end;
 {$endif}
 {$endif}
@@ -838,7 +850,7 @@ implementation
                           { extended into a double/single, since sse doesn't support extended) }
                           { extended into a double/single, since sse doesn't support extended) }
                           tg.gettemp(current_asmdata.CurrAsmList,left.resultdef.size,left.resultdef.alignment,tt_normal,href);
                           tg.gettemp(current_asmdata.CurrAsmList,left.resultdef.size,left.resultdef.alignment,tt_normal,href);
                           cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,right.location.size,left.location.size,right.location.register,href);
                           cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,right.location.size,left.location.size,right.location.register,href);
-                          location_reset(right.location,LOC_REFERENCE,left.location.size);
+                          location_reset_ref(right.location,LOC_REFERENCE,left.location.size,0);
                           right.location.reference:=href;
                           right.location.reference:=href;
                         end;
                         end;
 {$endif}
 {$endif}
@@ -977,7 +989,8 @@ implementation
             elesize:=tarraydef(resultdef).elesize;
             elesize:=tarraydef(resultdef).elesize;
             elealign:=tarraydef(resultdef).elementdef.alignment;
             elealign:=tarraydef(resultdef).elementdef.alignment;
           end;
           end;
-        location_reset(location,LOC_CREFERENCE,OS_NO);
+        { alignment is filled in by tg.gettemp below }
+        location_reset_ref(location,LOC_CREFERENCE,OS_NO,0);
         fillchar(paraloc,sizeof(paraloc),0);
         fillchar(paraloc,sizeof(paraloc),0);
         { Allocate always a temp, also if no elements are required, to
         { Allocate always a temp, also if no elements are required, to
           be sure that location is valid (PFV) }
           be sure that location is valid (PFV) }
@@ -1178,7 +1191,7 @@ implementation
 
 
     procedure tcgrttinode.pass_generate_code;
     procedure tcgrttinode.pass_generate_code;
       begin
       begin
-        location_reset(location,LOC_CREFERENCE,OS_NO);
+        location_reset_ref(location,LOC_CREFERENCE,OS_NO,sizeof(pint));
         case rttidatatype of
         case rttidatatype of
           rdt_normal:
           rdt_normal:
             location.reference.symbol:=RTTIWriter.get_rtti_label(rttidef,rttitype);
             location.reference.symbol:=RTTIWriter.get_rtti_label(rttidef,rttitype);

+ 31 - 21
compiler/ncgmem.pas

@@ -102,7 +102,8 @@ implementation
          if (left.nodetype=typen) then
          if (left.nodetype=typen) then
            begin
            begin
              reference_reset_symbol(href,
              reference_reset_symbol(href,
-               current_asmdata.RefAsmSymbol(tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname),0);
+               current_asmdata.RefAsmSymbol(tobjectdef(tclassrefdef(resultdef).pointeddef).vmt_mangledname),0,
+               sizeof(pint));
              location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
              location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
              cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
              cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
            end
            end
@@ -153,7 +154,7 @@ implementation
                 if hsym.localloc.loc<>LOC_REFERENCE then
                 if hsym.localloc.loc<>LOC_REFERENCE then
                   internalerror(200309283);
                   internalerror(200309283);
 
 
-                reference_reset_base(href,location.register,hsym.localloc.reference.offset);
+                reference_reset_base(href,location.register,hsym.localloc.reference.offset,sizeof(pint));
                 cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,location.register);
                 cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,location.register);
               end;
               end;
           end;
           end;
@@ -185,7 +186,12 @@ implementation
         paraloc1 : tcgpara;
         paraloc1 : tcgpara;
       begin
       begin
          secondpass(left);
          secondpass(left);
-         location_reset(location,LOC_REFERENCE,def_cgsize(resultdef));
+         { assume natural alignment, except for packed records }
+         if not(resultdef.typ in [recorddef,objectdef]) or
+            (tabstractrecordsymtable(tabstractrecorddef(resultdef).symtable).usefieldalignment<>1) then
+           location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),resultdef.alignment)
+         else
+           location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),1);
          case left.location.loc of
          case left.location.loc of
             LOC_CREGISTER,
             LOC_CREGISTER,
             LOC_REGISTER:
             LOC_REGISTER:
@@ -250,7 +256,8 @@ implementation
          { classes and interfaces must be dereferenced implicit }
          { classes and interfaces must be dereferenced implicit }
          if is_class_or_interface(left.resultdef) then
          if is_class_or_interface(left.resultdef) then
            begin
            begin
-             location_reset(location,LOC_REFERENCE,def_cgsize(resultdef));
+             { the contents of a class are aligned to a sizeof(pointer) }
+             location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),sizeof(pint));
              case left.location.loc of
              case left.location.loc of
                 LOC_CREGISTER,
                 LOC_CREGISTER,
                 LOC_REGISTER:
                 LOC_REGISTER:
@@ -289,7 +296,7 @@ implementation
            end
            end
          else if is_interfacecom(left.resultdef) then
          else if is_interfacecom(left.resultdef) then
            begin
            begin
-             location_reset(location,LOC_REFERENCE,def_cgsize(resultdef));
+             location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),sizeof(pint));
              tg.GetTempTyped(current_asmdata.CurrAsmList,left.resultdef,tt_normal,location.reference);
              tg.GetTempTyped(current_asmdata.CurrAsmList,left.resultdef,tt_normal,location.reference);
              cg.a_load_loc_ref(current_asmdata.CurrAsmList,OS_ADDR,left.location,location.reference);
              cg.a_load_loc_ref(current_asmdata.CurrAsmList,OS_ADDR,left.location,location.reference);
              { implicit deferencing also for interfaces }
              { implicit deferencing also for interfaces }
@@ -378,13 +385,7 @@ implementation
              if not is_packed_record_or_object(left.resultdef) then
              if not is_packed_record_or_object(left.resultdef) then
                begin
                begin
                  inc(location.reference.offset,vs.fieldoffset);
                  inc(location.reference.offset,vs.fieldoffset);
-{$ifdef SUPPORT_UNALIGNED}
-                 { packed? }
-                 if (vs.owner.defowner.typ in [recorddef,objectdef]) and
-                   (tabstractrecordsymtable(vs.owner).usefieldalignment=1) then
-                   location.reference.alignment:=1;
-{$endif SUPPORT_UNALIGNED}
-
+                 location.reference.alignment:=newalignment(location.reference.alignment,vs.fieldoffset);
                end
                end
              else if (vs.fieldoffset mod 8 = 0) and
              else if (vs.fieldoffset mod 8 = 0) and
                      (resultdef.packedbitsize mod 8 = 0) and
                      (resultdef.packedbitsize mod 8 = 0) and
@@ -393,10 +394,7 @@ implementation
                      (resultdef.size*8 = resultdef.packedbitsize) then
                      (resultdef.size*8 = resultdef.packedbitsize) then
                begin
                begin
                  inc(location.reference.offset,vs.fieldoffset div 8);
                  inc(location.reference.offset,vs.fieldoffset div 8);
-                 if (resultdef.size*8 <> resultdef.packedbitsize) then
-                   internalerror(2006082013);
-                 { packed records always have an alignment of 1 }
-                 location.reference.alignment:=1;
+                 location.reference.alignment:=newalignment(location.reference.alignment,vs.fieldoffset div 8);
                end
                end
              else
              else
                begin
                begin
@@ -479,10 +477,14 @@ 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);
+            reference_reset_base(location.reference,hreg,0,location.reference.alignment);
             { insert new index register }
             { insert new index register }
             location.reference.index:=maybe_const_reg;
             location.reference.index:=maybe_const_reg;
           end;
           end;
+          { update alignment }
+          if (location.reference.alignment=0) then
+            internalerror(2009020704);
+          location.reference.alignment:=newalignment(location.reference.alignment,l);
        end;
        end;
 
 
 
 
@@ -642,9 +644,9 @@ implementation
          newsize:=def_cgsize(resultdef);
          newsize:=def_cgsize(resultdef);
          secondpass(left);
          secondpass(left);
          if left.location.loc=LOC_CREFERENCE then
          if left.location.loc=LOC_CREFERENCE then
-           location_reset(location,LOC_CREFERENCE,newsize)
+           location_reset_ref(location,LOC_CREFERENCE,newsize,left.location.reference.alignment)
          else
          else
-           location_reset(location,LOC_REFERENCE,newsize);
+           location_reset_ref(location,LOC_REFERENCE,newsize,left.location.reference.alignment);
 
 
          { an ansistring needs to be dereferenced }
          { an ansistring needs to be dereferenced }
          if is_ansistring(left.resultdef) or
          if is_ansistring(left.resultdef) or
@@ -694,6 +696,7 @@ implementation
                 offsetdec:=1
                 offsetdec:=1
               else
               else
                 offsetdec:=2;
                 offsetdec:=2;
+              location.reference.alignment:=offsetdec;
               dec(location.reference.offset,offsetdec);
               dec(location.reference.offset,offsetdec);
            end
            end
          else if is_dynamic_array(left.resultdef) then
          else if is_dynamic_array(left.resultdef) then
@@ -712,6 +715,11 @@ implementation
                 else
                 else
                   internalerror(2002032219);
                   internalerror(2002032219);
               end;
               end;
+              { a dynarray points to the start of a memory block, which
+                we assume to be always aligned to a multiple of the
+                pointer size
+              }
+              location.reference.alignment:=sizeof(pint);
            end
            end
          else
          else
            location_copy(location,left.location);
            location_copy(location,left.location);
@@ -819,8 +827,10 @@ implementation
                    { only orddefs are bitpacked }
                    { only orddefs are bitpacked }
                    not is_ordinal(resultdef))) then
                    not is_ordinal(resultdef))) then
                 begin
                 begin
-                  inc(location.reference.offset,
-                    bytemulsize*tordconstnode(right).value.svalue);
+                  extraoffset:=bytemulsize*tordconstnode(right).value.svalue;
+                  inc(location.reference.offset,extraoffset);
+                  { adjust alignment after to this change }
+                  location.reference.alignment:=newalignment(location.reference.alignment,extraoffset);
                   { don't do this for floats etc.; needed to properly set the }
                   { don't do this for floats etc.; needed to properly set the }
                   { size for bitpacked arrays (e.g. a bitpacked array of      }
                   { size for bitpacked arrays (e.g. a bitpacked array of      }
                   { enums who are size 2 but fit in one byte -> in the array  }
                   { enums who are size 2 but fit in one byte -> in the array  }

+ 1 - 1
compiler/ncgopt.pas

@@ -94,7 +94,7 @@ begin
        cg.g_copyshortstring(current_asmdata.CurrAsmList,left.location.reference,href,255);
        cg.g_copyshortstring(current_asmdata.CurrAsmList,left.location.reference,href,255);
        location_freetemp(current_asmdata.CurrAsmList,left.location);
        location_freetemp(current_asmdata.CurrAsmList,left.location);
        { return temp reference }
        { return temp reference }
-       location_reset(left.location,LOC_REFERENCE,def_cgsize(resultdef));
+       location_reset_ref(left.location,LOC_REFERENCE,def_cgsize(resultdef),1);
        left.location.reference:=href;
        left.location.reference:=href;
     end;
     end;
   secondpass(right);
   secondpass(right);

+ 66 - 45
compiler/ncgutil.pas

@@ -69,7 +69,7 @@ interface
 
 
     { Retrieve the location of the data pointed to in location l, when the location is
     { Retrieve the location of the data pointed to in location l, when the location is
       a register it is expected to contain the address of the data }
       a register it is expected to contain the address of the data }
-    procedure location_get_data_ref(list:TAsmList;const l:tlocation;var ref:treference;loadref:boolean);
+    procedure location_get_data_ref(list:TAsmList;const l:tlocation;var ref:treference;loadref:boolean; alignment: longint);
 
 
     function  has_alias_name(pd:tprocdef;const s:string):boolean;
     function  has_alias_name(pd:tprocdef;const s:string):boolean;
     procedure alloc_proc_symbol(pd: tprocdef);
     procedure alloc_proc_symbol(pd: tprocdef);
@@ -581,7 +581,10 @@ implementation
                     { return  the second byte in this case (JM)           }
                     { return  the second byte in this case (JM)           }
                     if (target_info.endian = ENDIAN_BIG) and
                     if (target_info.endian = ENDIAN_BIG) and
                        (l.loc in [LOC_REFERENCE,LOC_CREFERENCE,LOC_SUBSETREF,LOC_CSUBSETREF]) then
                        (l.loc in [LOC_REFERENCE,LOC_CREFERENCE,LOC_SUBSETREF,LOC_CSUBSETREF]) then
-                      inc(l.reference.offset,TCGSize2Size[l.size]-TCGSize2Size[dst_size]);
+                      begin
+                        inc(l.reference.offset,TCGSize2Size[l.size]-TCGSize2Size[dst_size]);
+                        l.reference.alignment:=newalignment(l.reference.alignment,TCGSize2Size[l.size]-TCGSize2Size[dst_size]);
+                      end;
 {$ifdef x86}
 {$ifdef x86}
                   if not (l.loc in [LOC_SUBSETREG,LOC_CSUBSETREG]) then
                   if not (l.loc in [LOC_SUBSETREG,LOC_CSUBSETREG]) then
                      l.size:=dst_size;
                      l.size:=dst_size;
@@ -647,7 +650,10 @@ implementation
                  { return  the second byte in this case (JM)           }
                  { return  the second byte in this case (JM)           }
                  if (target_info.endian = ENDIAN_BIG) and
                  if (target_info.endian = ENDIAN_BIG) and
                     (l.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
                     (l.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
-                   inc(l.reference.offset,TCGSize2Size[l.size]-TCGSize2Size[dst_size]);
+                   begin
+                     inc(l.reference.offset,TCGSize2Size[l.size]-TCGSize2Size[dst_size]);
+                     l.reference.alignment:=newalignment(l.reference.alignment,TCGSize2Size[l.size]-TCGSize2Size[dst_size]);
+                   end;
 {$ifdef x86}
 {$ifdef x86}
                 l.size:=dst_size;
                 l.size:=dst_size;
 {$endif x86}
 {$endif x86}
@@ -685,7 +691,7 @@ implementation
               begin
               begin
                 tg.GetTemp(list,tcgsize2size[l.size],tcgsize2size[l.size],tt_normal,href);
                 tg.GetTemp(list,tcgsize2size[l.size],tcgsize2size[l.size],tt_normal,href);
                 cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,href,mms_movescalar);
                 cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,href,mms_movescalar);
-                location_reset(l,LOC_REFERENCE,l.size);
+                location_reset_ref(l,LOC_REFERENCE,l.size,0);
                 l.reference:=href;
                 l.reference:=href;
               end;
               end;
             reg:=cg.getfpuregister(list,l.size);
             reg:=cg.getfpuregister(list,l.size);
@@ -710,7 +716,7 @@ implementation
               begin
               begin
                 tg.GetTemp(list,tcgsize2size[l.size],tcgsize2size[l.size],tt_normal,href);
                 tg.GetTemp(list,tcgsize2size[l.size],tcgsize2size[l.size],tt_normal,href);
                 cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,href);
                 cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,href);
-                location_reset(l,LOC_REFERENCE,l.size);
+                location_reset_ref(l,LOC_REFERENCE,l.size,0);
                 l.reference:=href;
                 l.reference:=href;
               end;
               end;
             reg:=cg.getmmregister(list,l.size);
             reg:=cg.getmmregister(list,l.size);
@@ -774,7 +780,7 @@ implementation
             begin
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],TCGSize2Size[l.size],tt_normal,r);
               cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,r);
               cg.a_loadfpu_reg_ref(list,l.size,l.size,l.register,r);
-              location_reset(l,LOC_REFERENCE,l.size);
+              location_reset_ref(l,LOC_REFERENCE,l.size,0);
               l.reference:=r;
               l.reference:=r;
             end;
             end;
           LOC_MMREGISTER,
           LOC_MMREGISTER,
@@ -782,7 +788,7 @@ implementation
             begin
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],TCGSize2Size[l.size],tt_normal,r);
               cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,r,mms_movescalar);
               cg.a_loadmm_reg_ref(list,l.size,l.size,l.register,r,mms_movescalar);
-              location_reset(l,LOC_REFERENCE,l.size);
+              location_reset_ref(l,LOC_REFERENCE,l.size,0);
               l.reference:=r;
               l.reference:=r;
             end;
             end;
           LOC_CONSTANT,
           LOC_CONSTANT,
@@ -796,7 +802,7 @@ implementation
               else
               else
 {$endif not cpu64bitalu}
 {$endif not cpu64bitalu}
                 cg.a_load_loc_ref(list,l.size,l,r);
                 cg.a_load_loc_ref(list,l.size,l,r);
-              location_reset(l,LOC_REFERENCE,l.size);
+              location_reset_ref(l,LOC_REFERENCE,l.size,0);
               l.reference:=r;
               l.reference:=r;
             end;
             end;
           LOC_SUBSETREG,
           LOC_SUBSETREG,
@@ -806,7 +812,7 @@ implementation
             begin
             begin
               tg.GetTemp(list,TCGSize2Size[l.size],TCGSize2Size[l.size],tt_normal,r);
               tg.GetTemp(list,TCGSize2Size[l.size],TCGSize2Size[l.size],tt_normal,r);
               cg.a_load_loc_ref(list,l.size,l,r);
               cg.a_load_loc_ref(list,l.size,l,r);
-              location_reset(l,LOC_REFERENCE,l.size);
+              location_reset_ref(l,LOC_REFERENCE,l.size,0);
               l.reference:=r;
               l.reference:=r;
             end;
             end;
           LOC_CREFERENCE,
           LOC_CREFERENCE,
@@ -817,7 +823,7 @@ implementation
       end;
       end;
 
 
 
 
-    procedure location_get_data_ref(list:TAsmList;const l:tlocation;var ref:treference;loadref:boolean);
+    procedure location_get_data_ref(list:TAsmList;const l:tlocation;var ref:treference;loadref:boolean; alignment: longint);
       begin
       begin
         case l.loc of
         case l.loc of
           LOC_REGISTER,
           LOC_REGISTER,
@@ -825,14 +831,14 @@ implementation
             begin
             begin
               if not loadref then
               if not loadref then
                 internalerror(200410231);
                 internalerror(200410231);
-              reference_reset_base(ref,l.register,0);
+              reference_reset_base(ref,l.register,0,alignment);
             end;
             end;
           LOC_REFERENCE,
           LOC_REFERENCE,
           LOC_CREFERENCE :
           LOC_CREFERENCE :
             begin
             begin
               if loadref then
               if loadref then
                 begin
                 begin
-                  reference_reset_base(ref,cg.getaddressregister(list),0);
+                  reference_reset_base(ref,cg.getaddressregister(list),0,alignment);
                   cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,l.reference,ref.base);
                   cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,l.reference,ref.base);
                 end
                 end
               else
               else
@@ -862,7 +868,8 @@ implementation
            (tparavarsym(p).varspez=vs_value) and
            (tparavarsym(p).varspez=vs_value) and
           (paramanager.push_addr_param(tparavarsym(p).varspez,tparavarsym(p).vardef,current_procinfo.procdef.proccalloption)) then
           (paramanager.push_addr_param(tparavarsym(p).varspez,tparavarsym(p).vardef,current_procinfo.procdef.proccalloption)) then
           begin
           begin
-            location_get_data_ref(list,tparavarsym(p).initialloc,href,true);
+            { we have no idea about the alignment at the caller side }
+            location_get_data_ref(list,tparavarsym(p).initialloc,href,true,1);
             if is_open_array(tparavarsym(p).vardef) or
             if is_open_array(tparavarsym(p).vardef) or
                is_array_of_const(tparavarsym(p).vardef) then
                is_array_of_const(tparavarsym(p).vardef) then
               begin
               begin
@@ -1048,7 +1055,8 @@ implementation
                begin
                begin
                  { initialize fpu regvar by loading from memory }
                  { initialize fpu regvar by loading from memory }
                  reference_reset_symbol(href,
                  reference_reset_symbol(href,
-                   current_asmdata.RefAsmSymbol(tstaticvarsym(p).mangledname), 0);
+                   current_asmdata.RefAsmSymbol(tstaticvarsym(p).mangledname), 0,
+                   var_align(tstaticvarsym(p).vardef.alignment));
                  cg.a_loadfpu_ref_reg(TAsmList(arg), tstaticvarsym(p).initialloc.size,
                  cg.a_loadfpu_ref_reg(TAsmList(arg), tstaticvarsym(p).initialloc.size,
                    tstaticvarsym(p).initialloc.size, href, tstaticvarsym(p).initialloc.register);
                    tstaticvarsym(p).initialloc.size, href, tstaticvarsym(p).initialloc.register);
                end;
                end;
@@ -1179,7 +1187,7 @@ implementation
                    if not((tparavarsym(p).vardef.typ=variantdef) and
                    if not((tparavarsym(p).vardef.typ=variantdef) and
                      paramanager.push_addr_param(tparavarsym(p).varspez,tparavarsym(p).vardef,current_procinfo.procdef.proccalloption)) then
                      paramanager.push_addr_param(tparavarsym(p).varspez,tparavarsym(p).vardef,current_procinfo.procdef.proccalloption)) then
                      begin
                      begin
-                       location_get_data_ref(list,tparavarsym(p).initialloc,href,is_open_array(tparavarsym(p).vardef));
+                       location_get_data_ref(list,tparavarsym(p).initialloc,href,is_open_array(tparavarsym(p).vardef),sizeof(pint));
                        cg.g_incrrefcount(list,tparavarsym(p).vardef,href);
                        cg.g_incrrefcount(list,tparavarsym(p).vardef,href);
                      end;
                      end;
                  end;
                  end;
@@ -1190,7 +1198,10 @@ implementation
                    begin
                    begin
                      tmpreg:=cg.getaddressregister(list);
                      tmpreg:=cg.getaddressregister(list);
                      cg.a_load_loc_reg(list,OS_ADDR,tparavarsym(p).initialloc,tmpreg);
                      cg.a_load_loc_reg(list,OS_ADDR,tparavarsym(p).initialloc,tmpreg);
-                     reference_reset_base(href,tmpreg,0);
+                     { we have no idea about the alignment at the callee side,
+                       and the user also cannot specify "unaligned" here, so
+                       assume worst case }
+                     reference_reset_base(href,tmpreg,0,1);
                      if do_trashing and
                      if do_trashing and
                         { needs separate implementation to trash open arrays }
                         { needs separate implementation to trash open arrays }
                         { since their size is only known at run time         }
                         { since their size is only known at run time         }
@@ -1205,7 +1216,13 @@ implementation
                    begin
                    begin
                      tmpreg:=cg.getaddressregister(list);
                      tmpreg:=cg.getaddressregister(list);
                      cg.a_load_loc_reg(list,OS_ADDR,tparavarsym(p).initialloc,tmpreg);
                      cg.a_load_loc_reg(list,OS_ADDR,tparavarsym(p).initialloc,tmpreg);
-                     reference_reset_base(href,tmpreg,0);
+                     { should always have standard alignment. If a function is assigned
+                       to a non-aligned variable, the optimisation to pass this variable
+                       directly as hidden function result must/cannot be performed
+                       (see tcallnode.funcret_can_be_reused)
+                     }
+                     reference_reset_base(href,tmpreg,0,
+                       used_align(tparavarsym(p).vardef.alignment,current_settings.alignment.localalignmin,current_settings.alignment.localalignmax));
                      { may be an open string, even if is_open_string() returns }
                      { may be an open string, even if is_open_string() returns }
                      { false for some helpers in the system unit               }
                      { false for some helpers in the system unit               }
                      if not is_shortstring(tparavarsym(p).vardef) then
                      if not is_shortstring(tparavarsym(p).vardef) then
@@ -1234,7 +1251,7 @@ implementation
            if (tparavarsym(p).varspez=vs_value) then
            if (tparavarsym(p).varspez=vs_value) then
             begin
             begin
               include(current_procinfo.flags,pi_needs_implicit_finally);
               include(current_procinfo.flags,pi_needs_implicit_finally);
-              location_get_data_ref(list,tparavarsym(p).localloc,href,is_open_array(tparavarsym(p).vardef));
+              location_get_data_ref(list,tparavarsym(p).localloc,href,is_open_array(tparavarsym(p).vardef),sizeof(pint));
               cg.g_decrrefcount(list,tparavarsym(p).vardef,href);
               cg.g_decrrefcount(list,tparavarsym(p).vardef,href);
             end;
             end;
          end;
          end;
@@ -1263,7 +1280,7 @@ implementation
            if assigned(hp^.def) and
            if assigned(hp^.def) and
               hp^.def.needs_inittable then
               hp^.def.needs_inittable then
             begin
             begin
-              reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
+              reference_reset_base(href,current_procinfo.framepointer,hp^.pos,sizeof(pint));
               cg.g_initialize(list,hp^.def,href);
               cg.g_initialize(list,hp^.def,href);
             end;
             end;
            hp:=hp^.next;
            hp:=hp^.next;
@@ -1283,7 +1300,7 @@ implementation
               hp^.def.needs_inittable then
               hp^.def.needs_inittable then
             begin
             begin
               include(current_procinfo.flags,pi_needs_implicit_finally);
               include(current_procinfo.flags,pi_needs_implicit_finally);
-              reference_reset_base(href,current_procinfo.framepointer,hp^.pos);
+              reference_reset_base(href,current_procinfo.framepointer,hp^.pos,sizeof(pint));
               cg.g_finalize(list,hp^.def,href);
               cg.g_finalize(list,hp^.def,href);
             end;
             end;
            hp:=hp^.next;
            hp:=hp^.next;
@@ -1342,7 +1359,7 @@ implementation
 
 
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 begin
-                  location_reset(restmploc,LOC_REFERENCE,funcretloc^.size);
+                  location_reset_ref(restmploc,LOC_REFERENCE,funcretloc^.size,0);
                   restmploc.reference:=ressym.localloc.reference;
                   restmploc.reference:=ressym.localloc.reference;
                 end;
                 end;
               else
               else
@@ -1640,7 +1657,7 @@ implementation
          end;
          end;
 
 
 
 
-       procedure gen_load_ref(const paraloc:TCGParaLocation;const ref:treference;sizeleft:aint);
+       procedure gen_load_ref(const paraloc:TCGParaLocation;const ref:treference;sizeleft:aint; alignment: longint);
          var
          var
            href : treference;
            href : treference;
          begin
          begin
@@ -1659,7 +1676,7 @@ implementation
                 cg.a_loadfpu_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref);
                 cg.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);
+                  reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset,alignment);
                   { 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
@@ -1671,7 +1688,7 @@ implementation
          end;
          end;
 
 
 
 
-       procedure gen_load_reg(const paraloc:TCGParaLocation;reg:tregister);
+       procedure gen_load_reg(const paraloc:TCGParaLocation;reg:tregister; alignment: longint);
          var
          var
            href : treference;
            href : treference;
          begin
          begin
@@ -1684,7 +1701,7 @@ implementation
                 cg.a_loadfpu_reg_reg(list,paraloc.size,paraloc.size,paraloc.register,reg);
                 cg.a_loadfpu_reg_reg(list,paraloc.size,paraloc.size,paraloc.register,reg);
               LOC_REFERENCE :
               LOC_REFERENCE :
                 begin
                 begin
-                  reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset);
+                  reference_reset_base(href,paraloc.reference.index,paraloc.reference.offset,alignment);
                   case getregtype(reg) of
                   case getregtype(reg) of
                     R_INTREGISTER :
                     R_INTREGISTER :
                       cg.a_load_ref_reg(list,paraloc.size,paraloc.size,href,reg);
                       cg.a_load_ref_reg(list,paraloc.size,paraloc.size,href,reg);
@@ -1755,13 +1772,13 @@ implementation
                               if (paraloc^.loc<>LOC_REFERENCE) or
                               if (paraloc^.loc<>LOC_REFERENCE) or
                                  assigned(paraloc^.next) then
                                  assigned(paraloc^.next) then
                                 internalerror(2005013010);
                                 internalerror(2005013010);
-                              gen_load_ref(paraloc^,href,sizeleft);
+                              gen_load_ref(paraloc^,href,sizeleft,currpara.initialloc.reference.alignment);
                               inc(href.offset,sizeleft);
                               inc(href.offset,sizeleft);
                               sizeleft:=0;
                               sizeleft:=0;
                             end
                             end
                           else
                           else
                             begin
                             begin
-                              gen_load_ref(paraloc^,href,tcgsize2size[paraloc^.size]);
+                              gen_load_ref(paraloc^,href,tcgsize2size[paraloc^.size],currpara.initialloc.reference.alignment);
                               inc(href.offset,TCGSize2Size[paraloc^.size]);
                               inc(href.offset,TCGSize2Size[paraloc^.size]);
                               dec(sizeleft,TCGSize2Size[paraloc^.size]);
                               dec(sizeleft,TCGSize2Size[paraloc^.size]);
                             end;
                             end;
@@ -1787,9 +1804,10 @@ implementation
                                   paraloc^.next -> low }
                                   paraloc^.next -> low }
                                 unget_para(paraloc^);
                                 unget_para(paraloc^);
                                 gen_alloc_regvar(list,currpara);
                                 gen_alloc_regvar(list,currpara);
-                                gen_load_reg(paraloc^,currpara.initialloc.register64.reghi);
+                                { reg->reg, alignment is irrelevant }
+                                gen_load_reg(paraloc^,currpara.initialloc.register64.reghi,4);
                                 unget_para(paraloc^.next^);
                                 unget_para(paraloc^.next^);
-                                gen_load_reg(paraloc^.next^,currpara.initialloc.register64.reglo);
+                                gen_load_reg(paraloc^.next^,currpara.initialloc.register64.reglo,4);
                               end
                               end
                             else
                             else
                               begin
                               begin
@@ -1797,15 +1815,15 @@ implementation
                                   paraloc^.next -> high }
                                   paraloc^.next -> high }
                                 unget_para(paraloc^);
                                 unget_para(paraloc^);
                                 gen_alloc_regvar(list,currpara);
                                 gen_alloc_regvar(list,currpara);
-                                gen_load_reg(paraloc^,currpara.initialloc.register64.reglo);
+                                gen_load_reg(paraloc^,currpara.initialloc.register64.reglo,4);
                                 unget_para(paraloc^.next^);
                                 unget_para(paraloc^.next^);
-                                gen_load_reg(paraloc^.next^,currpara.initialloc.register64.reghi);
+                                gen_load_reg(paraloc^.next^,currpara.initialloc.register64.reghi,4);
                               end;
                               end;
                           end;
                           end;
                         LOC_REFERENCE:
                         LOC_REFERENCE:
                           begin
                           begin
                             gen_alloc_regvar(list,currpara);
                             gen_alloc_regvar(list,currpara);
-                            reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset);
+                            reference_reset_base(href,paraloc^.reference.index,paraloc^.reference.offset,currpara.paraloc[calleeside].alignment);
                             cg64.a_load64_ref_reg(list,href,currpara.initialloc.register64);
                             cg64.a_load64_ref_reg(list,href,currpara.initialloc.register64);
                             unget_para(paraloc^);
                             unget_para(paraloc^);
                           end;
                           end;
@@ -1820,7 +1838,7 @@ implementation
                         internalerror(200410105);
                         internalerror(200410105);
                       unget_para(paraloc^);
                       unget_para(paraloc^);
                       gen_alloc_regvar(list,currpara);
                       gen_alloc_regvar(list,currpara);
-                      gen_load_reg(paraloc^,currpara.initialloc.register);
+                      gen_load_reg(paraloc^,currpara.initialloc.register,sizeof(aint));
                     end;
                     end;
                 end;
                 end;
               LOC_CFPUREGISTER :
               LOC_CFPUREGISTER :
@@ -1834,7 +1852,7 @@ implementation
                   while assigned(paraloc) do
                   while assigned(paraloc) do
                     begin
                     begin
                       unget_para(paraloc^);
                       unget_para(paraloc^);
-                      gen_load_ref(paraloc^,href,sizeleft);
+                      gen_load_ref(paraloc^,href,sizeleft,currpara.initialloc.reference.alignment);
                       inc(href.offset,TCGSize2Size[paraloc^.size]);
                       inc(href.offset,TCGSize2Size[paraloc^.size]);
                       dec(sizeleft,TCGSize2Size[paraloc^.size]);
                       dec(sizeleft,TCGSize2Size[paraloc^.size]);
                       paraloc:=paraloc^.next;
                       paraloc:=paraloc^.next;
@@ -1845,7 +1863,8 @@ implementation
 {$else sparc}
 {$else sparc}
                   unget_para(paraloc^);
                   unget_para(paraloc^);
                   gen_alloc_regvar(list,currpara);
                   gen_alloc_regvar(list,currpara);
-                  gen_load_reg(paraloc^,currpara.initialloc.register);
+                  { from register to register -> alignment is irrelevant }
+                  gen_load_reg(paraloc^,currpara.initialloc.register,0);
                   if assigned(paraloc^.next) then
                   if assigned(paraloc^.next) then
                     internalerror(200410109);
                     internalerror(200410109);
 {$endif sparc}
 {$endif sparc}
@@ -1854,7 +1873,8 @@ implementation
                 begin
                 begin
                   unget_para(paraloc^);
                   unget_para(paraloc^);
                   gen_alloc_regvar(list,currpara);
                   gen_alloc_regvar(list,currpara);
-                  gen_load_reg(paraloc^,currpara.initialloc.register);
+                  { from register to register -> alignment is irrelevant }
+                  gen_load_reg(paraloc^,currpara.initialloc.register,0);
                   { data could come in two memory locations, for now
                   { data could come in two memory locations, for now
                     we simply ignore the sanity check (FK)
                     we simply ignore the sanity check (FK)
                   if assigned(paraloc^.next) then
                   if assigned(paraloc^.next) then
@@ -2246,7 +2266,9 @@ implementation
         l:=sym.getsize;
         l:=sym.getsize;
         varalign:=sym.vardef.alignment;
         varalign:=sym.vardef.alignment;
         if (varalign=0) then
         if (varalign=0) then
-          varalign:=l;
+          varalign:=var_align_size(l)
+        else
+          varalign:=var_align(varalign);
         if tf_section_threadvars in target_info.flags then
         if tf_section_threadvars in target_info.flags then
           begin
           begin
             if (vo_is_thread_var in sym.varoptions) then
             if (vo_is_thread_var in sym.varoptions) then
@@ -2273,7 +2295,6 @@ implementation
             list:=current_asmdata.asmlists[al_globals];
             list:=current_asmdata.asmlists[al_globals];
             sectype:=sec_bss;
             sectype:=sec_bss;
           end;
           end;
-        varalign:=var_align(varalign);
         maybe_new_object_file(list);
         maybe_new_object_file(list);
         new_section(list,sectype,lower(sym.mangledname),varalign);
         new_section(list,sectype,lower(sym.mangledname),varalign);
         if (sym.owner.symtabletype=globalsymtable) or
         if (sym.owner.symtabletype=globalsymtable) or
@@ -2357,7 +2378,7 @@ implementation
                           if paramanager.param_use_paraloc(tparavarsym(sym).paraloc[calleeside]) then
                           if paramanager.param_use_paraloc(tparavarsym(sym).paraloc[calleeside]) then
                             begin
                             begin
                               reference_reset_base(vs.initialloc.reference,tparavarsym(sym).paraloc[calleeside].location^.reference.index,
                               reference_reset_base(vs.initialloc.reference,tparavarsym(sym).paraloc[calleeside].location^.reference.index,
-                                  tparavarsym(sym).paraloc[calleeside].location^.reference.offset);
+                                  tparavarsym(sym).paraloc[calleeside].location^.reference.offset,tparavarsym(sym).paraloc[calleeside].alignment);
                             end
                             end
                           else
                           else
                             begin
                             begin
@@ -2775,7 +2796,7 @@ implementation
               LOC_CREFERENCE,
               LOC_CREFERENCE,
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 begin
-                  reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset);
+                  reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
                   cg.a_loadaddr_ref_reg(list,selfloc.reference,href.base);
                   cg.a_loadaddr_ref_reg(list,selfloc.reference,href.base);
                 end;
                 end;
               else
               else
@@ -2790,18 +2811,18 @@ implementation
 {$ifdef cpu_uses_separate_address_registers}
 {$ifdef cpu_uses_separate_address_registers}
                   if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                   if getregtype(left.location.register)<>R_ADDRESSREGISTER then
                     begin
                     begin
-                      reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset);
+                      reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
                       cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,selfloc.register,href.base);
                       cg.a_load_reg_reg(list,OS_ADDR,OS_ADDR,selfloc.register,href.base);
                     end
                     end
                   else
                   else
 {$endif cpu_uses_separate_address_registers}
 {$endif cpu_uses_separate_address_registers}
-                    reference_reset_base(href,selfloc.register,objdef.vmt_offset);
+                    reference_reset_base(href,selfloc.register,objdef.vmt_offset,sizeof(pint));
                 end;
                 end;
               LOC_CREGISTER,
               LOC_CREGISTER,
               LOC_CREFERENCE,
               LOC_CREFERENCE,
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 begin
-                  reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset);
+                  reference_reset_base(href,cg.getaddressregister(list),objdef.vmt_offset,sizeof(pint));
                   cg.a_load_loc_reg(list,OS_ADDR,selfloc,href.base);
                   cg.a_load_loc_reg(list,OS_ADDR,selfloc,href.base);
                 end;
                 end;
               else
               else
@@ -2841,7 +2862,7 @@ implementation
           begin
           begin
             new_section(list,sec_code,'fpc_geteipasebx',0);
             new_section(list,sec_code,'fpc_geteipasebx',0);
             list.concat(tai_symbol.Createname('fpc_geteipasebx',AT_FUNCTION,getprocalign));
             list.concat(tai_symbol.Createname('fpc_geteipasebx',AT_FUNCTION,getprocalign));
-            reference_reset(href);
+            reference_reset(href,sizeof(pint));
             href.base:=NR_ESP;
             href.base:=NR_ESP;
             list.concat(taicpu.op_ref_reg(A_MOV,S_L,href,NR_EBX));
             list.concat(taicpu.op_ref_reg(A_MOV,S_L,href,NR_EBX));
             list.concat(taicpu.op_none(A_RET,S_NO));
             list.concat(taicpu.op_none(A_RET,S_NO));
@@ -2850,7 +2871,7 @@ implementation
           begin
           begin
             new_section(list,sec_code,'fpc_geteipasecx',0);
             new_section(list,sec_code,'fpc_geteipasecx',0);
             list.concat(tai_symbol.Createname('fpc_geteipasecx',AT_FUNCTION,getprocalign));
             list.concat(tai_symbol.Createname('fpc_geteipasecx',AT_FUNCTION,getprocalign));
-            reference_reset(href);
+            reference_reset(href,sizeof(pint));
             href.base:=NR_ESP;
             href.base:=NR_ESP;
             list.concat(taicpu.op_ref_reg(A_MOV,S_L,href,NR_ECX));
             list.concat(taicpu.op_ref_reg(A_MOV,S_L,href,NR_ECX));
             list.concat(taicpu.op_none(A_RET,S_NO));
             list.concat(taicpu.op_none(A_RET,S_NO));

+ 1 - 0
compiler/parabase.pas

@@ -234,6 +234,7 @@ implementation
             begin
             begin
               newloc.reference.base:=location^.reference.index;
               newloc.reference.base:=location^.reference.index;
               newloc.reference.offset:=location^.reference.offset;
               newloc.reference.offset:=location^.reference.offset;
+              newloc.reference.alignment:=alignment;
             end;
             end;
         end;
         end;
       end;
       end;

+ 27 - 27
compiler/powerpc/cgcpu.pas

@@ -221,7 +221,7 @@ const
                 end;
                 end;
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 begin
-                   reference_reset_base(ref,location^.reference.index,location^.reference.offset);
+                   reference_reset_base(ref,location^.reference.index,location^.reference.offset,cgpara.alignment);
                    g_concatcopy(list,tmpref,ref,sizeleft);
                    g_concatcopy(list,tmpref,ref,sizeleft);
                    if assigned(location^.next) then
                    if assigned(location^.next) then
                      internalerror(2005010710);
                      internalerror(2005010710);
@@ -288,7 +288,7 @@ const
             the transition vector.}
             the transition vector.}
             //TODO: Support cross-TOC calls.
             //TODO: Support cross-TOC calls.
             tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
-            reference_reset(tmpref);
+            reference_reset(tmpref,4);
             tmpref.offset := 0;
             tmpref.offset := 0;
             //tmpref.symaddr := refs_full;
             //tmpref.symaddr := refs_full;
             tmpref.base:= reg;
             tmpref.base:= reg;
@@ -952,9 +952,9 @@ const
                 { ... in caller's frame }
                 { ... in caller's frame }
                 case target_info.abi of
                 case target_info.abi of
                   abi_powerpc_aix:
                   abi_powerpc_aix:
-                    reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX);
+                    reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4);
                   abi_powerpc_sysv:
                   abi_powerpc_sysv:
-                    reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV);
+                    reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4);
                 end;
                 end;
                 list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
                 list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
                 if not(cs_profile in current_settings.moduleswitches) then
                 if not(cs_profile in current_settings.moduleswitches) then
@@ -988,7 +988,7 @@ const
 
 
         if usesfpr then
         if usesfpr then
           begin
           begin
-             reference_reset_base(href,NR_R1,-8);
+             reference_reset_base(href,NR_R1,-8,8);
              for regcounter:=firstregfpu to RS_F31 do
              for regcounter:=firstregfpu to RS_F31 do
                begin
                begin
                  a_loadfpu_reg_ref(list,OS_F64,OS_F64,newreg(R_FPUREGISTER,regcounter,R_SUBNONE),href);
                  a_loadfpu_reg_ref(list,OS_F64,OS_F64,newreg(R_FPUREGISTER,regcounter,R_SUBNONE),href);
@@ -999,7 +999,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);
+          reference_reset_base(href,NR_R1,-4,4);
 
 
         { save gprs and fetch GOT pointer }
         { save gprs and fetch GOT pointer }
         if usesgpr then
         if usesgpr then
@@ -1032,12 +1032,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);
+                reference_reset_base(href,NR_STACK_POINTER_REG,-localsize,8);
                 a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
                 a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
               end
               end
             else
             else
               begin
               begin
-                reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                reference_reset_base(href,NR_STACK_POINTER_REG,0,4);
                 { can't use getregisterint here, the register colouring }
                 { can't use getregisterint here, the register colouring }
                 { is already done when we get here                      }
                 { is already done when we get here                      }
                 { R12 may hold previous stack pointer, R11  may be in   }
                 { R12 may hold previous stack pointer, R11  may be in   }
@@ -1107,7 +1107,7 @@ const
         genret:=true;
         genret:=true;
         if usesfpr then
         if usesfpr then
           begin
           begin
-            reference_reset_base(href,NR_R1,-8);
+            reference_reset_base(href,NR_R1,-8,8);
             for regcounter := firstregfpu to RS_F31 do
             for regcounter := firstregfpu to RS_F31 do
               begin
               begin
                 a_loadfpu_ref_reg(list,OS_F64,OS_F64,href,newreg(R_FPUREGISTER,regcounter,R_SUBNONE));
                 a_loadfpu_ref_reg(list,OS_F64,OS_F64,href,newreg(R_FPUREGISTER,regcounter,R_SUBNONE));
@@ -1116,7 +1116,7 @@ const
             inc(href.offset,4);
             inc(href.offset,4);
           end
           end
         else
         else
-          reference_reset_base(href,NR_R1,-4);
+          reference_reset_base(href,NR_R1,-4,4);
 
 
         if (usesgpr) then
         if (usesgpr) then
           begin
           begin
@@ -1165,9 +1165,9 @@ const
                   begin
                   begin
                     case target_info.abi of
                     case target_info.abi of
                       abi_powerpc_aix:
                       abi_powerpc_aix:
-                        reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX);
+                        reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_AIX,4);
                       abi_powerpc_sysv:
                       abi_powerpc_sysv:
-                        reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV);
+                        reference_reset_base(href,NR_STACK_POINTER_REG,LA_LR_SYSV,4);
                     end;
                     end;
                     a_reg_alloc(list,NR_R0);
                     a_reg_alloc(list,NR_R0);
                     list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
                     list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
@@ -1244,7 +1244,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);
+            reference_reset_base(href, NR_STACK_POINTER_REG, offset, 8);
             list.concat(taicpu.op_reg_ref(A_STFD, tregister(regcounter), href));
             list.concat(taicpu.op_reg_ref(A_STFD, tregister(regcounter), href));
           end;
           end;
         (* Optimiztion in the future:  a_call_name(list,'_savefXX'); *)
         (* Optimiztion in the future:  a_call_name(list,'_savefXX'); *)
@@ -1254,7 +1254,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);
+            reference_reset_base(href,NR_STACK_POINTER_REG,offset,4);
             list.concat(taicpu.op_reg_ref(A_STMW,tregister(firstreggpr),href));
             list.concat(taicpu.op_reg_ref(A_STMW,tregister(firstreggpr),href));
               {STMW stores multiple registers}
               {STMW stores multiple registers}
           end
           end
@@ -1263,7 +1263,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);
+                reference_reset_base(href, NR_STACK_POINTER_REG, offset, 4);
                 list.concat(taicpu.op_reg_ref(A_STW, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
                 list.concat(taicpu.op_reg_ref(A_STW, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
               end;
               end;
           end;
           end;
@@ -1326,7 +1326,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);
+            reference_reset_base(href, NR_STACK_POINTER_REG, offset, 8);
             list.concat(taicpu.op_reg_ref(A_LFD, newreg(R_FPUREGISTER,regcounter,R_SUBWHOLE), href));
             list.concat(taicpu.op_reg_ref(A_LFD, newreg(R_FPUREGISTER,regcounter,R_SUBWHOLE), href));
           end;
           end;
         (* Optimiztion in the future: a_call_name(list,'_restfXX'); *)
         (* Optimiztion in the future: a_call_name(list,'_restfXX'); *)
@@ -1336,7 +1336,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); //-220
+            reference_reset_base(href,NR_STACK_POINTER_REG,offset, 4); //-220
             list.concat(taicpu.op_reg_ref(A_LMW,tregister(firstreggpr),href));
             list.concat(taicpu.op_reg_ref(A_LMW,tregister(firstreggpr),href));
               {LMW loads multiple registers}
               {LMW loads multiple registers}
           end
           end
@@ -1345,7 +1345,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);
+                reference_reset_base(href, NR_STACK_POINTER_REG, offset, 4);
                 list.concat(taicpu.op_reg_ref(A_LWZ, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
                 list.concat(taicpu.op_reg_ref(A_LWZ, newreg(R_INTREGISTER,regcounter,R_SUBWHOLE), href));
               end;
               end;
           end;
           end;
@@ -1382,7 +1382,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);
+        reference_reset_base(href,NR_STACK_POINTER_REG,8, 8);
         list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
         list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
         a_reg_dealloc(list,NR_R0);
         a_reg_dealloc(list,NR_R0);
 
 
@@ -1392,7 +1392,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);
+        reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,4);
         list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
         list.concat(taicpu.op_reg_ref(A_STW,NR_R0,href));
         a_reg_dealloc(list,NR_R0);
         a_reg_dealloc(list,NR_R0);
 
 
@@ -1426,12 +1426,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);
+                reference_reset_base(href,NR_STACK_POINTER_REG,-localsize,8);
                 a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
                 a_load_store(list,A_STWU,NR_STACK_POINTER_REG,href);
               end
               end
             else
             else
               begin
               begin
-                reference_reset_base(href,NR_STACK_POINTER_REG,0);
+                reference_reset_base(href,NR_STACK_POINTER_REG,0,8);
                 href.index := NR_R11;
                 href.index := NR_R11;
                 a_reg_alloc(list,href.index);
                 a_reg_alloc(list,href.index);
                 a_load_const_reg(list,OS_S32,-localsize,href.index);
                 a_load_const_reg(list,OS_S32,-localsize,href.index);
@@ -1450,7 +1450,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);
+        reference_reset_base(href,NR_STACK_POINTER_REG,LA_SP,4);
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_STACK_POINTER_REG,href));
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_STACK_POINTER_REG,href));
         (*
         (*
         list.concat(taicpu.op_reg_reg_const(A_ORI,NR_STACK_POINTER_REG,R_31,0));
         list.concat(taicpu.op_reg_reg_const(A_ORI,NR_STACK_POINTER_REG,R_31,0));
@@ -1458,7 +1458,7 @@ 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);
+        reference_reset_base(href,NR_STACK_POINTER_REG,LA_CR_AIX,4);
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
         list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
         list.concat(taicpu.op_reg_reg(A_MTSPR,NR_R0,NR_CR));
         a_reg_dealloc(list,NR_R0);
         a_reg_dealloc(list,NR_R0);
@@ -1479,7 +1479,7 @@ const
         *)
         *)
 
 
         { restore return address from callers frame }
         { restore return address from callers frame }
-        reference_reset_base(href,NR_STACK_POINTER_REG,8);
+        reference_reset_base(href,NR_STACK_POINTER_REG,8,8);
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
         list.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,href));
 
 
         { return to caller }
         { return to caller }
@@ -1537,8 +1537,8 @@ const
 
 
         count := len div maxmoveunit;
         count := len div maxmoveunit;
 
 
-        reference_reset(src);
-        reference_reset(dst);
+        reference_reset(src,source.alignment);
+        reference_reset(dst,dest.alignment);
         { load the address of source into src.base }
         { load the address of source into src.base }
         if (count > 4) or
         if (count > 4) or
            not issimpleref(source) or
            not issimpleref(source) or

+ 6 - 6
compiler/powerpc/nppccal.pas

@@ -73,7 +73,7 @@ implementation
               // one syscall convention for Amiga/PowerPC
               // one syscall convention for Amiga/PowerPC
               // which is very similar to basesysv on MorphOS
               // which is very similar to basesysv on MorphOS
               cg.getcpuregister(current_asmdata.CurrAsmList,NR_R0);
               cg.getcpuregister(current_asmdata.CurrAsmList,NR_R0);
-              reference_reset_base(tmpref,NR_R3,tprocdef(procdefinition).extnumber);
+              reference_reset_base(tmpref,NR_R3,tprocdef(procdefinition).extnumber,sizeof(pint));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTCTR,NR_R0));
               current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTCTR,NR_R0));
               current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BCTRL));
               current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BCTRL));
@@ -87,7 +87,7 @@ implementation
                   cg.getcpuregister(current_asmdata.CurrAsmList,NR_R0);
                   cg.getcpuregister(current_asmdata.CurrAsmList,NR_R0);
                   cg.getcpuregister(current_asmdata.CurrAsmList,NR_R12);
                   cg.getcpuregister(current_asmdata.CurrAsmList,NR_R12);
 
 
-                  reference_reset(tmpref);
+                  reference_reset(tmpref,sizeof(pint));
                   tmpref.symbol:=current_asmdata.RefAsmSymbol(tstaticvarsym(tprocdef(procdefinition).libsym).mangledname);
                   tmpref.symbol:=current_asmdata.RefAsmSymbol(tstaticvarsym(tprocdef(procdefinition).libsym).mangledname);
                   tmpref.refaddr:=addr_higha;
                   tmpref.refaddr:=addr_higha;
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LIS,NR_R12,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LIS,NR_R12,tmpref));
@@ -95,7 +95,7 @@ implementation
                   tmpref.refaddr:=addr_low;
                   tmpref.refaddr:=addr_low;
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R12,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R12,tmpref));
 
 
-                  reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber);
+                  reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber,sizeof(pint));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTCTR,NR_R0));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTCTR,NR_R0));
                   current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BCTRL));
                   current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BCTRL));
@@ -108,9 +108,9 @@ implementation
                 begin
                 begin
                   cg.getcpuregister(current_asmdata.CurrAsmList,NR_R0);
                   cg.getcpuregister(current_asmdata.CurrAsmList,NR_R0);
                   if (po_syscall_basesysv in tprocdef(procdefinition).procoptions) then
                   if (po_syscall_basesysv in tprocdef(procdefinition).procoptions) then
-                    reference_reset_base(tmpref,NR_R3,-tprocdef(procdefinition).extnumber)
+                    reference_reset_base(tmpref,NR_R3,-tprocdef(procdefinition).extnumber,sizeof(pint))
                   else
                   else
-                    reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber);
+                    reference_reset_base(tmpref,NR_R12,-tprocdef(procdefinition).extnumber,sizeof(pint));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTCTR,NR_R0));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTCTR,NR_R0));
                   current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BCTRL));
                   current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BCTRL));
@@ -125,7 +125,7 @@ implementation
                   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));
 
 
                   { prepare LR, and call function }
                   { prepare LR, and call function }
-                  reference_reset_base(tmpref,NR_R2,100); { 100 ($64) is EmulDirectCallOS offset }
+                  reference_reset_base(tmpref,NR_R2,100,4); { 100 ($64) is EmulDirectCallOS offset }
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(A_LWZ,NR_R0,tmpref));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTLR,NR_R0));
                   current_asmdata.CurrAsmList.concat(taicpu.op_reg(A_MTLR,NR_R0));
                   current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BLRL));
                   current_asmdata.CurrAsmList.concat(taicpu.op_none(A_BLRL));

+ 22 - 22
compiler/powerpc64/cgcpu.pas

@@ -479,7 +479,7 @@ begin
       LOC_REFERENCE:
       LOC_REFERENCE:
         begin
         begin
           reference_reset_base(ref, location^.reference.index,
           reference_reset_base(ref, location^.reference.index,
-            location^.reference.offset);
+            location^.reference.offset,paraloc.alignment);
           g_concatcopy(list, tmpref, ref, sizeleft);
           g_concatcopy(list, tmpref, ref, sizeleft);
           if assigned(location^.next) then
           if assigned(location^.next) then
             internalerror(2005010710);
             internalerror(2005010710);
@@ -546,22 +546,22 @@ begin
     tempreg := cg.getintregister(current_asmdata.CurrAsmList, OS_INT);
     tempreg := cg.getintregister(current_asmdata.CurrAsmList, 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);
+    reference_reset_base(tmpref, reg, 0, sizeof(pint));
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, tempreg);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, tempreg);
 
 
     { save TOC pointer in stackframe }
     { save TOC pointer in stackframe }
-    reference_reset_base(tmpref, NR_STACK_POINTER_REG, LA_RTOC_ELF);
+    reference_reset_base(tmpref, NR_STACK_POINTER_REG, LA_RTOC_ELF, 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]);
+    reference_reset_base(tmpref, reg, tcgsize2size[OS_ADDR], 8);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_RTOC);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_RTOC);
 
 
     { load new environment pointer from function descriptor into R11 register }
     { load new environment pointer from function descriptor into R11 register }
-    reference_reset_base(tmpref, reg, 2*tcgsize2size[OS_ADDR]);
+    reference_reset_base(tmpref, reg, 2*tcgsize2size[OS_ADDR], 8);
     a_reg_alloc(list, NR_R11);
     a_reg_alloc(list, NR_R11);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_R11);
     a_load_ref_reg(list, OS_ADDR, OS_ADDR, tmpref, NR_R11);
     { call function }
     { call function }
@@ -577,7 +577,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, LA_RTOC_ELF);
+  reference_reset_base(tmpref, NR_STACK_POINTER_REG, LA_RTOC_ELF, 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);
@@ -1429,7 +1429,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);
+      reference_reset_base(href, NR_STACK_POINTER_REG, -8, 8);
       if (fprcount > 0) then
       if (fprcount > 0) then
         for regcount := RS_F31 downto firstregfpu do begin
         for regcount := RS_F31 downto firstregfpu do begin
           a_loadfpu_reg_ref(list, OS_FLOAT, OS_FLOAT, newreg(R_FPUREGISTER,
           a_loadfpu_reg_ref(list, OS_FLOAT, OS_FLOAT, newreg(R_FPUREGISTER,
@@ -1450,7 +1450,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_ELF);
+      reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_ELF, 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;
@@ -1492,10 +1492,10 @@ begin
   if (not nostackframe) and (localsize > 0) and
   if (not nostackframe) and (localsize > 0) and
      tppcprocinfo(current_procinfo).needstackframe then begin
      tppcprocinfo(current_procinfo).needstackframe then begin
     if (localsize <= high(smallint)) then begin
     if (localsize <= high(smallint)) then begin
-      reference_reset_base(href, NR_STACK_POINTER_REG, -localsize);
+      reference_reset_base(href, NR_STACK_POINTER_REG, -localsize, 8);
       a_load_store(list, A_STDU, NR_STACK_POINTER_REG, href);
       a_load_store(list, A_STDU, NR_STACK_POINTER_REG, href);
     end else begin
     end else begin
-      reference_reset_base(href, NR_NO, -localsize);
+      reference_reset_base(href, NR_NO, -localsize, 8);
 
 
       { Use R0 for loading the constant (which is definitely > 32k when entering
       { Use R0 for loading the constant (which is definitely > 32k when entering
        this branch).
        this branch).
@@ -1567,7 +1567,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]);
+      reference_reset_base(href, NR_STACK_POINTER_REG, -tcgsize2size[OS_FLOAT], 8);
       if (fprcount > 0) then
       if (fprcount > 0) then
         for regcount := RS_F31 downto firstregfpu do begin
         for regcount := RS_F31 downto firstregfpu do begin
           a_loadfpu_ref_reg(list, OS_FLOAT, OS_FLOAT, href, newreg(R_FPUREGISTER, regcount,
           a_loadfpu_ref_reg(list, OS_FLOAT, OS_FLOAT, href, newreg(R_FPUREGISTER, regcount,
@@ -1588,7 +1588,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_ELF);
+        reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_ELF, 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;
@@ -1625,7 +1625,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);
+      reference_reset_base(href, NR_NO, localsize, 8);
 
 
       { use R0 for loading the constant (which is definitely > 32k when entering
       { use R0 for loading the constant (which is definitely > 32k when entering
        this branch)
        this branch)
@@ -1674,7 +1674,7 @@ begin
   if (assigned(ref2.symbol) or (hasLargeOffset(ref2))) then begin
   if (assigned(ref2.symbol) or (hasLargeOffset(ref2))) then begin
     { add the symbol's value to the base of the reference, and if the }
     { add the symbol's value to the base of the reference, and if the }
     { reference doesn't have a base, create one                       }
     { reference doesn't have a base, create one                       }
-    reference_reset(tmpref);
+    reference_reset(tmpref, ref2.alignment);
     tmpref.offset := ref2.offset;
     tmpref.offset := ref2.offset;
     tmpref.symbol := ref2.symbol;
     tmpref.symbol := ref2.symbol;
     tmpref.relsymbol := ref2.relsymbol;
     tmpref.relsymbol := ref2.relsymbol;
@@ -1810,8 +1810,8 @@ begin
     end;
     end;
 
 
   tempreg:=getintregister(list,size);
   tempreg:=getintregister(list,size);
-  reference_reset(src);
-  reference_reset(dst);
+  reference_reset(src,source.alignment);
+  reference_reset(dst,dest.alignment);
   { load the address of source into src.base }
   { load the address of source into src.base }
   if (count > 4) or
   if (count > 4) or
     not issimpleref(source) or
     not issimpleref(source) or
@@ -1926,9 +1926,9 @@ begin
 
 
   }
   }
   list.concat(taicpu.op_reg(A_MFLR, NR_R0));
   list.concat(taicpu.op_reg(A_MFLR, NR_R0));
-  reference_reset_base(href, NR_STACK_POINTER_REG, 16);
+  reference_reset_base(href, NR_STACK_POINTER_REG, 16, 8);
   list.concat(taicpu.op_reg_ref(A_STD, NR_R0, href));
   list.concat(taicpu.op_reg_ref(A_STD, NR_R0, href));
-  reference_reset_base(href, NR_STACK_POINTER_REG, -MINIMUM_STACKFRAME_SIZE);
+  reference_reset_base(href, NR_STACK_POINTER_REG, -MINIMUM_STACKFRAME_SIZE, 8);
   list.concat(taicpu.op_reg_ref(A_STDU, NR_STACK_POINTER_REG, href));
   list.concat(taicpu.op_reg_ref(A_STDU, NR_STACK_POINTER_REG, href));
 
 
   list.concat(taicpu.op_sym(A_BL, current_asmdata.RefAsmSymbol(externalname)));
   list.concat(taicpu.op_sym(A_BL, current_asmdata.RefAsmSymbol(externalname)));
@@ -1936,7 +1936,7 @@ begin
 
 
   list.concat(taicpu.op_reg_reg_const(A_ADDI, NR_STACK_POINTER_REG, NR_STACK_POINTER_REG, MINIMUM_STACKFRAME_SIZE));
   list.concat(taicpu.op_reg_reg_const(A_ADDI, NR_STACK_POINTER_REG, NR_STACK_POINTER_REG, MINIMUM_STACKFRAME_SIZE));
 
 
-  reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_ELF);
+  reference_reset_base(href, NR_STACK_POINTER_REG, LA_LR_ELF, 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));
   list.concat(taicpu.op_none(A_BLR));
   list.concat(taicpu.op_none(A_BLR));
@@ -2043,7 +2043,7 @@ begin
       ref.offset := 0;
       ref.offset := 0;
     end;
     end;
 
 
-    reference_reset(tmpref);
+    reference_reset(tmpref, ref.alignment);
     tmpref.symbol := ref.symbol;
     tmpref.symbol := ref.symbol;
     tmpref.relsymbol := ref.relsymbol;
     tmpref.relsymbol := ref.relsymbol;
     tmpref.offset := ref.offset;
     tmpref.offset := ref.offset;
@@ -2079,7 +2079,7 @@ begin
       end else
       end else
         a_load_const_reg(list, OS_ADDR, tmpref.offset, tmpreg2);
         a_load_const_reg(list, OS_ADDR, tmpref.offset, tmpreg2);
 
 
-      reference_reset(tmpref);
+      reference_reset(tmpref, ref.alignment);
       tmpref.base := ref.base;
       tmpref.base := ref.base;
       tmpref.index := tmpreg2;
       tmpref.index := tmpreg2;
       case op of
       case op of
@@ -2148,7 +2148,7 @@ begin
     current_asmdata.asmlists[al_picdata].concat(tai_symbol.create_global(l,0));
     current_asmdata.asmlists[al_picdata].concat(tai_symbol.create_global(l,0));
     current_asmdata.asmlists[al_picdata].concat(tai_directive.create(asd_toc_entry, symname + '[TC], ' + inttostr(a)));
     current_asmdata.asmlists[al_picdata].concat(tai_directive.create(asd_toc_entry, symname + '[TC], ' + inttostr(a)));
   end;
   end;
-  reference_reset_symbol(ref,l,0);
+  reference_reset_symbol(ref,l,0, 8);
   ref.base := NR_R2;
   ref.base := NR_R2;
   ref.refaddr := addr_no;
   ref.refaddr := addr_no;
 
 

+ 14 - 14
compiler/ppcgen/cgppc.pas

@@ -168,7 +168,7 @@ unit cgppc;
           a_load_const_reg(list, size, a, paraloc.location^.register);
           a_load_const_reg(list, size, a, paraloc.location^.register);
         LOC_REFERENCE:
         LOC_REFERENCE:
           begin
           begin
-            reference_reset(ref);
+            reference_reset(ref,paraloc.alignment);
             ref.base := paraloc.location^.reference.index;
             ref.base := paraloc.location^.reference.index;
             ref.offset := paraloc.location^.reference.offset;
             ref.offset := paraloc.location^.reference.offset;
             a_load_const_ref(list, size, a, ref);
             a_load_const_ref(list, size, a, ref);
@@ -191,7 +191,7 @@ unit cgppc;
              a_loadaddr_ref_reg(list,r,paraloc.location^.register);
              a_loadaddr_ref_reg(list,r,paraloc.location^.register);
            LOC_REFERENCE:
            LOC_REFERENCE:
              begin
              begin
-               reference_reset(ref);
+               reference_reset(ref,paraloc.alignment);
                ref.base := paraloc.location^.reference.index;
                ref.base := paraloc.location^.reference.index;
                ref.offset := paraloc.location^.reference.offset;
                ref.offset := paraloc.location^.reference.offset;
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
@@ -278,7 +278,7 @@ unit cgppc;
           current_asmdata.weakrefasmsymbol(s);
           current_asmdata.weakrefasmsymbol(s);
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
         current_asmdata.asmlists[al_imports].concat(tai_directive.create(asd_indirect_symbol,s));
         l1 := current_asmdata.RefAsmSymbol('L'+s+'$lazy_ptr');
         l1 := current_asmdata.RefAsmSymbol('L'+s+'$lazy_ptr');
-        reference_reset_symbol(href,l1,0);
+        reference_reset_symbol(href,l1,0,sizeof(pint));
         href.refaddr := addr_higha;
         href.refaddr := addr_higha;
         if (cs_create_pic in current_settings.moduleswitches) then
         if (cs_create_pic in current_settings.moduleswitches) then
           begin
           begin
@@ -330,7 +330,7 @@ unit cgppc;
                begin
                begin
                  if macos_direct_globals then
                  if macos_direct_globals then
                    begin
                    begin
-                     reference_reset(tmpref);
+                     reference_reset(tmpref,ref2.alignment);
                      tmpref.offset := ref2.offset;
                      tmpref.offset := ref2.offset;
                      tmpref.symbol := ref2.symbol;
                      tmpref.symbol := ref2.symbol;
                      tmpref.base := NR_NO;
                      tmpref.base := NR_NO;
@@ -338,7 +338,7 @@ unit cgppc;
                    end
                    end
                  else
                  else
                    begin
                    begin
-                     reference_reset(tmpref);
+                     reference_reset(tmpref,ref2.alignment);
                      tmpref.symbol := ref2.symbol;
                      tmpref.symbol := ref2.symbol;
                      tmpref.offset := 0;
                      tmpref.offset := 0;
                      tmpref.base := NR_RTOC;
                      tmpref.base := NR_RTOC;
@@ -346,7 +346,7 @@ unit cgppc;
 
 
                      if ref2.offset <> 0 then
                      if ref2.offset <> 0 then
                        begin
                        begin
-                         reference_reset(tmpref);
+                         reference_reset(tmpref,ref2.alignment);
                          tmpref.offset := ref2.offset;
                          tmpref.offset := ref2.offset;
                          tmpref.base:= r;
                          tmpref.base:= r;
                          list.concat(taicpu.op_reg_ref(A_LA,r,tmpref));
                          list.concat(taicpu.op_reg_ref(A_LA,r,tmpref));
@@ -363,7 +363,7 @@ unit cgppc;
 
 
                  { add the symbol's value to the base of the reference, and if the }
                  { add the symbol's value to the base of the reference, and if the }
                  { reference doesn't have a base, create one                       }
                  { reference doesn't have a base, create one                       }
-                 reference_reset(tmpref);
+                 reference_reset(tmpref,ref2.alignment);
                  tmpref.offset := ref2.offset;
                  tmpref.offset := ref2.offset;
                  tmpref.symbol := ref2.symbol;
                  tmpref.symbol := ref2.symbol;
                  tmpref.relsymbol := ref2.relsymbol;
                  tmpref.relsymbol := ref2.relsymbol;
@@ -653,7 +653,7 @@ unit cgppc;
         var
         var
           href : treference;
           href : treference;
         begin
         begin
-          reference_reset_base(href,NR_R3,0);
+          reference_reset_base(href,NR_R3,0,sizeof(pint));
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
           cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
         end;
         end;
 
 
@@ -665,7 +665,7 @@ unit cgppc;
           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,NR_R11,procdef._class.vmtmethodoffset(procdef.extnumber));
+          reference_reset_base(href,NR_R11,procdef._class.vmtmethodoffset(procdef.extnumber),sizeof(pint));
           if hasLargeOffset(href) then
           if hasLargeOffset(href) then
             begin
             begin
 {$ifdef cpu64}
 {$ifdef cpu64}
@@ -680,7 +680,7 @@ unit cgppc;
           a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
           a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_R11);
           if (target_info.system = system_powerpc64_linux) then
           if (target_info.system = system_powerpc64_linux) then
             begin
             begin
-              reference_reset_base(href, NR_R11, 0);
+              reference_reset_base(href, NR_R11, 0, sizeof(pint));
               a_load_ref_reg(list, OS_ADDR, OS_ADDR, href, NR_R11);
               a_load_ref_reg(list, OS_ADDR, OS_ADDR, href, NR_R11);
             end;
             end;
           list.concat(taicpu.op_reg(A_MTCTR,NR_R11));
           list.concat(taicpu.op_reg(A_MTCTR,NR_R11));
@@ -746,7 +746,7 @@ unit cgppc;
       if (target_info.system <> system_powerpc64_linux) then
       if (target_info.system <> system_powerpc64_linux) then
         internalerror(2007102010);
         internalerror(2007102010);
       l:=current_asmdata.getasmsymbol(symbol);
       l:=current_asmdata.getasmsymbol(symbol);
-      reference_reset_symbol(ref,l,0);
+      reference_reset_symbol(ref,l,0,sizeof(pint));
       ref.base := NR_R2;
       ref.base := NR_R2;
       ref.refaddr := addr_pic;
       ref.refaddr := addr_pic;
     
     
@@ -876,7 +876,7 @@ unit cgppc;
               begin {Load symbol's value}
               begin {Load symbol's value}
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
 
 
-                reference_reset(tmpref);
+                reference_reset(tmpref,sizeof(pint));
                 tmpref.symbol := ref.symbol;
                 tmpref.symbol := ref.symbol;
                 tmpref.base := NR_RTOC;
                 tmpref.base := NR_RTOC;
 
 
@@ -888,7 +888,7 @@ unit cgppc;
 
 
             if largeOffset then
             if largeOffset then
               begin {Add hi part of offset}
               begin {Add hi part of offset}
-                reference_reset(tmpref);
+                reference_reset(tmpref,ref.alignment);
 
 
                 if Smallint(Lo(ref.offset)) < 0 then
                 if Smallint(Lo(ref.offset)) < 0 then
                   tmpref.offset := Hi(ref.offset) + 1 {Compensate when lo part is negative}
                   tmpref.offset := Hi(ref.offset) + 1 {Compensate when lo part is negative}
@@ -929,7 +929,7 @@ unit cgppc;
                largeOffset then
                largeOffset then
               begin
               begin
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
                 tmpreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
-                reference_reset(tmpref);
+                reference_reset(tmpref,ref.alignment);
                 tmpref.symbol := ref.symbol;
                 tmpref.symbol := ref.symbol;
                 tmpref.relsymbol := ref.relsymbol;
                 tmpref.relsymbol := ref.relsymbol;
                 tmpref.offset := ref.offset;
                 tmpref.offset := ref.offset;

+ 1 - 1
compiler/ppcgen/ngppcinl.pas

@@ -182,7 +182,7 @@ implementation
          tmpreg:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
          tmpreg:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
          current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,tmpreg,
          current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,tmpreg,
            left.location.register));
            left.location.register));
-         location_reset(location,LOC_REFERENCE,def_cgsize(resultdef));
+         location_reset_ref(location,LOC_REFERENCE,def_cgsize(resultdef),0);
          tg.gettemptyped(current_asmdata.CurrAsmList,resultdef,tt_normal,
          tg.gettemptyped(current_asmdata.CurrAsmList,resultdef,tt_normal,
            location.reference);
            location.reference);
          cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,OS_F64,OS_F64,tmpreg,
          cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,OS_F64,OS_F64,tmpreg,

+ 1 - 1
compiler/ppu.pas

@@ -43,7 +43,7 @@ type
 {$endif Test_Double_checksum}
 {$endif Test_Double_checksum}
 
 
 const
 const
-  CurrentPPUVersion = 95;
+  CurrentPPUVersion = 96;
 
 
 { buffer sizes }
 { buffer sizes }
   maxentrysize = 1024;
   maxentrysize = 1024;

+ 1 - 1
compiler/procinfo.pas

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

+ 16 - 16
compiler/sparc/cgcpu.pas

@@ -157,7 +157,7 @@ implementation
           assigned(ref.symbol) then
           assigned(ref.symbol) then
           begin
           begin
             tmpreg:=GetIntRegister(list,OS_INT);
             tmpreg:=GetIntRegister(list,OS_INT);
-            reference_reset(tmpref);
+            reference_reset(tmpref,ref.alignment);
             tmpref.symbol:=ref.symbol;
             tmpref.symbol:=ref.symbol;
             tmpref.refaddr:=addr_pic;
             tmpref.refaddr:=addr_pic;
             if not(pi_needs_got in current_procinfo.flags) then
             if not(pi_needs_got in current_procinfo.flags) then
@@ -184,7 +184,7 @@ implementation
            (ref.offset>simm13hi) then
            (ref.offset>simm13hi) then
           begin
           begin
             tmpreg:=GetIntRegister(list,OS_INT);
             tmpreg:=GetIntRegister(list,OS_INT);
-            reference_reset(tmpref);
+            reference_reset(tmpref,ref.alignment);
             tmpref.symbol:=ref.symbol;
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
             tmpref.offset:=ref.offset;
             tmpref.refaddr:=addr_high;
             tmpref.refaddr:=addr_high;
@@ -325,7 +325,7 @@ implementation
                 begin
                 begin
                   if (Index=NR_SP) and (Offset<Target_info.first_parm_offset) then
                   if (Index=NR_SP) and (Offset<Target_info.first_parm_offset) then
                     InternalError(2002081104);
                     InternalError(2002081104);
-                  reference_reset_base(ref,index,offset);
+                  reference_reset_base(ref,index,offset,paraloc.alignment);
                 end;
                 end;
               a_load_const_ref(list,size,a,ref);
               a_load_const_ref(list,size,a,ref);
             end;
             end;
@@ -353,7 +353,7 @@ implementation
                     begin
                     begin
                       if (Index=NR_SP) and (Offset<Target_info.first_parm_offset) then
                       if (Index=NR_SP) and (Offset<Target_info.first_parm_offset) then
                         InternalError(2002081104);
                         InternalError(2002081104);
-                      reference_reset_base(ref,index,offset);
+                      reference_reset_base(ref,index,offset,paraloc.alignment);
                     end;
                     end;
                   tmpreg:=GetIntRegister(list,OS_INT);
                   tmpreg:=GetIntRegister(list,OS_INT);
                   a_load_ref_reg(list,sz,sz,r,tmpreg);
                   a_load_ref_reg(list,sz,sz,r,tmpreg);
@@ -379,7 +379,7 @@ implementation
                 a_loadaddr_ref_reg(list,r,register);
                 a_loadaddr_ref_reg(list,r,register);
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 begin
-                  reference_reset(ref);
+                  reference_reset(ref,paraloc.alignment);
                   ref.base := reference.index;
                   ref.base := reference.index;
                   ref.offset := reference.offset;
                   ref.offset := reference.offset;
                   tmpreg:=GetAddressRegister(list);
                   tmpreg:=GetAddressRegister(list);
@@ -407,7 +407,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);
+                  reference_reset_base(href2,hloc^.reference.index,hloc^.reference.offset,paraloc.alignment);
                   a_load_ref_ref(list,hloc^.size,hloc^.size,href,href2);
                   a_load_ref_ref(list,hloc^.size,hloc^.size,href,href2);
                 end;
                 end;
               else
               else
@@ -611,7 +611,7 @@ implementation
           assigned(href.symbol) then
           assigned(href.symbol) then
           begin
           begin
             tmpreg:=GetIntRegister(list,OS_ADDR);
             tmpreg:=GetIntRegister(list,OS_ADDR);
-            reference_reset(tmpref);
+            reference_reset(tmpref,href.alignment);
             tmpref.symbol:=href.symbol;
             tmpref.symbol:=href.symbol;
             tmpref.refaddr:=addr_pic;
             tmpref.refaddr:=addr_pic;
             if not(pi_needs_got in current_procinfo.flags) then
             if not(pi_needs_got in current_procinfo.flags) then
@@ -639,7 +639,7 @@ implementation
            (href.offset>simm13hi) then
            (href.offset>simm13hi) then
           begin
           begin
             hreg:=GetAddressRegister(list);
             hreg:=GetAddressRegister(list);
-            reference_reset(tmpref);
+            reference_reset(tmpref,href.alignment);
             tmpref.symbol := href.symbol;
             tmpref.symbol := href.symbol;
             tmpref.offset := href.offset;
             tmpref.offset := href.offset;
             tmpref.refaddr := addr_high;
             tmpref.refaddr := addr_high;
@@ -1083,7 +1083,7 @@ implementation
       begin
       begin
         if paramanager.ret_in_param(current_procinfo.procdef.returndef,current_procinfo.procdef.proccalloption) then
         if paramanager.ret_in_param(current_procinfo.procdef.returndef,current_procinfo.procdef.proccalloption) then
           begin
           begin
-            reference_reset(hr);
+            reference_reset(hr,sizeof(pint));
             hr.offset:=12;
             hr.offset:=12;
             hr.refaddr:=addr_full;
             hr.refaddr:=addr_full;
             if nostackframe then
             if nostackframe then
@@ -1174,8 +1174,8 @@ implementation
           g_concatcopy_move(list,source,dest,len)
           g_concatcopy_move(list,source,dest,len)
         else
         else
           begin
           begin
-            reference_reset(src);
-            reference_reset(dst);
+            reference_reset(src,source.alignment);
+            reference_reset(dst,dest.alignment);
             { load the address of source into src.base }
             { load the address of source into src.base }
             src.base:=GetAddressRegister(list);
             src.base:=GetAddressRegister(list);
             a_loadaddr_ref_reg(list,source,src.base);
             a_loadaddr_ref_reg(list,source,src.base);
@@ -1263,8 +1263,8 @@ implementation
           g_concatcopy_move(list,source,dest,len)
           g_concatcopy_move(list,source,dest,len)
         else
         else
           begin
           begin
-            reference_reset(src);
-            reference_reset(dst);
+            reference_reset(src,source.alignment);
+            reference_reset(dst,dst.alignment);
             { load the address of source into src.base }
             { load the address of source into src.base }
             src.base:=GetAddressRegister(list);
             src.base:=GetAddressRegister(list);
             a_loadaddr_ref_reg(list,source,src.base);
             a_loadaddr_ref_reg(list,source,src.base);
@@ -1345,16 +1345,16 @@ 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,NR_O0,0);
+            reference_reset_base(href,NR_O0,0,sizeof(pint));
             cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_G1);
             cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_G1);
             { jmp *vmtoffs(%eax) ; method offs }
             { jmp *vmtoffs(%eax) ; method offs }
-            reference_reset_base(href,NR_G1,procdef._class.vmtmethodoffset(procdef.extnumber));
+            reference_reset_base(href,NR_G1,procdef._class.vmtmethodoffset(procdef.extnumber),sizeof(pint));
             list.concat(taicpu.op_ref_reg(A_LD,href,NR_G1));
             list.concat(taicpu.op_ref_reg(A_LD,href,NR_G1));
             list.concat(taicpu.op_reg(A_JMP,NR_G1));
             list.concat(taicpu.op_reg(A_JMP,NR_G1));
           end
           end
         else
         else
           begin
           begin
-            reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0);
+            reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0,sizeof(pint));
             href.refaddr := addr_high;
             href.refaddr := addr_high;
             list.concat(taicpu.op_ref_reg(A_SETHI,href,NR_G1));
             list.concat(taicpu.op_ref_reg(A_SETHI,href,NR_G1));
             href.refaddr := addr_low;
             href.refaddr := addr_low;

+ 1 - 1
compiler/sparc/ncpucnv.pas

@@ -146,7 +146,7 @@ implementation
           begin
           begin
             current_asmdata.getdatalabel(l1);
             current_asmdata.getdatalabel(l1);
             current_asmdata.getjumplabel(l2);
             current_asmdata.getjumplabel(l2);
-            reference_reset_symbol(href,l1,0);
+            reference_reset_symbol(href,l1,0,8);
             hregister:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
             hregister:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
             cg.a_load_loc_reg(current_asmdata.CurrAsmList,OS_32,left.location,hregister);
             cg.a_load_loc_reg(current_asmdata.CurrAsmList,OS_32,left.location,hregister);
 
 

+ 2 - 2
compiler/sparc/ncpuset.pas

@@ -97,14 +97,14 @@ unit ncpuset;
         indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,hregister,indexreg);
         cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,hregister,indexreg);
         { create reference }
         { create reference }
-        reference_reset_symbol(href,table,0);
+        reference_reset_symbol(href,table,0,sizeof(pint));
         href.offset:=(-aint(min_))*4;
         href.offset:=(-aint(min_))*4;
         basereg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         basereg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,basereg);
         cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,basereg);
 
 
         jmpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
         jmpreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
 
 
-        reference_reset(href);
+        reference_reset(href,sizeof(pint));
         href.index:=indexreg;
         href.index:=indexreg;
         href.base:=basereg;
         href.base:=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);

+ 5 - 4
compiler/sparc/rgcpu.pas

@@ -44,6 +44,7 @@ implementation
 
 
     uses
     uses
       verbose,cutils,
       verbose,cutils,
+      globtype,
       cgobj;
       cgobj;
 
 
     procedure trgcpu.add_constraints(reg:tregister);
     procedure trgcpu.add_constraints(reg:tregister);
@@ -102,7 +103,7 @@ implementation
             else
             else
               hreg:=cg.getintregister(helplist,OS_ADDR);
               hreg:=cg.getintregister(helplist,OS_ADDR);
 
 
-            reference_reset(tmpref);
+            reference_reset(tmpref,sizeof(pint));
             tmpref.offset:=spilltemp.offset;
             tmpref.offset:=spilltemp.offset;
             tmpref.refaddr:=addr_high;
             tmpref.refaddr:=addr_high;
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
@@ -110,7 +111,7 @@ implementation
             tmpref.refaddr:=addr_low;
             tmpref.refaddr:=addr_low;
             helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
             helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
 
 
-            reference_reset_base(tmpref,hreg,0);
+            reference_reset_base(tmpref,hreg,0,sizeof(aint));
             tmpref.index:=spilltemp.base;
             tmpref.index:=spilltemp.base;
 
 
             helpins:=spilling_create_load(tmpref,tempreg);
             helpins:=spilling_create_load(tmpref,tempreg);
@@ -138,7 +139,7 @@ implementation
             else
             else
               hreg:=cg.getintregister(helplist,OS_ADDR);
               hreg:=cg.getintregister(helplist,OS_ADDR);
 
 
-            reference_reset(tmpref);
+            reference_reset(tmpref,sizeof(aint));
             tmpref.offset:=spilltemp.offset;
             tmpref.offset:=spilltemp.offset;
             tmpref.refaddr:=addr_high;
             tmpref.refaddr:=addr_high;
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
             helplist.concat(taicpu.op_ref_reg(A_SETHI,tmpref,hreg));
@@ -146,7 +147,7 @@ implementation
             tmpref.refaddr:=addr_low;
             tmpref.refaddr:=addr_low;
             helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
             helplist.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
 
 
-            reference_reset_base(tmpref,hreg,0);
+            reference_reset_base(tmpref,hreg,0,sizeof(aint));
             tmpref.index:=spilltemp.base;
             tmpref.index:=spilltemp.base;
 
 
             helplist.concat(spilling_create_store(tempreg,tmpref));
             helplist.concat(spilling_create_store(tempreg,tmpref));

+ 4 - 4
compiler/systems/t_win.pas

@@ -508,15 +508,15 @@ implementation
                       current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(ExtractFileName(ImportLibrary.Name)+'_index_'+tostr(ImportSymbol.ordnr),AT_FUNCTION,0));
                       current_asmdata.asmlists[al_imports].concat(Tai_symbol.Createname_global(ExtractFileName(ImportLibrary.Name)+'_index_'+tostr(ImportSymbol.ordnr),AT_FUNCTION,0));
                     current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
                     current_asmdata.asmlists[al_imports].concat(tai_function_name.create(''));
                   {$ifdef ARM}
                   {$ifdef ARM}
-                    reference_reset_symbol(href,l5,0);
+                    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);
+                    reference_reset_base(href,NR_R12,0,sizeof(pint));
                     current_asmdata.asmlists[al_imports].concat(Taicpu.op_reg_ref(A_LDR,NR_R15,href));
                     current_asmdata.asmlists[al_imports].concat(Taicpu.op_reg_ref(A_LDR,NR_R15,href));
                     current_asmdata.asmlists[al_imports].concat(Tai_label.Create(l5));
                     current_asmdata.asmlists[al_imports].concat(Tai_label.Create(l5));
-                    reference_reset_symbol(href,l4,0);
+                    reference_reset_symbol(href,l4,0,sizeof(pint));
                     current_asmdata.asmlists[al_imports].concat(tai_const.create_sym_offset(href.symbol,href.offset));
                     current_asmdata.asmlists[al_imports].concat(tai_const.create_sym_offset(href.symbol,href.offset));
                   {$else ARM}
                   {$else ARM}
-                    reference_reset_symbol(href,l4,0);
+                    reference_reset_symbol(href,l4,0,sizeof(pint));
                     current_asmdata.asmlists[al_imports].concat(Taicpu.Op_ref(A_JMP,S_NO,href));
                     current_asmdata.asmlists[al_imports].concat(Taicpu.Op_ref(A_JMP,S_NO,href));
                     current_asmdata.asmlists[al_imports].concat(Tai_align.Create_op(4,$90));
                     current_asmdata.asmlists[al_imports].concat(Tai_align.Create_op(4,$90));
                   {$endif ARM}
                   {$endif ARM}

+ 17 - 17
compiler/x86/cgx86.pas

@@ -384,7 +384,7 @@ unit cgx86;
         if (cs_create_pic in current_settings.moduleswitches) and
         if (cs_create_pic in current_settings.moduleswitches) and
          assigned(ref.symbol) and not((ref.symbol.bind=AB_LOCAL) and (ref.symbol.typ in [AT_LABEL,AT_FUNCTION])) then
          assigned(ref.symbol) and not((ref.symbol.bind=AB_LOCAL) and (ref.symbol.typ in [AT_LABEL,AT_FUNCTION])) then
           begin
           begin
-            reference_reset_symbol(href,ref.symbol,0);
+            reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
             hreg:=getaddressregister(list);
             hreg:=getaddressregister(list);
             href.refaddr:=addr_pic;
             href.refaddr:=addr_pic;
             href.base:=NR_RIP;
             href.base:=NR_RIP;
@@ -435,7 +435,7 @@ unit cgx86;
            not((ref.symbol.bind=AB_LOCAL) and
            not((ref.symbol.bind=AB_LOCAL) and
                (ref.symbol.typ in [AT_LABEL,AT_FUNCTION])) then
                (ref.symbol.typ in [AT_LABEL,AT_FUNCTION])) then
           begin
           begin
-            reference_reset_symbol(href,ref.symbol,0);
+            reference_reset_symbol(href,ref.symbol,0,sizeof(pint));
             href.base:=current_procinfo.got;
             href.base:=current_procinfo.got;
             href.refaddr:=addr_pic;
             href.refaddr:=addr_pic;
             include(current_procinfo.flags,pi_needs_got);
             include(current_procinfo.flags,pi_needs_got);
@@ -576,7 +576,7 @@ unit cgx86;
           list.concat(taicpu.op_sym(A_JMP,S_NO,current_asmdata.RefAsmSymbol(s)))
           list.concat(taicpu.op_sym(A_JMP,S_NO,current_asmdata.RefAsmSymbol(s)))
         else
         else
           begin
           begin
-            reference_reset_symbol(r,get_darwin_call_stub(s,false),0);
+            reference_reset_symbol(r,get_darwin_call_stub(s,false),0,sizeof(pint));
             r.refaddr:=addr_full;
             r.refaddr:=addr_full;
             list.concat(taicpu.op_ref(A_JMP,S_NO,r));
             list.concat(taicpu.op_ref(A_JMP,S_NO,r));
           end;
           end;
@@ -628,7 +628,7 @@ unit cgx86;
               sym:=current_asmdata.RefAsmSymbol(s)
               sym:=current_asmdata.RefAsmSymbol(s)
             else
             else
               sym:=current_asmdata.WeakRefAsmSymbol(s);
               sym:=current_asmdata.WeakRefAsmSymbol(s);
-            reference_reset_symbol(r,sym,0);
+            reference_reset_symbol(r,sym,0,sizeof(pint));
             if (cs_create_pic in current_settings.moduleswitches) and
             if (cs_create_pic in current_settings.moduleswitches) and
                { darwin/x86_64's assembler doesn't want @PLT after call symbols }
                { darwin/x86_64's assembler doesn't want @PLT after call symbols }
                (target_info.system<>system_x86_64_darwin) then
                (target_info.system<>system_x86_64_darwin) then
@@ -643,7 +643,7 @@ unit cgx86;
           end
           end
         else
         else
           begin
           begin
-            reference_reset_symbol(r,get_darwin_call_stub(s,weak),0);
+            reference_reset_symbol(r,get_darwin_call_stub(s,weak),0,sizeof(pint));
             r.refaddr:=addr_full;
             r.refaddr:=addr_full;
           end;
           end;
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
@@ -656,7 +656,7 @@ unit cgx86;
         r : treference;
         r : treference;
       begin
       begin
         sym:=current_asmdata.RefAsmSymbol(s);
         sym:=current_asmdata.RefAsmSymbol(s);
-        reference_reset_symbol(r,sym,0);
+        reference_reset_symbol(r,sym,0,sizeof(pint));
         r.refaddr:=addr_full;
         r.refaddr:=addr_full;
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
         list.concat(taicpu.op_ref(A_CALL,S_NO,r));
       end;
       end;
@@ -829,13 +829,13 @@ unit cgx86;
                           begin
                           begin
                              reference_reset_base(tmpref,
                              reference_reset_base(tmpref,
                                g_indirect_sym_load(list,ref.symbol.name,ref.symbol.bind=AB_WEAK_EXTERNAL),
                                g_indirect_sym_load(list,ref.symbol.name,ref.symbol.bind=AB_WEAK_EXTERNAL),
-                               offset);
+                               offset,sizeof(pint));
                              a_loadaddr_ref_reg(list,tmpref,r);
                              a_loadaddr_ref_reg(list,tmpref,r);
                           end
                           end
                        else
                        else
                          begin
                          begin
                            include(current_procinfo.flags,pi_needs_got);
                            include(current_procinfo.flags,pi_needs_got);
-                           reference_reset_base(tmpref,current_procinfo.got,offset);
+                           reference_reset_base(tmpref,current_procinfo.got,offset,ref.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));
@@ -844,12 +844,12 @@ unit cgx86;
                     else if (cs_create_pic in current_settings.moduleswitches) then
                     else if (cs_create_pic in current_settings.moduleswitches) then
                       begin
                       begin
 {$ifdef x86_64}
 {$ifdef x86_64}
-                        reference_reset_symbol(tmpref,ref.symbol,0);
+                        reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment);
                         tmpref.refaddr:=addr_pic;
                         tmpref.refaddr:=addr_pic;
                         tmpref.base:=NR_RIP;
                         tmpref.base:=NR_RIP;
                         list.concat(taicpu.op_ref_reg(A_MOV,S_Q,tmpref,r));
                         list.concat(taicpu.op_ref_reg(A_MOV,S_Q,tmpref,r));
 {$else x86_64}
 {$else x86_64}
-                        reference_reset_symbol(tmpref,ref.symbol,0);
+                        reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment);
                         tmpref.refaddr:=addr_pic;
                         tmpref.refaddr:=addr_pic;
                         tmpref.base:=current_procinfo.got;
                         tmpref.base:=current_procinfo.got;
                         include(current_procinfo.flags,pi_needs_got);
                         include(current_procinfo.flags,pi_needs_got);
@@ -890,7 +890,7 @@ unit cgx86;
                       system_i386_linux:
                       system_i386_linux:
                         if segment=NR_GS then
                         if segment=NR_GS then
                           begin
                           begin
-                            reference_reset_symbol(tmpref,current_asmdata.RefAsmSymbol('___fpc_threadvar_offset'),0);
+                            reference_reset_symbol(tmpref,current_asmdata.RefAsmSymbol('___fpc_threadvar_offset'),0,ref.alignment);
                             tmpref.segment:=NR_GS;
                             tmpref.segment:=NR_GS;
                             list.concat(Taicpu.op_ref_reg(A_ADD,tcgsize2opsize[OS_ADDR],tmpref,r));
                             list.concat(Taicpu.op_ref_reg(A_ADD,tcgsize2opsize[OS_ADDR],tmpref,r));
                           end
                           end
@@ -1916,7 +1916,7 @@ unit cgx86;
                     list.concat(Taicpu.Op_const_reg(A_SUB,S_L,localsize-4,NR_ESP));
                     list.concat(Taicpu.Op_const_reg(A_SUB,S_L,localsize-4,NR_ESP));
                     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);
+                         reference_reset_base(href,NR_ESP,localsize-i*winstackpagesize,4);
                          list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                          list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                       end;
                       end;
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
                     list.concat(Taicpu.op_reg(A_PUSH,S_L,NR_EAX));
@@ -1933,7 +1933,7 @@ unit cgx86;
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     list.concat(Taicpu.op_reg(A_DEC,S_L,NR_EDI));
                     a_jmp_cond(list,OC_NE,again);
                     a_jmp_cond(list,OC_NE,again);
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,localsize mod winstackpagesize - 4,NR_ESP));
                     list.concat(Taicpu.op_const_reg(A_SUB,S_L,localsize mod winstackpagesize - 4,NR_ESP));
-                    reference_reset_base(href,NR_ESP,localsize-4);
+                    reference_reset_base(href,NR_ESP,localsize-4,4);
                     list.concat(Taicpu.op_ref_reg(A_MOV,S_L,href,NR_EDI));
                     list.concat(Taicpu.op_ref_reg(A_MOV,S_L,href,NR_EDI));
                     ungetcpuregister(list,NR_EDI);
                     ungetcpuregister(list,NR_EDI);
                  end
                  end
@@ -1953,10 +1953,10 @@ unit cgx86;
                     list.concat(Taicpu.Op_const_reg(A_SUB,S_Q,localsize,NR_RSP));
                     list.concat(Taicpu.Op_const_reg(A_SUB,S_Q,localsize,NR_RSP));
                     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);
+                         reference_reset_base(href,NR_RSP,localsize-i*winstackpagesize+4,4);
                          list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                          list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                       end;
                       end;
-                    reference_reset_base(href,NR_RSP,0);
+                    reference_reset_base(href,NR_RSP,0,4);
                     list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                     list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                  end
                  end
                else
                else
@@ -1966,7 +1966,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);
                     list.concat(Taicpu.op_const_reg(A_SUB,S_Q,winstackpagesize,NR_RSP));
                     list.concat(Taicpu.op_const_reg(A_SUB,S_Q,winstackpagesize,NR_RSP));
-                    reference_reset_base(href,NR_RSP,0);
+                    reference_reset_base(href,NR_RSP,0,4);
                     list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                     list.concat(Taicpu.op_reg_ref(A_MOV,S_L,NR_EAX,href));
                     list.concat(Taicpu.op_reg(A_DEC,S_Q,NR_R10));
                     list.concat(Taicpu.op_reg(A_DEC,S_Q,NR_R10));
                     a_jmp_cond(list,OC_NE,again);
                     a_jmp_cond(list,OC_NE,again);
@@ -2085,7 +2085,7 @@ unit cgx86;
          end;
          end;
 
 
         sym:=current_asmdata.RefAsmSymbol(externalname);
         sym:=current_asmdata.RefAsmSymbol(externalname);
-        reference_reset_symbol(ref,sym,0);
+        reference_reset_symbol(ref,sym,0,sizeof(pint));
 
 
         { create pic'ed? }
         { create pic'ed? }
         if (cs_create_pic in current_settings.moduleswitches) and
         if (cs_create_pic in current_settings.moduleswitches) and

+ 1 - 1
compiler/x86/nx86cnv.pas

@@ -347,7 +347,7 @@ implementation
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(0));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(0));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(longint ($80000000)));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit(longint ($80000000)));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit($0000403f));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_const.Create_32bit($0000403f));
-                   reference_reset_symbol(href,l1,0);
+                   reference_reset_symbol(href,l1,0,4);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,href);
                    tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,href);
                    current_asmdata.CurrAsmList.concat(Taicpu.Op_ref(A_FLD,S_FX,href));
                    current_asmdata.CurrAsmList.concat(Taicpu.Op_ref(A_FLD,S_FX,href));
                    current_asmdata.CurrAsmList.concat(Taicpu.Op_reg_reg(A_FADDP,S_NO,NR_ST,NR_ST1));
                    current_asmdata.CurrAsmList.concat(Taicpu.Op_reg_reg(A_FADDP,S_NO,NR_ST,NR_ST1));

+ 6 - 6
compiler/x86/nx86inl.pas

@@ -229,9 +229,9 @@ implementation
              location:=left.location;
              location:=left.location;
              case tfloatdef(resultdef).floattype of
              case tfloatdef(resultdef).floattype of
                s32real:
                s32real:
-                 reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_ABSMASK_SINGLE'),0);
+                 reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_ABSMASK_SINGLE'),0,4);
                s64real:
                s64real:
-                 reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_ABSMASK_DOUBLE'),0);
+                 reference_reset_symbol(href,current_asmdata.RefAsmSymbol('FPC_ABSMASK_DOUBLE'),0,4);
                else
                else
                  internalerror(200506081);
                  internalerror(200506081);
              end;
              end;
@@ -267,7 +267,7 @@ implementation
 {$endif x86_64}
 {$endif x86_64}
           begin
           begin
             load_fpu_location;
             load_fpu_location;
-            location_reset(location,LOC_REFERENCE,OS_S64);
+            location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
             tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
             tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
             emit_ref(A_FISTP,S_IQ,location.reference);
             emit_ref(A_FISTP,S_IQ,location.reference);
             emit_none(A_FWAIT,S_NO);
             emit_none(A_FWAIT,S_NO);
@@ -302,7 +302,7 @@ implementation
             if (current_settings.fputype>=fpu_sse3) then
             if (current_settings.fputype>=fpu_sse3) then
               begin
               begin
                 load_fpu_location;
                 load_fpu_location;
-                location_reset(location,LOC_REFERENCE,OS_S64);
+                location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
                 tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
                 tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
                 emit_ref(A_FISTTP,S_IQ,location.reference);
                 emit_ref(A_FISTTP,S_IQ,location.reference);
               end
               end
@@ -315,7 +315,7 @@ implementation
                 emit_const_ref(A_OR,S_W,$0f00,newcw);
                 emit_const_ref(A_OR,S_W,$0f00,newcw);
                 load_fpu_location;
                 load_fpu_location;
                 emit_ref(A_FLDCW,S_NO,newcw);
                 emit_ref(A_FLDCW,S_NO,newcw);
-                location_reset(location,LOC_REFERENCE,OS_S64);
+                location_reset_ref(location,LOC_REFERENCE,OS_S64,0);
                 tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
                 tg.GetTemp(current_asmdata.CurrAsmList,resultdef.size,resultdef.alignment,tt_normal,location.reference);
                 emit_ref(A_FISTP,S_IQ,location.reference);
                 emit_ref(A_FISTP,S_IQ,location.reference);
                 emit_ref(A_FLDCW,S_NO,oldcw);
                 emit_ref(A_FLDCW,S_NO,oldcw);
@@ -404,7 +404,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);
+                   reference_reset_base(ref,r,0,left.location.reference.alignment);
                    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/nx86mat.pas

@@ -177,7 +177,7 @@ interface
                 internalerror(2004110215);
                 internalerror(2004110215);
             end;
             end;
 
 
-            reference_reset_symbol(href,l1,0);
+            reference_reset_symbol(href,l1,0,resultdef.alignment);
             cg.a_loadmm_ref_reg(current_asmdata.CurrAsmList,def_cgsize(resultdef),def_cgsize(resultdef),href,reg,mms_movescalar);
             cg.a_loadmm_ref_reg(current_asmdata.CurrAsmList,def_cgsize(resultdef),def_cgsize(resultdef),href,reg,mms_movescalar);
 
 
             cg.a_opmm_reg_reg(current_asmdata.CurrAsmList,OP_XOR,left.location.size,reg,location.register,nil);
             cg.a_opmm_reg_reg(current_asmdata.CurrAsmList,OP_XOR,left.location.size,reg,location.register,nil);

+ 1 - 1
compiler/x86/nx86set.pas

@@ -125,7 +125,7 @@ implementation
         indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_INT);
         indexreg:=cg.makeregsize(current_asmdata.CurrAsmList,hregister,OS_INT);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opsize,OS_INT,hregister,indexreg);
         cg.a_load_reg_reg(current_asmdata.CurrAsmList,opsize,OS_INT,hregister,indexreg);
         { create reference }
         { create reference }
-        reference_reset_symbol(href,table,0);
+        reference_reset_symbol(href,table,0,sizeof(pint));
         href.offset:=(-aint(min_))*sizeof(aint);
         href.offset:=(-aint(min_))*sizeof(aint);
         href.index:=indexreg;
         href.index:=indexreg;
         href.scalefactor:=sizeof(aint);
         href.scalefactor:=sizeof(aint);

+ 5 - 5
compiler/x86_64/cgcpu.pas

@@ -137,7 +137,7 @@ unit cgcpu;
                 end;
                 end;
               LOC_REFERENCE:
               LOC_REFERENCE:
                 begin
                 begin
-                  reference_reset_base(ref,location^.reference.index,location^.reference.offset);
+                  reference_reset_base(ref,location^.reference.index,location^.reference.offset,paraloc.alignment);
                   g_concatcopy(list,tmpref,ref,sizeleft);
                   g_concatcopy(list,tmpref,ref,sizeleft);
                 end;
                 end;
               else
               else
@@ -219,19 +219,19 @@ unit cgcpu;
             { load vmt from first paramter }
             { load vmt from first paramter }
             { win64 uses a different abi }
             { win64 uses a different abi }
             if target_info.system=system_x86_64_win64 then
             if target_info.system=system_x86_64_win64 then
-              reference_reset_base(href,NR_RCX,0)
+              reference_reset_base(href,NR_RCX,0,sizeof(pint))
             else
             else
-              reference_reset_base(href,NR_RDI,0);
+              reference_reset_base(href,NR_RDI,0,sizeof(pint));
             cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_RAX);
             cg.a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,NR_RAX);
             { jmp *vmtoffs(%eax) ; method offs }
             { jmp *vmtoffs(%eax) ; method offs }
-            reference_reset_base(href,NR_RAX,procdef._class.vmtmethodoffset(procdef.extnumber));
+            reference_reset_base(href,NR_RAX,procdef._class.vmtmethodoffset(procdef.extnumber),sizeof(pint));
             list.concat(taicpu.op_ref_reg(A_MOV,S_Q,href,NR_RAX));
             list.concat(taicpu.op_ref_reg(A_MOV,S_Q,href,NR_RAX));
             list.concat(taicpu.op_reg(A_JMP,S_Q,NR_RAX));
             list.concat(taicpu.op_reg(A_JMP,S_Q,NR_RAX));
           end
           end
         else
         else
           begin
           begin
             sym:=current_asmdata.RefAsmSymbol(procdef.mangledname);
             sym:=current_asmdata.RefAsmSymbol(procdef.mangledname);
-            reference_reset_symbol(r,sym,0);
+            reference_reset_symbol(r,sym,0,sizeof(pint));
             if (cs_create_pic in current_settings.moduleswitches) and
             if (cs_create_pic in current_settings.moduleswitches) and
                { darwin/x86_64's assembler doesn't want @PLT after call symbols }
                { darwin/x86_64's assembler doesn't want @PLT after call symbols }
                (target_info.system<>system_x86_64_darwin) then
                (target_info.system<>system_x86_64_darwin) then

+ 1 - 1
compiler/x86_64/nx64cnv.pas

@@ -135,7 +135,7 @@ implementation
 
 
                    cg.a_jmp_flags(current_asmdata.CurrAsmList,F_NC,l2);
                    cg.a_jmp_flags(current_asmdata.CurrAsmList,F_NC,l2);
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
                    current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(l1));
-                   reference_reset_symbol(href,l1,0);
+                   reference_reset_symbol(href,l1,0,4);
 
 
                    { I got these constant from a test program (FK) }
                    { I got these constant from a test program (FK) }
                    if is_double(resultdef) then
                    if is_double(resultdef) then

+ 25 - 0
tests/webtbs/tw12137.pp

@@ -0,0 +1,25 @@
+{$t-}
+type
+  TElementValidator = object
+    FElementDef: pointer;
+    FCurCP: pointer;
+    FFailed: Boolean;
+  end; 
+
+var
+  FValidator: array of TElementValidator;
+  i: longint;
+begin
+  i:=1;
+  setlength(fvalidator,5);
+  writeln(ptruint(pointer(@fvalidator[1])-pointer(@fvalidator[0])));
+  { aligned }
+  fvalidator[0].felementdef:=@FValidator;
+  fvalidator[0].fcurcp:=@FValidator;
+  { unaligned }
+  fvalidator[1].felementdef:=@FValidator;
+  fvalidator[1].fcurcp:=@FValidator;
+  { unaligned }
+  fvalidator[i].felementdef:=@FValidator;
+  fvalidator[i].fcurcp:=@FValidator;
+end.