aasmllvmmetadata.pas 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. {
  2. Copyright (c) 2019 by Jonas Maebe,
  3. member of the Free Pascal Compiler development team
  4. Support for LLVM metadata
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit aasmllvmmetadata;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. aasmtai, aasmcnst,
  23. symtype;
  24. type
  25. tspecialisedmetadatanodekind = (
  26. smeta_DIFile,
  27. smeta_DIBasicType,
  28. smeta_DISubroutineType,
  29. smeta_DIDerivedType,
  30. smeta_DICompositeType,
  31. smeta_DISubrange,
  32. smeta_DIEnumerator,
  33. smeta_DITemplateTypeParameter,
  34. smeta_DITemplateValueParameter,
  35. smeta_DINamespace,
  36. smeta_DIGlobalVariable,
  37. smeta_DISubprogram,
  38. smeta_DILexicalBlock,
  39. smeta_DILexicalBlockFile,
  40. smeta_DILocation,
  41. smeta_DILocalVariable,
  42. smeta_DIExpression,
  43. smeta_DIObjCProperty,
  44. smeta_DIImportedEntity,
  45. smeta_DIMacro,
  46. smeta_DIMacroFile
  47. );
  48. tai_llvmbasemetadatanode = class abstract(tai_aggregatetypedconst)
  49. strict protected
  50. function getname: ansistring; virtual; abstract;
  51. public
  52. procedure addvalue(val: tai_abstracttypedconst); override;
  53. property name: ansistring read getname;
  54. constructor create; reintroduce;
  55. end;
  56. (* !0 = !{ type1 value1, ... } *)
  57. tai_llvmunnamedmetadatanode = class(tai_llvmbasemetadatanode)
  58. strict private class var
  59. snextid: cardinal;
  60. class function getnextid: cardinal;
  61. strict protected
  62. fnameval: cardinal;
  63. public
  64. constructor create; reintroduce;
  65. function getname: ansistring; override;
  66. end;
  67. (* !name = !{ type1 value1, ... } *)
  68. tai_llvmnamedmetadatanode = class(tai_llvmbasemetadatanode)
  69. strict protected
  70. fname: ansistring;
  71. function getname: ansistring; override;
  72. public
  73. constructor create(const aName: ansistring);
  74. end;
  75. tai_llvmmetadatareftypedconst = class(tai_simple)
  76. strict private
  77. fval: tai_llvmbasemetadatanode;
  78. public
  79. constructor create(_val: tai_llvmbasemetadatanode);
  80. property val: tai_llvmbasemetadatanode read fval;
  81. end;
  82. { @g1 = global i32 0, *!id !value.name* }
  83. tai_llvmmetadatareferenceoperand = class(tai_simple)
  84. strict private
  85. fid: ansistring;
  86. fvalue: tai_llvmbasemetadatanode;
  87. public
  88. constructor create(const anID: ansistring; aValue: tai_llvmbasemetadatanode);
  89. property id: ansistring read fid;
  90. property value: tai_llvmbasemetadatanode read fvalue;
  91. end;
  92. { !name = !kindname(field1: value1, ...) }
  93. tai_llvmspecialisedmetadatanode = class(tai_llvmunnamedmetadatanode)
  94. { identifies name and fieldnames }
  95. kind: tspecialisedmetadatanodekind;
  96. end;
  97. function llvm_getmetadatareftypedconst(metadata: tai_llvmbasemetadatanode): tai_simpletypedconst;
  98. implementation
  99. uses
  100. symdef;
  101. function llvm_getmetadatareftypedconst(metadata: tai_llvmbasemetadatanode): tai_simpletypedconst;
  102. begin
  103. result:=tai_simpletypedconst.create(llvm_metadatatype, tai_llvmmetadatareftypedconst.create(metadata));
  104. end;
  105. procedure tai_llvmbasemetadatanode.addvalue(val: tai_abstracttypedconst);
  106. begin
  107. { bypass string merging attempts, as we add tai_strings directly here }
  108. fvalues.add(val);
  109. end;
  110. constructor tai_llvmbasemetadatanode.create;
  111. begin
  112. inherited create(tck_array, llvm_metadatatype);
  113. typ:=ait_llvmmetadatanode;
  114. end;
  115. class function tai_llvmunnamedmetadatanode.getnextid: cardinal;
  116. begin
  117. result:=snextid;
  118. inc(snextid);
  119. end;
  120. function tai_llvmunnamedmetadatanode.getname: ansistring;
  121. begin
  122. str(fnameval,result);
  123. end;
  124. constructor tai_llvmunnamedmetadatanode.create;
  125. begin
  126. inherited;
  127. fnameval:=getnextid;
  128. end;
  129. function tai_llvmnamedmetadatanode.getname: ansistring;
  130. begin
  131. result:=fname;
  132. end;
  133. constructor tai_llvmnamedmetadatanode.create(const aName: ansistring);
  134. begin
  135. inherited create;
  136. fname:=aName;
  137. end;
  138. constructor tai_llvmmetadatareftypedconst.create(_val: tai_llvmbasemetadatanode);
  139. begin
  140. inherited create(ait_llvmmetadatareftypedconst);
  141. fval:=_val;
  142. end;
  143. constructor tai_llvmmetadatareferenceoperand.create(const anID: ansistring; aValue: tai_llvmbasemetadatanode);
  144. begin
  145. inherited create(ait_llvmmetadatarefoperand);
  146. fid:=anID;
  147. fvalue:=aValue;
  148. end;
  149. end.