Browse Source

AROS: Add stack aligned record fields for 32-bit and 64-bit compatibility

Final step that attempts to ensure that fields of particular records are
'STACKED' (stack aligned) properly for both 32 and 64 bit.

AROS introduced STACKED structure members, which are members that are padded
according to the current used stacksize which in itself is based on the target
CPU.

These structures are required to have a particular defined size in memory and
have a particular field alignment, therefor these records are always end-padded
(whether required or not) so that we are able to force the compiler to add
padding depending on the RECORDMIN setting.

Other available FPC directives and/or solutions seem currently not able to
solve that issue and we do not wish to manually check each structure to
determine if it requires end-padding or not (based on bitness) simply because
it is unmaintainable.

This change attempts to ensure that these record structures compile using the
correct memory size and field layout for both 32 and 64-bit CPU's.

The introduction of stack aligned record fields solves a lot of 64-bit related
crashes when working with native OOP such as MUI and BOOPSI.

Note: Not tested on big endian.
magorium 3 years ago
parent
commit
61304bf324
3 changed files with 624 additions and 156 deletions
  1. 56 14
      packages/arosunits/src/datatypes.pas
  2. 178 44
      packages/arosunits/src/intuition.pas
  3. 390 98
      packages/arosunits/src/mui.pas

+ 56 - 14
packages/arosunits/src/datatypes.pas

@@ -289,10 +289,13 @@ const
 
 type
   PDTMethod = ^TDTMethod;
-  TDTMethod = record
+  TDTMethod = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     dtm_Label: STRPTR;
     dtm_Command: STRPTR;
     dtm_Method: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 const
@@ -352,46 +355,61 @@ const
 type
   // DTM_REMOVEDTOBJECT, DTM_CLEARSELECTED, DTM_COPY, DTM_ABORTPRINT
   PdtGeneral = ^TdtGeneral;
-  TdtGeneral = record
+  TdtGeneral = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtg_GInfo: PGadgetInfo;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // DTM_SELECT
   PdtSelect = ^TdtSelect;
-  TdtSelect = record
+  TdtSelect = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dts_GInfo: PGadgetInfo;
     dts_Select: TRectangle;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // DTM_FRAMEBOX
   PdtFrameBox = ^TdtFrameBox;
-  TdtFrameBox = record
+  TdtFrameBox = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtf_GInfo: PGadgetInfo;
     dtf_ContentsInfo: PFrameInfo;
     dtf_FrameInfo: PFrameInfo;    // Input
     dtf_SizeFrameInfo: LongWord;  // Output
     dtf_FrameFlags: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // DTM_GOTO
   PdtGoto = ^TdtGoto;
-  TdtGoto = record
+  TdtGoto = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtg_GInfo: PGadgetInfo;
     dtg_NodeName: STRPTR;   // Node to goto
     dtg_AttrList: PTagItem; // Additional attributes
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // DTM_TRIGGER
   PdtTrigger = ^TdtTrigger;
-  TdtTrigger = record
+  TdtTrigger = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtt_GInfo: PGadgetInfo;
     dtt_Function: LongWord;
     dtt_Data: APTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 const
@@ -436,7 +454,8 @@ const
 type
   // DTM_DRAW
   PdtDraw = ^TdtDraw;
-  TdtDraw = record
+  TdtDraw = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtd_RPort: PRastPort;
     dtd_Left: LongInt;
@@ -446,23 +465,31 @@ type
     dtd_TopHoriz: LongInt;
     dtd_TopVert: LongInt;
     dtd_AttrList: PTagItem; // Additional attributes
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // DTM_RELEASERAWINFO
   PdtReleaseDrawInfo = ^TdtReleaseDrawInfo;
-  TdtReleaseDrawInfo = record
+  TdtReleaseDrawInfo = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtr_Handle: APTR; // Handle as returned by DTM_OBTAINDRAWINFO
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // DTM_WRITE
   PdtWrite = ^TdtWrite;
-  TdtWrite = record
+  TdtWrite = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     dtw_GInfo: PGadgetInfo; // Gadget information
     dtw_FileHandle: BPTR;   // File handle to write to
     dtw_Mode: LongWord;
     dtw_AttrList: PTagItem; // Additional attributes
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 const
@@ -588,7 +615,8 @@ const
 
 type
   PpdtBlitPixelArray = ^TpdtBlitPixelArray;
-  TpdtBlitPixelArray = record
+  TpdtBlitPixelArray = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     pbpa_PixelData: APTR;
     pbpa_PixelFormat: LongWord;
@@ -597,14 +625,19 @@ type
     pbpa_Top: LongWord;
     pbpa_Width: LongWord;
     pbpa_Height: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PpdtScale = ^TpdtScale;
