fpc/compiler/llvm/aasmllvmmetadata.pas
Jonas Maebe 3fa6838815 * basic llvm metadata support
git-svn-id: branches/debug_eh@41978 -
2019-05-02 19:45:26 +00:00

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.