mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-30 15:20:35 +02:00
* LLVM/AArch64: don't perform the parameter location extension workarounds
for LLVM, as that results in LLVM assuming exactly the opposite of what's intended (namely that the extended locations contain valid rather than invalid bits) git-svn-id: trunk@43886 -
This commit is contained in:
parent
31ef82b9c6
commit
3abdec9c95
@ -292,6 +292,7 @@ unit cpupara;
|
||||
if not assigned(result.location) or
|
||||
not(result.location^.loc in [LOC_REGISTER,LOC_MMREGISTER,LOC_VOID]) then
|
||||
internalerror(2014113001);
|
||||
{$ifndef llvm}
|
||||
{
|
||||
According to ARM64 ABI: "If the size of the argument is less than 8 bytes then
|
||||
the size of the argument is set to 8 bytes. The effect is as if the argument
|
||||
@ -310,6 +311,7 @@ unit cpupara;
|
||||
result.location^.size:=OS_64;
|
||||
result.location^.def:=u64inttype;
|
||||
end;
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
|
||||
@ -486,48 +488,45 @@ unit cpupara;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{$ifndef llvm}
|
||||
paraloc^.size:=locsize;
|
||||
paraloc^.def:=locdef;
|
||||
{$else llvm}
|
||||
case locsize of
|
||||
OS_8,OS_16,OS_32:
|
||||
begin
|
||||
paraloc^.size:=OS_64;
|
||||
paraloc^.def:=u64inttype;
|
||||
end;
|
||||
OS_S8,OS_S16,OS_S32:
|
||||
begin
|
||||
paraloc^.size:=OS_S64;
|
||||
paraloc^.def:=s64inttype;
|
||||
end;
|
||||
OS_F32:
|
||||
begin
|
||||
paraloc^.size:=OS_F32;
|
||||
paraloc^.def:=s32floattype;
|
||||
end;
|
||||
OS_F64:
|
||||
begin
|
||||
paraloc^.size:=OS_F64;
|
||||
paraloc^.def:=s64floattype;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
if is_record(locdef) or
|
||||
is_set(locdef) or
|
||||
((locdef.typ=arraydef) and
|
||||
not is_special_array(locdef)) then
|
||||
{$ifdef llvm}
|
||||
if not is_ordinal(paradef) then
|
||||
begin
|
||||
case locsize of
|
||||
OS_8,OS_16,OS_32:
|
||||
begin
|
||||
paraloc^.size:=OS_64;
|
||||
paraloc^.def:=u64inttype;
|
||||
end
|
||||
end;
|
||||
OS_S8,OS_S16,OS_S32:
|
||||
begin
|
||||
paraloc^.size:=OS_S64;
|
||||
paraloc^.def:=s64inttype;
|
||||
end;
|
||||
OS_F32:
|
||||
begin
|
||||
paraloc^.size:=OS_F32;
|
||||
paraloc^.def:=s32floattype;
|
||||
end;
|
||||
OS_F64:
|
||||
begin
|
||||
paraloc^.size:=OS_F64;
|
||||
paraloc^.def:=s64floattype;
|
||||
end;
|
||||
else
|
||||
begin
|
||||
paraloc^.size:=locsize;
|
||||
paraloc^.def:=locdef;
|
||||
if is_record(locdef) or
|
||||
is_set(locdef) or
|
||||
((locdef.typ=arraydef) and
|
||||
not is_special_array(locdef)) then
|
||||
begin
|
||||
paraloc^.size:=OS_64;
|
||||
paraloc^.def:=u64inttype;
|
||||
end
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$endif llvm}
|
||||
end;
|
||||
|
||||
@ -560,6 +559,7 @@ unit cpupara;
|
||||
paraloc^.def:=u32inttype;
|
||||
end;
|
||||
end
|
||||
{$ifndef llvm}
|
||||
else
|
||||
begin
|
||||
if side=calleeside then
|
||||
@ -568,6 +568,7 @@ unit cpupara;
|
||||
paraloc^.def:=u32inttype;
|
||||
end;
|
||||
end;
|
||||
{$endif llvm}
|
||||
end;
|
||||
|
||||
{ in case it's a composite, "The argument is passed as though
|
||||
|
Loading…
Reference in New Issue
Block a user