-  TpdtScale = record
+  TpdtScale = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     ps_NewWidth: LongWord;
     ps_NewHeight: LongWord;
     ps_Flags: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 const
@@ -809,7 +842,8 @@ const
 
 type
   PadtFrame = ^TadtFrame;
-  TadtFrame = record
+  TadtFrame = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     alf_TimeStamp: LongWord;
     alf_Frame: LongWord;
@@ -820,10 +854,13 @@ type
     alf_SampleLength: LongWord;
     alf_Period: LongWord;
     alf_UserData: APTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PadtNewFormatFrame = ^TadtNewFormatFrame;
-  TadtNewFormatFrame = record
+  TadtNewFormatFrame = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     alf_TimeStamp: LongWord;
     alf_Frame: LongWord;
@@ -838,12 +875,17 @@ type
     alf_LeftSample: PShortInt;
     alf_RightSample: PShortInt;
     alf_SamplesPerSec: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PadtStart = ^tadtStart;
-  TadtStart = record
+  TadtStart = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     asa_Frame: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 function SDTM_ISSTEREO(SampleType: LongWord): Boolean; inline;

+ 178 - 44
packages/arosunits/src/intuition.pas

@@ -1732,8 +1732,11 @@ type
   for the various message types.  The meaningful parameter
   packet structure definitions are defined below.}
   PMsg = ^TMsg;
-  TMsg = record
+  TMsg = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 { Class id strings for Intuition classes.
@@ -1783,44 +1786,59 @@ const
 type
   // OM_NEW and OM_SET
   PopSet = ^TopSet;
-  TopSet = record
+  TopSet = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     ops_AttrList: PTagItem; // new attributes
     ops_GInfo: PGadgetInfo; // always there for gadgets, when SetGadgetAttrs() is used, but will be nil for OM_NEW
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // OM_GET
   PopGet = ^TopGet;
-  TopGet = record
+  TopGet = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID,
     opg_AttrID: LongWord;
     opg_Storage: Pointer;   // may be other types, but 'int' types are all LongWord
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // OM_ADDTAIL
 
   PopAddTail = ^TopAddTail;
-  TopAddTail = record
+  TopAddTail = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     opat_List: PList;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // OM_ADDMEMBER, OM_REMMEMBER
   PopMember = ^TopMember;
-  TopMember = record
+  TopMember = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     opam_Object: PObject_;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
   TopAddMember = TopMember;
   PopAddMember = ^TopAddMember;
 
   // OM_NOTIFY, and OM_UPDATE
   PopUpdate = ^TopUpdate;
-  TopUpdate = record
+  TopUpdate = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     opu_AttrList: PTagItem; // new attributes
     opu_GInfo: PGadgetInfo; // non-nil when SetGadgetAttrs OR notification resulting from gadget input occurs.
     opu_Flags: LongWord;    // defined below (OPUF_*)
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 { this flag means that the update message is being issued from
@@ -2052,13 +2070,17 @@ type
    GMR_GADGETHIT (see below), if you were hit and 0 otherwise. Note that you
    have to test, if you were hit, no matter if you are disabled or not.}
   PgpHitTest = ^TgpHitTest;
-  TgpHitTest = record
+  TgpHitTest = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;         // GM_HITEST or GM_HELPTEST
     gpht_GInfo: PGadgetInfo;
     gpht_Mouse: record         // These values are relative to the gadget select box for GM_HITTEST. For
       x: SmallInt;             // GM_HELPTEST they are relative to the bounding box (which is often
       y: SmallInt;             // equal to the select box).
+      pad_align: record end;   // properly pad previous field if applicable
     end;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
   GMR_GADGETHIT = $00000004; // GM_HITTEST hit
@@ -2069,11 +2091,14 @@ const
 type
   // GM_RENDER   This method is invoked to draw the gadget into a rastport.
   PgpRender = ^TgpRender;
-  TgpRender = record
+  TgpRender = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;        // GM_RENDER
     gpr_GInfo: PGadgetInfo;   // gadget context
     gpr_RPort: PRastPort;     // all ready for use
     gpr_Redraw: LongInt;      // might be a "highlight pass" (GREDRAW_*)
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
   // gpr_Redraw. Not all of these values make sense for all gadgets.
@@ -2089,7 +2114,8 @@ type
    GM_GOACTIVE and GM_HANDLEINPUT both use the same structure and return the
    same values, as defined below.}
   PgpInput = ^TgpInput;
