mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 03:19:47 +01:00 
			
		
		
		
	* more record alignment fixes
This commit is contained in:
		
							parent
							
								
									e2df62fc08
								
							
						
					
					
						commit
						8caaa7740d
					
				@ -189,7 +189,8 @@ interface
 | 
			
		||||
       {$IFDEF testvarsets}
 | 
			
		||||
        Initsetalloc,                            {0=fixed, 1 =var}
 | 
			
		||||
       {$ENDIF}
 | 
			
		||||
       initpackenum       : longint;
 | 
			
		||||
       initpackrecords,
 | 
			
		||||
       initpackenum       : shortint;
 | 
			
		||||
       initalignment      : talignmentinfo;
 | 
			
		||||
       initoptprocessor,
 | 
			
		||||
       initspecificoptprocessor : tprocessors;
 | 
			
		||||
@ -210,6 +211,7 @@ interface
 | 
			
		||||
       {$IFDEF testvarsets}
 | 
			
		||||
        aktsetalloc,
 | 
			
		||||
       {$ENDIF}
 | 
			
		||||
       aktpackrecords,
 | 
			
		||||
       aktpackenum        : longint;
 | 
			
		||||
       aktmaxfpuregisters : longint;
 | 
			
		||||
       aktalignment       : talignmentinfo;
 | 
			
		||||
@ -1734,6 +1736,7 @@ implementation
 | 
			
		||||
 | 
			
		||||
        initfputype:=fpu_x87;
 | 
			
		||||
 | 
			
		||||
        initpackrecords:=4;
 | 
			
		||||
        initpackenum:=4;
 | 
			
		||||
        {$IFDEF testvarsets}
 | 
			
		||||
        initsetalloc:=0;
 | 
			
		||||
@ -1742,6 +1745,7 @@ implementation
 | 
			
		||||
{$endif i386}
 | 
			
		||||
{$ifdef m68k}
 | 
			
		||||
        initoptprocessor:=MC68020;
 | 
			
		||||
        initpackrecords:=2;
 | 
			
		||||
        initpackenum:=4;
 | 
			
		||||
        {$IFDEF testvarsets}
 | 
			
		||||
         initsetalloc:=0;
 | 
			
		||||
@ -1749,6 +1753,7 @@ implementation
 | 
			
		||||
{$endif m68k}
 | 
			
		||||
{$ifdef powerpc}
 | 
			
		||||
        initoptprocessor:=PPC604;
 | 
			
		||||
        initpackrecords:=4;
 | 
			
		||||
        initpackenum:=4;
 | 
			
		||||
        {$IFDEF testvarsets}
 | 
			
		||||
         initsetalloc:=0;
 | 
			
		||||
@ -1757,12 +1762,14 @@ implementation
 | 
			
		||||
{$endif powerpc}
 | 
			
		||||
{$ifdef sparc}
 | 
			
		||||
        initoptprocessor:=SPARC_V8;
 | 
			
		||||
        initpackrecords:=8;
 | 
			
		||||
        initpackenum:=4;
 | 
			
		||||
        {$IFDEF testvarsets}
 | 
			
		||||
         initsetalloc:=0;
 | 
			
		||||
        {$ENDIF}
 | 
			
		||||
{$endif sparc}
 | 
			
		||||
{$ifdef arm}
 | 
			
		||||
        initpackrecords:=4;
 | 
			
		||||
        initpackenum:=4;
 | 
			
		||||
        {$IFDEF testvarsets}
 | 
			
		||||
        initsetalloc:=0;
 | 
			
		||||
@ -1775,6 +1782,7 @@ implementation
 | 
			
		||||
 | 
			
		||||
        initfputype:=fpu_sse64;
 | 
			
		||||
 | 
			
		||||
        initpackrecords:=8;
 | 
			
		||||
        initpackenum:=4;
 | 
			
		||||
        {$IFDEF testvarsets}
 | 
			
		||||
        initsetalloc:=0;
 | 
			
		||||
