* fixed alignment of variant records

* more alignment problems fixed
This commit is contained in:
florian 2004-08-15 13:30:18 +00:00
parent 0ccc15675e
commit cf25a973f8
7 changed files with 53 additions and 25 deletions

View File

@ -182,9 +182,6 @@ interface
{ please keep the size of this record <=12 bytes and keep it properly aligned } { please keep the size of this record <=12 bytes and keep it properly aligned }
toper = record toper = record
ot : longint; ot : longint;
{$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
dummy1,dummy2,dummy3 : byte;
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
case typ : toptype of case typ : toptype of
top_none : (); top_none : ();
top_reg : (reg:tregister); top_reg : (reg:tregister);
@ -2217,7 +2214,11 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.87 2004-08-14 14:50:42 florian Revision 1.88 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.87 2004/08/14 14:50:42 florian
* fixed several sparc alignment issues * fixed several sparc alignment issues
+ Jonas' inline node patch; non functional yet + Jonas' inline node patch; non functional yet

View File

@ -81,6 +81,10 @@
{$define oldset} {$define oldset}
{$endif sparc} {$endif sparc}
{$ifdef cpusparc}
{$undef useinline}
{$endif cpusparc}
{$ifdef powerpc} {$ifdef powerpc}
{$define noopt} {$define noopt}
{$define oldset} {$define oldset}
@ -102,7 +106,11 @@
{ {
$Log$ $Log$
Revision 1.38 2004-06-20 08:55:29 florian Revision 1.39 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.38 2004/06/20 08:55:29 florian
* logs truncated * logs truncated
Revision 1.37 2004/06/16 20:07:07 florian Revision 1.37 2004/06/16 20:07:07 florian

View File

@ -410,11 +410,11 @@ implementation
the most complex code. Exceptions for this are: the most complex code. Exceptions for this are:
- result is in flags, loading left will then destroy the flags - result is in flags, loading left will then destroy the flags
- result need reference count, when left points to a value used in - result need reference count, when left points to a value used in
right then decreasing the refcnt on left can possibly release right then decreasing the refcnt on left can possibly release
the memory before right increased the refcnt, result is that an the memory before right increased the refcnt, result is that an
empty value is assigned empty value is assigned
- calln, call destroys most registers and is therefor 'complex' - calln, call destroys most registers and is therefor 'complex'
But not when the result is in the flags, then But not when the result is in the flags, then
loading the left node afterwards can destroy the flags. loading the left node afterwards can destroy the flags.
@ -959,7 +959,11 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.121 2004-07-15 20:47:53 jonas Revision 1.122 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.121 2004/07/15 20:47:53 jonas
- disabled temp-to-temp copy optimization, because it can cause errors - disabled temp-to-temp copy optimization, because it can cause errors
now that the local variables are temps as well (it can cause local now that the local variables are temps as well (it can cause local
variables to be "freed" in the middle of a procedure) variables to be "freed" in the middle of a procedure)

View File

@ -1209,13 +1209,16 @@ implementation
symtablestack:=symtablestack.next; symtablestack:=symtablestack.next;
{ Align the offset where the union symtable is added } { Align the offset where the union symtable is added }
if (trecordsymtable(symtablestack).usefieldalignment=-1) then if (trecordsymtable(symtablestack).usefieldalignment=-1) then
usedalign:=used_align(maxalignment,aktalignment.recordalignmin,aktalignment.maxCrecordalign) usedalign:=used_align(unionsymtable.recordalignment,aktalignment.recordalignmin,aktalignment.maxCrecordalign)
else else
usedalign:=used_align(maxalignment,aktalignment.recordalignmin,aktalignment.recordalignmax); usedalign:=used_align(unionsymtable.recordalignment,aktalignment.recordalignmin,aktalignment.recordalignmax);
offset:=align(trecordsymtable(symtablestack).datasize,usedalign); offset:=align(trecordsymtable(symtablestack).datasize,usedalign);
trecordsymtable(symtablestack).datasize:=offset+unionsymtable.datasize; trecordsymtable(symtablestack).datasize:=offset+unionsymtable.datasize;
if maxalignment>trecordsymtable(symtablestack).fieldalignment then
trecordsymtable(symtablestack).fieldalignment:=maxalignment; if unionsymtable.recordalignment>trecordsymtable(symtablestack).fieldalignment then
trecordsymtable(symtablestack).fieldalignment:=unionsymtable.recordalignment;
trecordsymtable(symtablestack).insertunionst(Unionsymtable,offset); trecordsymtable(symtablestack).insertunionst(Unionsymtable,offset);
Unionsym.owner:=nil; Unionsym.owner:=nil;
unionsym.free; unionsym.free;
@ -1231,7 +1234,11 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.77 2004-08-07 19:14:50 florian Revision 1.78 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.77 2004/08/07 19:14:50 florian
* fixed problem with explicit specified calling conventions for property symbols * fixed problem with explicit specified calling conventions for property symbols
Revision 1.76 2004/07/14 23:19:22 olle Revision 1.76 2004/07/14 23:19:22 olle

View File

@ -168,7 +168,7 @@ uses
{ reference record } { reference record }
preference = ^treference; preference = ^treference;
treference = packed record treference = record
{ base register, R_NO if none } { base register, R_NO if none }
base, base,
{ index register, R_NO if none } { index register, R_NO if none }
@ -224,11 +224,7 @@ type
References are given from the caller's point of view. The usual References are given from the caller's point of view. The usual
TLocation isn't used, because contains a lot of unnessary fields. TLocation isn't used, because contains a lot of unnessary fields.
} }
tparalocation = tparalocation = record
{$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
packed
{$endif FPC_REQUIRES_PROPER_ALIGNMENT}
record
Size : TCGSize; Size : TCGSize;
{ The location type where the parameter is passed, usually { The location type where the parameter is passed, usually
LOC_REFERENCE,LOC_REGISTER or LOC_FPUREGISTER LOC_REFERENCE,LOC_REGISTER or LOC_FPUREGISTER
@ -262,7 +258,7 @@ type
end; end;
tlocation = packed record tlocation = record
size : TCGSize; size : TCGSize;
loc : tcgloc; loc : tcgloc;
case tcgloc of case tcgloc of
@ -571,7 +567,11 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.69 2004-08-14 14:50:42 florian Revision 1.70 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.69 2004/08/14 14:50:42 florian
* fixed several sparc alignment issues * fixed several sparc alignment issues
+ Jonas' inline node patch; non functional yet + Jonas' inline node patch; non functional yet

View File

@ -1107,7 +1107,7 @@ implementation
varalign:=ps.vartype.def.alignment; varalign:=ps.vartype.def.alignment;
if varalign=0 then if varalign=0 then
varalign:=size_2_align(ps.getvaluesize); varalign:=size_2_align(ps.getvaluesize);
varalignrecord:=used_align(varalign,aktalignment.recordalignmin,aktalignment.recordalignmax); varalignrecord:=used_align(varalign,aktalignment.recordalignmin,fieldalignment);
recordalignment:=max(recordalignment,varalignrecord); recordalignment:=max(recordalignment,varalignrecord);
{ next } { next }
@ -2316,7 +2316,11 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.152 2004-07-09 22:17:32 peter Revision 1.153 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.152 2004/07/09 22:17:32 peter
* revert has_localst patch * revert has_localst patch
* replace aktstaticsymtable/aktglobalsymtable with current_module * replace aktstaticsymtable/aktglobalsymtable with current_module

View File

@ -344,7 +344,7 @@ unit i_linux;
use_function_relative_addresses : true use_function_relative_addresses : true
); );
system_SPARC_linux_info : tsysteminfo = system_sparc_linux_info : tsysteminfo =
( (
system : system_SPARC_Linux; system : system_SPARC_Linux;
name : 'Linux for SPARC'; name : 'Linux for SPARC';
@ -514,7 +514,11 @@ initialization
end. end.
{ {
$Log$ $Log$
Revision 1.28 2004-06-29 21:00:08 peter Revision 1.29 2004-08-15 13:30:18 florian
* fixed alignment of variant records
* more alignment problems fixed
Revision 1.28 2004/06/29 21:00:08 peter
* only enable dwarf for supported platforms * only enable dwarf for supported platforms
Revision 1.27 2004/06/20 08:55:32 florian Revision 1.27 2004/06/20 08:55:32 florian