-  TgpInput = record
+  TgpInput = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;        // GM_GOACTIVE or GM_HANDLEINPUT
     gpi_GInfo: PGadgetInfo;   //  gadget context
     gpi_IEvent: PInputEvent;  // Pointer to the InputEvent that caused the method to be invoked.
@@ -2099,10 +2125,13 @@ type
     gpi_Mouse: record         // This struct defines the current mouse position, relative to the gadgets' bounding box.
       x: SmallInt;
       y: SmallInt;
+      pad_align: record end;  // properly pad previous field if applicable
     end;
     gpi_TabletData: PTabletData; { Pointer to TabletData structure or nil,
          if this input event did not originate from a tablet that is capable of
          sending IESUBCLASS_NEWTABLET events.}
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
   // GM_HANDLEINPUT and GM_GOACTIVE  return code flags. These are actually flags and may be or'ed.
@@ -2119,12 +2148,15 @@ const
 type
   // GM_GOINACTIVE see GM_GOACTIVE for explanation
   PgpGoInactive = ^TgpGoInactive;
-  TgpGoInactive = record
+  TgpGoInactive = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;         // GM_GOINACTIVE
     gpgi_GInfo: PGadgetInfo;
     gpgi_Abort: LongWord; { Boolean field to indicate, who wanted the gadget to go inactive. If
          this is 1 this method was sent, because intution wants the gadget to
          go inactive, if it is 0, it was the gadget itself that wanted it.}
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 type
@@ -2134,25 +2166,31 @@ type
     a window. In this method you should re-evaluate the size of yourself. You
     are not allowed to do any rendering operation during this method!}
   PgpLayout = ^TgpLayout;
-  TgpLayout = record
+  TgpLayout = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;       // GM_LAYOUT
     gpl_GInfo: PGadgetInfo;
     gpl_Initial: LongWord; {Boolean that indicated, if this method was invoked, when you are added
          to a window (True) or if it is called, because the window was resized
          (False).}
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // GM_DOMAIN
   { This method is invoked to learn about the sizing requirements of your class,
    before an object is created. This is AROS specific.}
   PgpDomain = ^TgpDomain;
-  TgpDomain = record
+  TgpDomain = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;       // GM_DOMAIN
     gpd_GInfo: PGadgetInfo;
     gpd_RPort: PRastPort;    // RastPort to calculate dimensions for.
     gpd_Which: LONG;         // what to calculate (GDOMAIN_*)
     gpd_Domain: TIBox;       // Resulting domain
     gpd_Attrs: PTagItem;     // Additional attributes. None defines yet
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
   // gpd_Which
@@ -2275,12 +2313,15 @@ const
 type
   // IM_FRAMEBOX
   PimpFrameBox = ^TimpFrameBox;
-  TimpFrameBox = record
+  TimpFrameBox = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     imp_ContentsBox: PIBox;   // input: relative box of contents
     imp_FrameBox: PIBox;      // output: rel. box of encl frame
     imp_DrInfo: PDrawInfo;    // may be nil
     imp_FrameFlags: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 const
@@ -2288,43 +2329,58 @@ const
 
 type
   PimpPos = ^TimpPos;
-  TimpPos = record
+  TimpPos = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     X: SmallInt;
     Y: SmallInt;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PimpSize = ^TimpSize;
-  TimpSize = record
+  TimpSize = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     Width: SmallInt;
     Height: SmallInt;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // IM_DRAW, IM_DRAWFRAME
   PimpDraw = ^TimpDraw;
-  TimpDraw = record
+  TimpDraw = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     imp_RPort: PRastPort;
     imp_Offset: TimpPos;
     imp_State: LongWord;
     imp_DrInfo: PDrawInfo;    // May be nil
     imp_Dimensions: TimpSize; // Only valid for IM_DRAWFRAME
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // IM_ERASE, IM_ERASEFRAME NOTE: This is a subset of TimpDraw
   PimpErase = ^TimpErase;
-  TimpErase = record
+  TimpErase = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     imp_RPort: PRastPort;
     imp_Offset: TimpPos;
     imp_Dimensions: TimpSize; // // Only valid for IM_DRAWFRAME
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   // IM_HITTEST, IM_HITFRAME
   PimpHitTest = ^TimpHitTest;
-  TimpHitTest = record
+  TimpHitTest = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     imp_Point: TimpPos;
     imp_Dimensions: TimpSize; // only valid for IM_HITFRAME
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 // 'boopsi' pointer class interface
@@ -2559,7 +2615,8 @@ const
 
 type
   PmdpGetDefSizeSysImage = ^TmdpGetDefSizeSysImage;
-  TmdpGetDefSizeSysImage = record
+  TmdpGetDefSizeSysImage = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     mdp_TrueColor: ShortInt;
     mdp_Dri: PDrawInfo;