@ -1796,7 +1804,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.122  2004-01-28 21:05:56  florian
 | 
			
		||||
  Revision 1.123  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.122  2004/01/28 21:05:56  florian
 | 
			
		||||
    * fixed alignment of classes
 | 
			
		||||
 | 
			
		||||
  Revision 1.121  2004/01/14 23:39:05  florian
 | 
			
		||||
 | 
			
		||||
@ -341,6 +341,7 @@ implementation
 | 
			
		||||
          oldaktlocalswitches  : tlocalswitches;
 | 
			
		||||
          oldaktmoduleswitches : tmoduleswitches;
 | 
			
		||||
          oldaktfilepos      : tfileposinfo;
 | 
			
		||||
          oldaktpackrecords,
 | 
			
		||||
          oldaktpackenum,oldaktmaxfpuregisters : longint;
 | 
			
		||||
          oldaktalignment  : talignmentinfo;
 | 
			
		||||
          oldaktoutputformat : tasm;
 | 
			
		||||
@ -421,6 +422,7 @@ implementation
 | 
			
		||||
            oldaktmoduleswitches:=aktmoduleswitches;
 | 
			
		||||
            oldaktalignment:=aktalignment;
 | 
			
		||||
            oldaktpackenum:=aktpackenum;
 | 
			
		||||
            oldaktpackrecords:=aktpackrecords;
 | 
			
		||||
            oldaktfputype:=aktfputype;
 | 
			
		||||
            oldaktmaxfpuregisters:=aktmaxfpuregisters;
 | 
			
		||||
            oldaktoutputformat:=aktoutputformat;
 | 
			
		||||
@ -478,6 +480,7 @@ implementation
 | 
			
		||||
         aktalignment:=initalignment;
 | 
			
		||||
         aktfputype:=initfputype;
 | 
			
		||||
         aktpackenum:=initpackenum;
 | 
			
		||||
         aktpackrecords:=initpackrecords;
 | 
			
		||||
         aktoutputformat:=initoutputformat;
 | 
			
		||||
         set_target_asm(aktoutputformat);
 | 
			
		||||
         aktoptprocessor:=initoptprocessor;
 | 
			
		||||
@ -608,6 +611,7 @@ implementation
 | 
			
		||||
                 aktmoduleswitches:=oldaktmoduleswitches;
 | 
			
		||||
                 aktalignment:=oldaktalignment;
 | 
			
		||||
                 aktpackenum:=oldaktpackenum;
 | 
			
		||||
                 aktpackrecords:=oldaktpackrecords;
 | 
			
		||||
                 aktmaxfpuregisters:=oldaktmaxfpuregisters;
 | 
			
		||||
                 aktoutputformat:=oldaktoutputformat;
 | 
			
		||||
                 set_target_asm(aktoutputformat);
 | 
			
		||||
@ -691,7 +695,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.58  2003-10-29 21:02:51  peter
 | 
			
		||||
  Revision 1.59  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.58  2003/10/29 21:02:51  peter
 | 
			
		||||
    * set ms_compiled after the program/unit is parsed
 | 
			
		||||
    * check for ms_compiled before checking preproc matches
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1064,7 +1064,7 @@ implementation
 | 
			
		||||
              if not(is_ordinal(casetype.def)) or is_64bitint(casetype.def)  then
 | 
			
		||||
               Message(type_e_ordinal_expr_expected);
 | 
			
		||||
              consume(_OF);
 | 
			
		||||
              UnionSymtable:=trecordsymtable.create;
 | 
			
		||||
              UnionSymtable:=trecordsymtable.create(aktpackrecords);
 | 
			
		||||
              Unionsymtable.next:=symtablestack;
 | 
			
		||||
              registerdef:=false;
 | 
			
		||||
              UnionDef:=trecorddef.create(unionsymtable);
 | 
			
		||||
