* support forcing to write the parameter alignment for parameters for LLVM,

even when it's the same as the stack alignment (it can also refer to the
    alignment of the data pointed to by pointer parameters)

git-svn-id: branches/debug_eh@41729 -
This commit is contained in:
Jonas Maebe 2019-03-17 15:28:27 +00:00
parent 3b254affb7
commit fcde89cb26
4 changed files with 9 additions and 6 deletions

View File

@ -204,7 +204,7 @@ interface
pllvmcallpara = ^tllvmcallpara;
tllvmcallpara = record
def: tdef;
alignment: byte;
alignment: shortint;
valueext: tllvmvalueextension;
byval,
sret: boolean;

View File

@ -339,10 +339,13 @@ implementation
owner.writer.AsmWrite(' byval');
if para^.sret then
owner.writer.AsmWrite(' sret');
if para^.alignment<>std_param_align then
{ For byval, this means "alignment on the stack" and of the passed source data.
For other pointer parameters, this means "alignment of the passed source data" }
if (para^.alignment<>std_param_align) or
(para^.alignment<0) then
begin
owner.writer.AsmWrite(' align ');
owner.writer.AsmWrite(tostr(para^.alignment));
owner.writer.AsmWrite(tostr(abs(para^.alignment)));
end;
case para^.typ of
top_reg:

View File

@ -1197,8 +1197,8 @@ implementation
if indivalign then
begin
paramanager.getintparaloc(list,pd,4,volatilepara);
destpara.Alignment:=dest.alignment;
sourcepara.Alignment:=source.alignment;
destpara.Alignment:=-dest.alignment;
sourcepara.Alignment:=-source.alignment;
end
else
begin

View File

@ -106,7 +106,7 @@ unit parabase;
Location : PCGParalocation;
IntSize : tcgint; { size of the total location in bytes }
DefDeref : tderef;
Alignment : ShortInt;
Alignment : ShortInt; { in case of LLVM, a negative alignment mean: force write the alignment }
Size : TCGSize; { Size of the parameter included in all locations }
Temporary : boolean; { created on the fly, no permanent references exist to this somewhere that will cause it to be disposed }
constructor init;