@@ -2569,10 +2626,13 @@ type
     mdp_Width: PLongWord;         // Out
     mdp_Height: PLongWord;        // Out
     mdp_Flags: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmdpDrawSysImage = ^TmdpDrawSysImage;
-  TmdpDrawSysImage = record
+  TmdpDrawSysImage = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     mdp_TrueColor: ShortInt;
     mdp_Dri: PDrawInfo;
@@ -2585,10 +2645,13 @@ type
     mdp_State: LongWord;
     mdp_Flags: LongWord;
     mdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmdpGetMenuSpaces = ^TmdpGetMenuSpaces;
-  TmdpGetMenuSpaces = record
+  TmdpGetMenuSpaces = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     mdp_TrueColor: ShortInt;
     mdp_InnerLeft: LongInt;      // Out
@@ -2601,10 +2664,13 @@ type
     mdp_ItemInnerBottom: LongInt;
     mdp_MinWidth: LongInt;
     mdp_MinHeight: LongInt;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmdpDrawBackground = ^TmdpDrawBackground;
-  TmdpDrawBackground = record
+  TmdpDrawBackground = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     mdp_TrueColor: ShortInt;
     mdp_RPort: PRastPort;
@@ -2619,10 +2685,13 @@ type
     mdp_Flags: Word;
     mdp_UserBuffer: IPTR;
     mdp_MenuDecorFlags: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmdpInitMenu = ^TmdpInitMenu;
-  TmdpInitMenu = record
+  TmdpInitMenu = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     mdp_TrueColor: SmallInt;
     mdp_RPort: PRastPort;
@@ -2634,13 +2703,18 @@ type
     mdp_UserBuffer: IPTR;
     mdp_ScreenUserBuffer: IPTR;
     mdp_MenuDecorFlags: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmdpExitMenu = ^TmdpExitMenu;
-  TmdpExitMenu = record
+  TmdpExitMenu = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     mdp_TrueColor: ShortInt;
     mdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
 const
@@ -2700,17 +2774,23 @@ const
 
 type
   PmsGetRootBitMap = ^TmsGetRootBitMap;
-  TmsGetRootBitMap = record
+  TmsGetRootBitMap = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     PixelFormat: LongWord;
     Store: ^PBitMap;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmsQuery3DSupport = ^TmsQuery3DSupport;
-  TmsQuery3DSupport = record
+  TmsQuery3DSupport = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     PixelFormat: LongWord;
     Store: PLongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
   MSQUERY3D_UNKNOWN  = 0; // Unsupported pixelformat or other error
@@ -2719,26 +2799,35 @@ const
   MSQUERY3D_HWDRIVER = 3; // Hardware accelerated 3D available
 type
   PmsGetDefaultGammaTables = ^TmsGetDefaultGammaTables;
-  TmsGetDefaultGammaTables = record
+  TmsGetDefaultGammaTables = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     Red: PByte;         // Optional pointers to 256-byte arrays to fill in
     Green: PByte;
     Blue: PByte;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmsGetDefaultPixelFormat = ^TmsGetDefaultPixelFormat;
-  TmsGetDefaultPixelFormat = record
+  TmsGetDefaultPixelFormat = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     Depth: LongWord;
     Store: PLongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmsGetPointerBounds = ^TmsGetPointerBounds;
-  TmsGetPointerBounds = record
+  TmsGetPointerBounds = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     PointerType: LongWord;
     Width: PLongWord;
     Height: PLongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PmsSetDefaultGammaTables = PmsGetDefaultGammaTables;
@@ -2762,7 +2851,8 @@ const
   SDM_EXITSCREEN           = SDM_Dummy + 8;
 type
   PsdpGetDefSizeSysImage = ^TsdpGetDefSizeSysImage;
-  TsdpGetDefSizeSysImage = record
+  TsdpGetDefSizeSysImage = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     sdp_TrueColor: ShortInt;
     sdp_Dri: PDrawInfo;
@@ -2773,10 +2863,13 @@ type
     sdp_Height: PLongWord;        // Out
     sdp_Flags: LongWord;
     sdp_UserBuffer: LongWord;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PsdpDrawSysImage = ^TsdpDrawSysImage;
-  TsdpDrawSysImage = record
+  TsdpDrawSysImage = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     sdp_TrueColor: ShortInt;
     sdp_Dri: PDrawInfo;
@@ -2789,10 +2882,13 @@ type
     sdp_State: LongWord;
     sdp_Flags: LongWord;
     sdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PsdpDrawScreenBar = ^TsdpDrawScreenBar;