@ -1114,7 +1114,7 @@ implementation
 | 
			
		||||
              symtablestack:=symtablestack.next;
 | 
			
		||||
              { we do NOT call symtablestack.insert
 | 
			
		||||
               on purpose PM }
 | 
			
		||||
              if aktalignment.recordalignmax=-1 then
 | 
			
		||||
              if trecordsymtable(symtablestack).usefieldalignment=-1 then
 | 
			
		||||
               begin
 | 
			
		||||
{$ifdef i386}
 | 
			
		||||
                 if maxalignment>2 then
 | 
			
		||||
@ -1152,7 +1152,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.60  2004-01-28 20:30:18  peter
 | 
			
		||||
  Revision 1.61  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.60  2004/01/28 20:30:18  peter
 | 
			
		||||
    * record alignment splitted in fieldalignment and recordalignment,
 | 
			
		||||
      the latter is used when this record is inserted in another record.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -198,7 +198,7 @@ implementation
 | 
			
		||||
        addtype('$s80real',s80floattype);
 | 
			
		||||
        addtype('$s64currency',s64currencytype);
 | 
			
		||||
        { Add a type for virtual method tables }
 | 
			
		||||
        hrecst:=trecordsymtable.create;
 | 
			
		||||
        hrecst:=trecordsymtable.create(aktpackrecords);
 | 
			
		||||
        vmttype.setdef(trecorddef.create(hrecst));
 | 
			
		||||
        pvmttype.setdef(tpointerdef.create(vmttype));
 | 
			
		||||
        hrecst.insertfield(tvarsym.create('$parent',vs_value,pvmttype),true);
 | 
			
		||||
@ -213,7 +213,7 @@ implementation
 | 
			
		||||
        tarraydef(vmtarraytype.def).setelementtype(pvmttype);
 | 
			
		||||
        addtype('$vtblarray',vmtarraytype);
 | 
			
		||||
        { Add a type for methodpointers }
 | 
			
		||||
        hrecst:=trecordsymtable.create;
 | 
			
		||||
        hrecst:=trecordsymtable.create(1);
 | 
			
		||||
        hrecst.insertfield(tvarsym.create('$proc',vs_value,voidpointertype),true);
 | 
			
		||||
        hrecst.insertfield(tvarsym.create('$self',vs_value,voidpointertype),true);
 | 
			
		||||
        methodpointertype.setdef(trecorddef.create(hrecst));
 | 
			
		||||
@ -521,7 +521,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.59  2004-01-20 12:59:37  florian
 | 
			
		||||
  Revision 1.60  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.59  2004/01/20 12:59:37  florian
 | 
			
		||||
    * common addnode code for x86-64 and i386
 | 
			
		||||
 | 
			
		||||
  Revision 1.58  2003/11/29 16:19:54  peter
 | 
			
		||||
 | 
			
		||||
@ -226,7 +226,7 @@ implementation
 | 
			
		||||
         old_object_option : tsymoptions;
 | 
			
		||||
      begin
 | 
			
		||||
         { create recdef }
 | 
			
		||||
         symtable:=trecordsymtable.create;
 | 
			
		||||
         symtable:=trecordsymtable.create(aktpackrecords);
 | 
			
		||||
         record_dec:=trecorddef.create(symtable);
 | 
			
		||||
         { update symtable stack }
 | 
			
		||||
         symtable.next:=symtablestack;
 | 
			
		||||
@ -582,13 +582,13 @@ implementation
 | 
			
		||||
                  array_dec
 | 
			
		||||
                else
 | 
			
		||||
                  begin
 | 
			
		||||
                    oldaktpackrecords:=aktalignment.recordalignmax;
 | 
			
		||||
                    aktalignment.recordalignmax:=1;
 | 
			
		||||
                    oldaktpackrecords:=aktpackrecords;
 | 
			
		||||
                    aktpackrecords:=1;
 | 
			
		||||
                    if token in [_CLASS,_OBJECT] then
 | 
			
		||||
                      tt.setdef(object_dec(name,nil))
 | 
			
		||||
                    else
 | 
			
		||||
                      tt.setdef(record_dec);
 | 
			
		||||
                    aktalignment.recordalignmax:=oldaktpackrecords;
 | 
			
		||||
                    aktpackrecords:=oldaktpackrecords;
 | 
			
		||||
                  end;
 | 
			
		||||
              end;
 | 
			
		||||
            _CLASS,
 | 
			
		||||
