|
@@ -27,7 +27,9 @@ unit aasmllvmmetadata;
|
|
|
interface
|
|
|
|
|
|
uses
|
|
|
- aasmtai, aasmcnst,
|
|
|
+ globtype,cclasses,
|
|
|
+ cgbase,
|
|
|
+ aasmtai,aasmcnst,
|
|
|
symtype;
|
|
|
|
|
|
type
|
|
@@ -55,6 +57,10 @@ interface
|
|
|
smeta_DIMacroFile
|
|
|
);
|
|
|
|
|
|
+// represented by a tai_simpletypedconst() with inside a metadata struct,
|
|
|
+// or as a metadata register (for parameters)
|
|
|
+// tai_llvmmetadatastring = class
|
|
|
+
|
|
|
tai_llvmbasemetadatanode = class abstract(tai_aggregatetypedconst)
|
|
|
strict protected
|
|
|
function getname: ansistring; virtual; abstract;
|
|
@@ -67,10 +73,10 @@ interface
|
|
|
(* !0 = !{ type1 value1, ... } *)
|
|
|
tai_llvmunnamedmetadatanode = class(tai_llvmbasemetadatanode)
|
|
|
strict private class var
|
|
|
- snextid: cardinal;
|
|
|
- class function getnextid: cardinal;
|
|
|
+ snextid: TSuperRegister;
|
|
|
+ class function getnextid: TSuperRegister;
|
|
|
strict protected
|
|
|
- fnameval: cardinal;
|
|
|
+ fnameval: TSuperRegister;
|
|
|
public
|
|
|
constructor create; reintroduce;
|
|
|
function getname: ansistring; override;
|
|
@@ -104,17 +110,31 @@ interface
|
|
|
property value: tai_llvmbasemetadatanode read fvalue;
|
|
|
end;
|
|
|
|
|
|
- { !name = !kindname(field1: value1, ...) }
|
|
|
+ { !name = !kindname(field1: value1, ...) }
|
|
|
tai_llvmspecialisedmetadatanode = class(tai_llvmunnamedmetadatanode)
|
|
|
{ identifies name and fieldnames }
|
|
|
kind: tspecialisedmetadatanodekind;
|
|
|
end;
|
|
|
|
|
|
+ tllvmmetadata = class
|
|
|
+ strict private
|
|
|
+ class function addstring(const s: TSymstr): TSuperRegister;
|
|
|
+ class function regtostring(reg: TRegister): TSymStr;
|
|
|
+ public
|
|
|
+
|
|
|
+ class function getstringreg(const s: TSymstr): TRegister;
|
|
|
+ class function getpcharreg(p: pchar; len: longint): TRegister;
|
|
|
+ class function getregstring(reg: TRegister): TSymStr;
|
|
|
+ end;
|
|
|
+
|
|
|
function llvm_getmetadatareftypedconst(metadata: tai_llvmbasemetadatanode): tai_simpletypedconst;
|
|
|
|
|
|
+
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
|
+ verbose,
|
|
|
+ fmodule,
|
|
|
symdef;
|
|
|
|
|
|
function llvm_getmetadatareftypedconst(metadata: tai_llvmbasemetadatanode): tai_simpletypedconst;
|
|
@@ -135,7 +155,7 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- class function tai_llvmunnamedmetadatanode.getnextid: cardinal;
|
|
|
+ class function tai_llvmunnamedmetadatanode.getnextid: TSuperRegister;
|
|
|
begin
|
|
|
result:=snextid;
|
|
|
inc(snextid);
|
|
@@ -183,5 +203,63 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
+/////////////////////////////////////////////////
|
|
|
+
|
|
|
+ class function tllvmmetadata.addstring(const s: TSymStr): TSuperRegister;
|
|
|
+ var
|
|
|
+ index: longint;
|
|
|
+ begin
|
|
|
+ index:=current_module.llvmmetadatastrings.Add(s,nil);
|
|
|
+ if index>high(result) then
|
|
|
+ internalerror(2019122806);
|
|
|
+ result:=index;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ class function tllvmmetadata.regtostring(reg: TRegister): TSymStr;
|
|
|
+ begin
|
|
|
+ if getregtype(reg)<>R_METADATAREGISTER then
|
|
|
+ internalerror(2019122807);
|
|
|
+ if getsubreg(reg)<>R_SUBMETASTRING then
|
|
|
+ internalerror(2019122808);
|
|
|
+ result:=current_module.llvmmetadatastrings.NameOfIndex(getsupreg(reg));
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ class function tllvmmetadata.getstringreg(const s: TSymstr): TRegister;
|
|
|
+ var
|
|
|
+ supreg: TSuperRegister;
|
|
|
+ index: longint;
|
|
|
+ begin
|
|
|
+ index:=current_module.llvmmetadatastrings.FindIndexOf(s);
|
|
|
+ if index<>-1 then
|
|
|
+ supreg:=index
|
|
|
+ else
|
|
|
+ supreg:=addstring(s);
|
|
|
+ result:=newreg(R_METADATAREGISTER,supreg,R_SUBMETASTRING);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ class function tllvmmetadata.getpcharreg(p: pchar; len: longint): TRegister;
|
|
|
+ var
|
|
|
+ str: TSymStr;
|
|
|
+ begin
|
|
|
+ if len>0 then
|
|
|
+ begin
|
|
|
+ setlength(str,len);
|
|
|
+ move(p[0],str[1],len);
|
|
|
+ result:=getstringreg(str);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ result:=getstringreg('');
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ class function tllvmmetadata.getregstring(reg: TRegister): TSymStr;
|
|
|
+ begin
|
|
|
+ result:=regtostring(reg);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
end.
|
|
|
|