-  TsdpDrawScreenBar = record
+  TsdpDrawScreenBar = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     sdp_TrueColor: ShortInt;
     sdp_Dri: PDrawInfo;
@@ -2801,10 +2897,13 @@ type
     sdp_Screen: PScreen;
     sdp_Flags: LongWord;
     sdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PsdpLayoutScreenGadgets = ^TsdpLayoutScreenGadgets;
-  TsdpLayoutScreenGadgets = record
+  TsdpLayoutScreenGadgets = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     sdp_TrueColor: ShortInt;
     sdp_Dri: PDrawInfo;
@@ -2812,10 +2911,13 @@ type
     sdp_Gadgets: PGadget;
     sdp_Flags: LongWord;
     sdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PsdpInitScreen = ^TsdpInitScreen;
-  TsdpInitScreen = record
+  TsdpInitScreen = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     sdp_TrueColor: ShortInt;
     sdp_Dri: PDrawInfo;
@@ -2832,13 +2934,18 @@ type
     sdp_WBorRight: ShortInt;
     sdp_WBorBottom: ShortInt;
     sdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PsdpExitScreen = ^TsdpExitScreen;
-  TsdpExitScreen = record
+  TsdpExitScreen = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     sdp_TrueColor: ShortInt;
     sdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
 // ScrDecor LayoutScreenGadgets Flags
@@ -2870,7 +2977,8 @@ const
 
 type
   PwdpGetDefSizeSysImage = ^TwdpGetDefSizeSysImage;
-  TwdpGetDefSizeSysImage = record
+  TwdpGetDefSizeSysImage = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Dri: PDrawInfo;
@@ -2881,10 +2989,13 @@ type
     wdp_Height: PLongWord;        // Out
     wdp_Flags: LongWord;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpDrawSysImage = ^TwdpDrawSysImage;
-  TwdpDrawSysImage = record
+  TwdpDrawSysImage = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Dri: PDrawInfo;
@@ -2897,10 +3008,13 @@ type
     wdp_State: LongWord;
     wdp_Flags: LongWord;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpDrawWinBorder = ^TwdpDrawWinBorder;
-  TwdpDrawWinBorder = record
+  TwdpDrawWinBorder = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Dri: PDrawInfo;
@@ -2908,10 +3022,13 @@ type
     wdp_RPort: PRastPort;
     wdp_Flags: LongWord;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpLayoutBorderGadgets = ^TwdpLayoutBorderGadgets;
-  TwdpLayoutBorderGadgets = record
+  TwdpLayoutBorderGadgets = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Dri: PDrawInfo;
@@ -2920,10 +3037,13 @@ type
     wdp_Flags: LongWord;
     wdp_ExtraButtons: LongWord;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpDrawBorderPropBack = ^TwdpDrawBorderPropBack;
-  TwdpDrawBorderPropBack = record
+  TwdpDrawBorderPropBack = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Dri: PDrawInfo;
@@ -2935,10 +3055,13 @@ type
     wdp_KnobRect: Prectangle;
     wdp_Flags: LongWord;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpDrawBorderPropKnob = ^TwdpDrawBorderPropKnob;
-  TwdpDrawBorderPropKnob = record
+  TwdpDrawBorderPropKnob = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Dri: PDrawInfo;
@@ -2949,32 +3072,43 @@ type
     wdp_PropRect: PRectangle;
     wdp_Flags: LongWord;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpInitWindow = ^TwdpInitWindow;
-  TwdpInitWindow = record
+  TwdpInitWindow = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_UserBuffer: IPTR;
     wdp_Screen: PScreen;
     wdp_ScreenUserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpExitWindow = ^TwdpExitWindow;
-  TwdpExitWindow = record
+  TwdpExitWindow = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 
   PwdpWindowShape = ^TwdpWindowShape;
-  TwdpWindowShape = record
+  TwdpWindowShape = record  // record with stacked fields
+    {$PUSH}{$IF DEFINED(CPU32)}{$CODEALIGN RECORDMIN=4}{$ELSEIF DEFINED(CPU64)}{$CODEALIGN RECORDMIN=8}{$ENDIF}
     MethodID: LongWord;
     wdp_TrueColor: ShortInt;
     wdp_Window: PWindow;
     wdp_Width: LongInt;
     wdp_Height: LongInt;
     wdp_UserBuffer: IPTR;
+    pad_align: record end; // properly pad previous field if applicable
+    {$POP}
   end;
 const
 // WinDecor DrawWindowBorder Flags

File diff suppressed because it is too large
+ 390 - 98
packages/arosunits/src/mui.pas


Some files were not shown because too many files changed in this diff