@ -644,7 +644,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.61  2004-01-28 20:30:18  peter
 | 
			
		||||
  Revision 1.62  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.61  2004/01/28 20:30:18  peter
 | 
			
		||||
    * record alignment splitted in fieldalignment and recordalignment,
 | 
			
		||||
      the latter is used when this record is inserted in another record.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -425,6 +425,7 @@ implementation
 | 
			
		||||
      spillworklist.done;
 | 
			
		||||
      coalescednodes.done;
 | 
			
		||||
      selectstack.done;
 | 
			
		||||
      live_registers.done;
 | 
			
		||||
      worklist_moves.free;
 | 
			
		||||
      dispose_reginfo;
 | 
			
		||||
    end;
 | 
			
		||||
@ -1562,7 +1563,7 @@ implementation
 | 
			
		||||
            p:=Tai(p.previous);
 | 
			
		||||
          end;
 | 
			
		||||
        live_registers.done;
 | 
			
		||||
        live_registers.copyfrom(back);
 | 
			
		||||
        live_registers:=back;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1862,7 +1863,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.115  2004-01-26 17:40:11  florian
 | 
			
		||||
  Revision 1.116  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.115  2004/01/26 17:40:11  florian
 | 
			
		||||
    * made DoSpill* overrideable
 | 
			
		||||
    + add_cpu_interferences added
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -119,22 +119,22 @@ implementation
 | 
			
		||||
           { Support also the ON and OFF as switch }
 | 
			
		||||
           hs:=current_scanner.readid;
 | 
			
		||||
           if (hs='ON') then
 | 
			
		||||
            aktalignment.recordalignmax:=4
 | 
			
		||||
            aktpackrecords:=4
 | 
			
		||||
           else
 | 
			
		||||
            if (hs='OFF') then
 | 
			
		||||
             aktalignment.recordalignmax:=1
 | 
			
		||||
             aktpackrecords:=1
 | 
			
		||||
           else
 | 
			
		||||
            Message(scan_w_only_pack_records);
 | 
			
		||||
         end
 | 
			
		||||
        else
 | 
			
		||||
         begin
 | 
			
		||||
           case current_scanner.readval of
 | 
			
		||||
             1 : aktalignment.recordalignmax:=1;
 | 
			
		||||
             2 : aktalignment.recordalignmax:=2;
 | 
			
		||||
             4 : aktalignment.recordalignmax:=4;
 | 
			
		||||
             8 : aktalignment.recordalignmax:=8;
 | 
			
		||||
            16 : aktalignment.recordalignmax:=16;
 | 
			
		||||
            32 : aktalignment.recordalignmax:=32;
 | 
			
		||||
             1 : aktpackrecords:=1;
 | 
			
		||||
             2 : aktpackrecords:=2;
 | 
			
		||||
             4 : aktpackrecords:=4;
 | 
			
		||||
             8 : aktpackrecords:=8;
 | 
			
		||||
            16 : aktpackrecords:=16;
 | 
			
		||||
            32 : aktpackrecords:=32;
 | 
			
		||||
           else
 | 
			
		||||
            Message(scan_w_only_pack_records);
 | 
			
		||||
           end;
 | 
			
		||||
