mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-10 09:42:49 +02:00
188 lines
5.0 KiB
ObjectPascal
188 lines
5.0 KiB
ObjectPascal
{
|
|
Copyright (c) 2019 by Jonas Maebe,
|
|
member of the Free Pascal Compiler development team
|
|
|
|
Support for LLVM metadata
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
****************************************************************************
|
|
}
|
|
unit aasmllvmmetadata;
|
|
|
|
{$i fpcdefs.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
aasmtai, aasmcnst,
|
|
symtype;
|
|
|
|
type
|
|
tspecialisedmetadatanodekind = (
|
|
smeta_DIFile,
|
|
smeta_DIBasicType,
|
|
smeta_DISubroutineType,
|
|
smeta_DIDerivedType,
|
|
smeta_DICompositeType,
|
|
smeta_DISubrange,
|
|
smeta_DIEnumerator,
|
|
smeta_DITemplateTypeParameter,
|
|
smeta_DITemplateValueParameter,
|
|
smeta_DINamespace,
|
|
smeta_DIGlobalVariable,
|
|
smeta_DISubprogram,
|
|
smeta_DILexicalBlock,
|
|
smeta_DILexicalBlockFile,
|
|
smeta_DILocation,
|
|
smeta_DILocalVariable,
|
|
smeta_DIExpression,
|
|
smeta_DIObjCProperty,
|
|
smeta_DIImportedEntity,
|
|
smeta_DIMacro,
|
|
smeta_DIMacroFile
|
|
);
|
|
|
|
tai_llvmbasemetadatanode = class abstract(tai_aggregatetypedconst)
|
|
strict protected
|
|
function getname: ansistring; virtual; abstract;
|
|
public
|
|
procedure addvalue(val: tai_abstracttypedconst); override;
|
|
property name: ansistring read getname;
|
|
constructor create; reintroduce;
|
|
end;
|
|
|
|
(* !0 = !{ type1 value1, ... } *)
|
|
tai_llvmunnamedmetadatanode = class(tai_llvmbasemetadatanode)
|
|
strict private class var
|
|
snextid: cardinal;
|
|
class function getnextid: cardinal;
|
|
strict protected
|
|
fnameval: cardinal;
|
|
public
|
|
constructor create; reintroduce;
|
|
function getname: ansistring; override;
|
|
end;
|
|
|
|
(* !name = !{ type1 value1, ... } *)
|
|
tai_llvmnamedmetadatanode = class(tai_llvmbasemetadatanode)
|
|
strict protected
|
|
fname: ansistring;
|
|
function getname: ansistring; override;
|
|
public
|
|
constructor create(const aName: ansistring);
|
|
end;
|
|
|
|
tai_llvmmetadatareftypedconst = class(tai_simple)
|
|
strict private
|
|
fval: tai_llvmbasemetadatanode;
|
|
public
|
|
constructor create(_val: tai_llvmbasemetadatanode);
|
|
property val: tai_llvmbasemetadatanode read fval;
|
|
end;
|
|
|
|
{ @g1 = global i32 0, *!id !value.name* }
|
|
tai_llvmmetadatareferenceoperand = class(tai_simple)
|
|
strict private
|
|
fid: ansistring;
|
|
fvalue: tai_llvmbasemetadatanode;
|
|
public
|
|
constructor create(const anID: ansistring; aValue: tai_llvmbasemetadatanode);
|
|
property id: ansistring read fid;
|
|
property value: tai_llvmbasemetadatanode read fvalue;
|
|
end;
|
|
|
|
{ !name = !kindname(field1: value1, ...) }
|
|
tai_llvmspecialisedmetadatanode = class(tai_llvmunnamedmetadatanode)
|
|
{ identifies name and fieldnames }
|
|
kind: tspecialisedmetadatanodekind;
|
|
end;
|
|
|
|
function llvm_getmetadatareftypedconst(metadata: tai_llvmbasemetadatanode): tai_simpletypedconst;
|
|
|
|
implementation
|
|
|
|
uses
|
|
symdef;
|
|
|
|
function llvm_getmetadatareftypedconst(metadata: tai_llvmbasemetadatanode): tai_simpletypedconst;
|
|
begin
|
|
result:=tai_simpletypedconst.create(llvm_metadatatype, tai_llvmmetadatareftypedconst.create(metadata));
|
|
end;
|
|
|
|
procedure tai_llvmbasemetadatanode.addvalue(val: tai_abstracttypedconst);
|
|
begin
|
|
{ bypass string merging attempts, as we add tai_strings directly here }
|
|
fvalues.add(val);
|
|
end;
|
|
|
|
constructor tai_llvmbasemetadatanode.create;
|
|
begin
|
|
inherited create(tck_array, llvm_metadatatype);
|
|
typ:=ait_llvmmetadatanode;
|
|
end;
|
|
|
|
|
|
class function tai_llvmunnamedmetadatanode.getnextid: cardinal;
|
|
begin
|
|
result:=snextid;
|
|
inc(snextid);
|
|
end;
|
|
|
|
|
|
function tai_llvmunnamedmetadatanode.getname: ansistring;
|
|
begin
|
|
str(fnameval,result);
|
|
end;
|
|
|
|
|
|
constructor tai_llvmunnamedmetadatanode.create;
|
|
begin
|
|
inherited;
|
|
fnameval:=getnextid;
|
|
end;
|
|
|
|
|
|
function tai_llvmnamedmetadatanode.getname: ansistring;
|
|
begin
|
|
result:=fname;
|
|
end;
|
|
|
|
|
|
constructor tai_llvmnamedmetadatanode.create(const aName: ansistring);
|
|
begin
|
|
inherited create;
|
|
fname:=aName;
|
|
end;
|
|
|
|
|
|
constructor tai_llvmmetadatareftypedconst.create(_val: tai_llvmbasemetadatanode);
|
|
begin
|
|
inherited create(ait_llvmmetadatareftypedconst);
|
|
fval:=_val;
|
|
end;
|
|
|
|
|
|
constructor tai_llvmmetadatareferenceoperand.create(const anID: ansistring; aValue: tai_llvmbasemetadatanode);
|
|
begin
|
|
inherited create(ait_llvmmetadatarefoperand);
|
|
fid:=anID;
|
|
fvalue:=aValue;
|
|
end;
|
|
|
|
|
|
end.
|
|
|