mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 11:09:13 +02:00
llvm: use formaldef rather than undefineddef for llvm_metadata
Better matches the intent, and fixes compilation issues on AArch64
This commit is contained in:
parent
25999ad8ff
commit
3a34fc7be3
@ -538,9 +538,12 @@ implementation
|
|||||||
end;
|
end;
|
||||||
formaldef :
|
formaldef :
|
||||||
begin
|
begin
|
||||||
{ var/const/out x (always treated as "pass by reference" -> don't
|
if def<>llvm_metadatatype then
|
||||||
add extra "*" here) }
|
{ var/const/out x (always treated as "pass by reference" -> don't
|
||||||
encodedstr:=encodedstr+'i8';
|
add extra "*" here) }
|
||||||
|
encodedstr:=encodedstr+'i8'
|
||||||
|
else
|
||||||
|
encodedstr:=encodedstr+'metadata'
|
||||||
end;
|
end;
|
||||||
arraydef :
|
arraydef :
|
||||||
begin
|
begin
|
||||||
@ -674,10 +677,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
undefineddef:
|
undefineddef:
|
||||||
begin
|
begin
|
||||||
if def=llvm_metadatatype then
|
internalerror(2022052301);
|
||||||
encodedstr:=encodedstr+'metadata'
|
|
||||||
else
|
|
||||||
internalerror(2022052301);
|
|
||||||
end;
|
end;
|
||||||
errordef :
|
errordef :
|
||||||
internalerror(2013100604);
|
internalerror(2013100604);
|
||||||
|
@ -45,6 +45,7 @@ unit llvmpara;
|
|||||||
architecture-specific code, or whether we will have to integrate parts
|
architecture-specific code, or whether we will have to integrate parts
|
||||||
into the various tcpuparamanager classes }
|
into the various tcpuparamanager classes }
|
||||||
tllvmparamanager = class(tcpuparamanager)
|
tllvmparamanager = class(tcpuparamanager)
|
||||||
|
function push_addr_param(varspez: tvarspez; def: tdef; calloption: tproccalloption): boolean; override;
|
||||||
procedure getcgtempparaloc(list: TAsmList; pd: tabstractprocdef; nr: longint; var cgpara: tcgpara); override;
|
procedure getcgtempparaloc(list: TAsmList; pd: tabstractprocdef; nr: longint; var cgpara: tcgpara); override;
|
||||||
function param_use_paraloc(const cgpara: tcgpara): boolean; override;
|
function param_use_paraloc(const cgpara: tcgpara): boolean; override;
|
||||||
procedure createtempparaloc(list: TAsmList; calloption: tproccalloption; parasym: tparavarsym; can_use_final_stack_loc: boolean; var cgpara: TCGPara); override;
|
procedure createtempparaloc(list: TAsmList; calloption: tproccalloption; parasym: tparavarsym; can_use_final_stack_loc: boolean; var cgpara: TCGPara); override;
|
||||||
@ -72,6 +73,17 @@ unit llvmpara;
|
|||||||
|
|
||||||
{ tllvmparamanager }
|
{ tllvmparamanager }
|
||||||
|
|
||||||
|
function tllvmparamanager.push_addr_param(varspez: tvarspez; def: tdef; calloption: tproccalloption): boolean;
|
||||||
|
begin
|
||||||
|
if def<>llvm_metadatatype then
|
||||||
|
begin
|
||||||
|
result:=inherited;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
result:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tllvmparamanager.getcgtempparaloc(list: TAsmList; pd: tabstractprocdef; nr: longint; var cgpara: tcgpara);
|
procedure tllvmparamanager.getcgtempparaloc(list: TAsmList; pd: tabstractprocdef; nr: longint; var cgpara: tcgpara);
|
||||||
begin
|
begin
|
||||||
if (nr<1) or (nr>pd.paras.count) then
|
if (nr<1) or (nr>pd.paras.count) then
|
||||||
|
@ -32,6 +32,7 @@ interface
|
|||||||
|
|
||||||
type
|
type
|
||||||
tllvmcallparanode = class(tcgcallparanode)
|
tllvmcallparanode = class(tcgcallparanode)
|
||||||
|
procedure push_formal_para; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
tllvmcallnode = class(tcgcallnode)
|
tllvmcallnode = class(tcgcallnode)
|
||||||
@ -50,6 +51,16 @@ implementation
|
|||||||
aasmbase,aasmdata,aasmllvm,
|
aasmbase,aasmdata,aasmllvm,
|
||||||
symconst,symdef;
|
symconst,symdef;
|
||||||
|
|
||||||
|
procedure tllvmcallparanode.push_formal_para;
|
||||||
|
begin
|
||||||
|
if parasym.vardef<>llvm_metadatatype then
|
||||||
|
begin;
|
||||||
|
inherited;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
push_value_para;
|
||||||
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
TLLVMCALLNODE
|
TLLVMCALLNODE
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
@ -131,6 +142,7 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
ccallparanode:=tllvmcallparanode;
|
||||||
ccallnode:=tllvmcallnode;
|
ccallnode:=tllvmcallnode;
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -589,7 +589,7 @@ implementation
|
|||||||
addtype('$qwordbool',bool64type);
|
addtype('$qwordbool',bool64type);
|
||||||
{$ifdef llvm}
|
{$ifdef llvm}
|
||||||
addtype('$llvmbool1',llvmbool1type);
|
addtype('$llvmbool1',llvmbool1type);
|
||||||
llvm_metadatatype:=cundefineddef.create(true);
|
llvm_metadatatype:=cformaldef.create(false);
|
||||||
{ if this gets renamed, also adjust agllvm so it still writes the identifier of this type as "metadata" }
|
{ if this gets renamed, also adjust agllvm so it still writes the identifier of this type as "metadata" }
|
||||||
addtype('$metadata',llvm_metadatatype);
|
addtype('$metadata',llvm_metadatatype);
|
||||||
addtype('LLVMMetadata',llvm_metadatatype);
|
addtype('LLVMMetadata',llvm_metadatatype);
|
||||||
|
Loading…
Reference in New Issue
Block a user