@ -602,22 +602,22 @@ implementation
 | 
			
		||||
           hs:=current_scanner.readid;
 | 
			
		||||
           { C has the special recordalignmax of -1 }
 | 
			
		||||
           if (hs='C') then
 | 
			
		||||
            aktalignment.recordalignmax:=-1
 | 
			
		||||
            aktpackrecords:=-1
 | 
			
		||||
           else
 | 
			
		||||
            if (hs='NORMAL') or (hs='DEFAULT') then
 | 
			
		||||
             aktalignment.recordalignmax:=2
 | 
			
		||||
             aktpackrecords:=2
 | 
			
		||||
           else
 | 
			
		||||
            Message(scan_w_only_pack_records);
 | 
			
		||||
         end
 | 
			
		||||
        else
 | 
			
		||||
         begin
 | 
			
		||||
           case current_scanner.readval of
 | 
			
		||||
             1 : aktalignment.recordalignmax:=1;
 | 
			
		||||
             2 : aktalignment.recordalignmax:=2;
 | 
			
		||||
             4 : aktalignment.recordalignmax:=4;
 | 
			
		||||
             8 : aktalignment.recordalignmax:=8;
 | 
			
		||||
            16 : aktalignment.recordalignmax:=16;
 | 
			
		||||
            32 : aktalignment.recordalignmax:=32;
 | 
			
		||||
             1 : aktpackrecords:=1;
 | 
			
		||||
             2 : aktpackrecords:=2;
 | 
			
		||||
             4 : aktpackrecords:=4;
 | 
			
		||||
             8 : aktpackrecords:=8;
 | 
			
		||||
            16 : aktpackrecords:=16;
 | 
			
		||||
            32 : aktpackrecords:=32;
 | 
			
		||||
           else
 | 
			
		||||
            Message(scan_w_only_pack_records);
 | 
			
		||||
           end;
 | 
			
		||||
@ -992,7 +992,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.29  2003-12-25 01:07:09  florian
 | 
			
		||||
  Revision 1.30  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.29  2003/12/25 01:07:09  florian
 | 
			
		||||
    + $fputype directive support
 | 
			
		||||
    + single data type operations with sse unit
 | 
			
		||||
    * fixed more x86-64 stuff
 | 
			
		||||
 | 
			
		||||
@ -3044,12 +3044,6 @@ implementation
 | 
			
		||||
         deftype:=recorddef;
 | 
			
		||||
         symtable:=p;
 | 
			
		||||
         symtable.defowner:=self;
 | 
			
		||||
         { recordalign -1 means C record packing, that starts
 | 
			
		||||
           with an alignment of 1 }
 | 
			
		||||
         if aktalignment.recordalignmax=-1 then
 | 
			
		||||
           trecordsymtable(symtable).fieldalignment:=1
 | 
			
		||||
         else
 | 
			
		||||
           trecordsymtable(symtable).fieldalignment:=aktalignment.recordalignmax;
 | 
			
		||||
         isunion:=false;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
@ -3059,7 +3053,7 @@ implementation
 | 
			
		||||
         inherited ppuloaddef(ppufile);
 | 
			
		||||
         deftype:=recorddef;
 | 
			
		||||
         savesize:=ppufile.getlongint;
 | 
			
		||||
         symtable:=trecordsymtable.create;
 | 
			
		||||
         symtable:=trecordsymtable.create(0);
 | 
			
		||||
         trecordsymtable(symtable).datasize:=ppufile.getlongint;
 | 
			
		||||
         trecordsymtable(symtable).fieldalignment:=ppufile.getbyte;
 | 
			
		||||
         trecordsymtable(symtable).recordalignment:=ppufile.getbyte;
 | 
			
		||||
@ -4667,16 +4661,10 @@ implementation
 | 
			
		||||
        deftype:=objectdef;
 | 
			
		||||
        objectoptions:=[];
 | 
			
		||||
        childof:=nil;
 | 
			
		||||
        symtable:=tobjectsymtable.create(n);
 | 
			
		||||
        symtable:=tobjectsymtable.create(n,aktpackrecords);
 | 
			
		||||
        { create space for vmt !! }
 | 
			
		||||
        vmt_offset:=0;
 | 
			
		||||
        symtable.defowner:=self;
 | 
			
		||||
        { recordalign -1 means C record packing, that starts
 | 
			
		||||
          with an alignment of 1 }
 | 
			
		||||
        if aktalignment.recordalignmax=-1 then
 | 
			
		||||
         tobjectsymtable(symtable).fieldalignment:=1
 | 
			
		||||
        else
 | 
			
		||||
         tobjectsymtable(symtable).fieldalignment:=aktalignment.recordalignmax;
 | 
			
		||||
        lastvtableindex:=0;
 | 
			
		||||
        set_parent(c);
 | 
			
		||||
        objname:=stringdup(upper(n));
 | 
			
		||||
