diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-02-08 13:00:24 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2009-02-08 13:00:24 +0000 |
commit | 59c4e24824d8eeda4420de36ed33d3dbccd716db (patch) | |
tree | e3c083fe5018c9c5bef39fafcdc1aaf766d80d54 /compiler/cgutils.pas | |
parent | 0e6130b6fa510ea1c4135d0d657d81e08a5854f8 (diff) | |
download | fpc-59c4e24824d8eeda4420de36ed33d3dbccd716db.tar.gz |
* 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: http://svn.freepascal.org/svn/fpc/trunk@12719 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/cgutils.pas')
-rw-r--r-- | compiler/cgutils.pas | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/compiler/cgutils.pas b/compiler/cgutils.pas index 91ca6bcd3d..0243adab66 100644 --- a/compiler/cgutils.pas +++ b/compiler/cgutils.pas @@ -126,12 +126,12 @@ unit cgutils; { trerefence handling } {# 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 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 if so, returns TRUE, otherwise returns false. } @@ -139,7 +139,10 @@ unit cgutils; { 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_swap(var destloc,sourceloc : tlocation); @@ -154,32 +157,34 @@ unit cgutils; implementation uses - systems; + systems, + verbose; {**************************************************************************** TReference ****************************************************************************} - procedure reference_reset(var ref : treference); + procedure reference_reset(var ref : treference; alignment: longint); begin FillChar(ref,sizeof(treference),0); {$ifdef arm} ref.signindex:=1; {$endif arm} + ref.alignment:=alignment; 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 - reference_reset(ref); + reference_reset(ref,alignment); ref.base:=base; ref.offset:=offset; 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 - reference_reset(ref); + reference_reset(ref,alignment); ref.symbol:=sym; ref.offset:=offset; end; @@ -202,17 +207,28 @@ uses TLocation ****************************************************************************} - procedure location_reset(var l : tlocation;lt:TCGLoc;lsize:TCGSize); + procedure location_reset(var l : tlocation;lt:TCGNonRefLoc;lsize:TCGSize); begin FillChar(l,sizeof(tlocation),0); l.loc:=lt; l.size:=lsize; -{$ifdef arm} if l.loc in [LOC_REFERENCE,LOC_CREFERENCE] then - l.reference.signindex:=1; -{$endif arm} + { call location_reset_ref instead } + internalerror(2009020705); 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); begin |