@ -4735,7 +4723,7 @@ implementation
 | 
			
		||||
         else
 | 
			
		||||
           implementedinterfaces:=nil;
 | 
			
		||||
 | 
			
		||||
         symtable:=tobjectsymtable.create(objrealname^);
 | 
			
		||||
         symtable:=tobjectsymtable.create(objrealname^,aktpackrecords);
 | 
			
		||||
         tobjectsymtable(symtable).datasize:=ppufile.getlongint;
 | 
			
		||||
         tobjectsymtable(symtable).fieldalignment:=ppufile.getbyte;
 | 
			
		||||
         tobjectsymtable(symtable).recordalignment:=ppufile.getbyte;
 | 
			
		||||
@ -6164,7 +6152,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.212  2004-01-28 21:05:56  florian
 | 
			
		||||
  Revision 1.213  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.212  2004/01/28 21:05:56  florian
 | 
			
		||||
    * fixed alignment of classes
 | 
			
		||||
 | 
			
		||||
  Revision 1.211  2004/01/28 20:30:18  peter
 | 
			
		||||
 | 
			
		||||
@ -93,9 +93,10 @@ interface
 | 
			
		||||
       tabstractrecordsymtable = class(tstoredsymtable)
 | 
			
		||||
       public
 | 
			
		||||
          datasize       : longint;
 | 
			
		||||
          usefieldalignment,     { alignment to use for fields (PACKRECORDS value), -1 is C style }
 | 
			
		||||
          recordalignment,       { alignment required when inserting this record }
 | 
			
		||||
          fieldalignment : byte; { alignment used when fields are inserted }
 | 
			
		||||
          constructor create(const n:string);
 | 
			
		||||
          fieldalignment : shortint; { alignment current alignment used when fields are inserted }
 | 
			
		||||
          constructor create(const n:string;usealign:shortint);
 | 
			
		||||
          procedure ppuload(ppufile:tcompilerppufile);override;
 | 
			
		||||
          procedure ppuwrite(ppufile:tcompilerppufile);override;
 | 
			
		||||
          procedure load_references(ppufile:tcompilerppufile;locals:boolean);override;
 | 
			
		||||
@ -105,13 +106,13 @@ interface
 | 
			
		||||
 | 
			
		||||
       trecordsymtable = class(tabstractrecordsymtable)
 | 
			
		||||
       public
 | 
			
		||||
          constructor create;
 | 
			
		||||
          constructor create(usealign:shortint);
 | 
			
		||||
          procedure insert_in(tsymt : trecordsymtable;offset : longint);
 | 
			
		||||
       end;
 | 
			
		||||
 | 
			
		||||
       tobjectsymtable = class(tabstractrecordsymtable)
 | 
			
		||||
       public
 | 
			
		||||
          constructor create(const n:string);
 | 
			
		||||
          constructor create(const n:string;usealign:shortint);
 | 
			
		||||
          procedure insert(sym : tsymentry);override;
 | 
			
		||||
       end;
 | 
			
		||||
 | 
			
		||||
@ -975,11 +976,18 @@ implementation
 | 
			
		||||
                          TAbstractRecordSymtable
 | 
			
		||||
****************************************************************************}
 | 
			
		||||
 | 
			
		||||
    constructor tabstractrecordsymtable.create(const n:string);
 | 
			
		||||
    constructor tabstractrecordsymtable.create(const n:string;usealign:shortint);
 | 
			
		||||
      begin
 | 
			
		||||
        inherited create(n);
 | 
			
		||||
        datasize:=0;
 | 
			
		||||
        fieldalignment:=1;
 | 
			
		||||
        recordalignment:=1;
 | 
			
		||||
        usefieldalignment:=usealign;
 | 
			
		||||
        { recordalign -1 means C record packing, that starts
 | 
			
		||||
          with an alignment of 1 }
 | 
			
		||||
        if usealign=-1 then
 | 
			
		||||
          fieldalignment:=1
 | 
			
		||||
        else
 | 
			
		||||
          fieldalignment:=usealign;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1057,7 +1065,7 @@ implementation
 | 
			
		||||
        vardef:=tvarsym(sym).vartype.def;
 | 
			
		||||
        varalign:=vardef.alignment;
 | 
			
		||||
        { Calc the alignment size for C style records }
 | 
			
		||||
        if (aktalignment.recordalignmax=-1) then
 | 
			
		||||
        if (usefieldalignment=-1) then
 | 
			
		||||
         begin
 | 
			
		||||
           if (varalign>4) and
 | 
			
		||||
              ((varalign mod 4)<>0) and
 | 
			
		||||
@ -1098,9 +1106,9 @@ implementation
 | 
			
		||||
                              TRecordSymtable
 | 
			
		||||
****************************************************************************}
 | 
			
		||||
 | 
			
		||||
    constructor trecordsymtable.create;
 | 
			
		||||
    constructor trecordsymtable.create(usealign:shortint);
 | 
			
		||||
      begin
 | 
			
		||||
        inherited create('');
 | 
			
		||||
        inherited create('',usealign);
 | 
			
		||||
        symtabletype:=recordsymtable;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
@ -1156,9 +1164,9 @@ implementation
 | 
			
		||||
                              TObjectSymtable
 | 
			
		||||
****************************************************************************}
 | 
			
		||||
 | 
			
		||||
    constructor tobjectsymtable.create(const n:string);
 | 
			
		||||
    constructor tobjectsymtable.create(const n:string;usealign:shortint);
 | 
			
		||||
      begin
 | 
			
		||||
        inherited create(n);
 | 
			
		||||
        inherited create(n,usealign);
 | 
			
		||||
        symtabletype:=objectsymtable;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
@ -2302,7 +2310,10 @@ implementation
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.127  2004-01-28 20:30:18  peter
 | 
			
		||||
  Revision 1.128  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.127  2004/01/28 20:30:18  peter
 | 
			
		||||
    * record alignment splitted in fieldalignment and recordalignment,
 | 
			
		||||
      the latter is used when this record is inserted in another record.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ unit i_linux;
 | 
			
		||||
                localalignmin   : 4;
 | 
			
		||||
                localalignmax   : 4;
 | 
			
		||||
                recordalignmin  : 0;
 | 
			
		||||
                recordalignmax  : 2;
 | 
			
		||||
                recordalignmax  : 4;
 | 
			
		||||
                maxCrecordalign : 4
 | 
			
		||||
              );
 | 
			
		||||
            first_parm_offset : 8;
 | 
			
		||||
@ -207,7 +207,7 @@ unit i_linux;
 | 
			
		||||
                localalignmin   : 4;
 | 
			
		||||
                localalignmax   : 4;
 | 
			
		||||
                recordalignmin  : 0;
 | 
			
		||||
                recordalignmax  : 2;
 | 
			
		||||
                recordalignmax  : 4;
 | 
			
		||||
                maxCrecordalign : 8
 | 
			
		||||
              );
 | 
			
		||||
            first_parm_offset : 8;
 | 
			
		||||
@ -514,7 +514,10 @@ initialization
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.22  2004-01-28 15:36:47  florian
 | 
			
		||||
  Revision 1.23  2004-01-28 22:16:31  peter
 | 
			
		||||
    * more record alignment fixes
 | 
			
		||||
 | 
			
		||||
  Revision 1.22  2004/01/28 15:36:47  florian
 | 
			
		||||
    * fixed another couple of arm bugs
 | 
			
		||||
 | 
			
		||||
  Revision 1.21  2004/01/26 19:05:56  florian
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user