brintos

brintos / llvm-project-archived public Read only

0
0
Text · 41.8 KiB · 023ebd6 Raw
1027 lines · c
1/*===-- debuginfo_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\2|*                                                                            *|3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|4|* Exceptions.                                                                *|5|* See https://llvm.org/LICENSE.txt for license information.                  *|6|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|7|*                                                                            *|8|*===----------------------------------------------------------------------===*|9|*                                                                            *|10|* This file glues LLVM's OCaml interface to its C interface. These functions *|11|* are by and large transparent wrappers to the corresponding C functions.    *|12|*                                                                            *|13|* Note that these functions intentionally take liberties with the CAMLparamX *|14|* macros, since most of the parameters are not GC heap objects.              *|15|*                                                                            *|16\*===----------------------------------------------------------------------===*/17 18#include <string.h>19 20#include "caml/memory.h"21#include "caml/mlvalues.h"22#include "llvm-c/Core.h"23#include "llvm-c/DebugInfo.h"24#include "llvm-c/Support.h"25 26#include "llvm_ocaml.h"27 28// This is identical to the definition in llvm_debuginfo.ml:DIFlag.t29typedef enum {30  i_DIFlagZero,31  i_DIFlagPrivate,32  i_DIFlagProtected,33  i_DIFlagPublic,34  i_DIFlagFwdDecl,35  i_DIFlagAppleBlock,36  i_DIFlagReservedBit4,37  i_DIFlagVirtual,38  i_DIFlagArtificial,39  i_DIFlagExplicit,40  i_DIFlagPrototyped,41  i_DIFlagObjcClassComplete,42  i_DIFlagObjectPointer,43  i_DIFlagVector,44  i_DIFlagStaticMember,45  i_DIFlagLValueReference,46  i_DIFlagRValueReference,47  i_DIFlagReserved,48  i_DIFlagSingleInheritance,49  i_DIFlagMultipleInheritance,50  i_DIFlagVirtualInheritance,51  i_DIFlagIntroducedVirtual,52  i_DIFlagBitField,53  i_DIFlagNoReturn,54  i_DIFlagTypePassByValue,55  i_DIFlagTypePassByReference,56  i_DIFlagEnumClass,57  i_DIFlagFixedEnum,58  i_DIFlagThunk,59  i_DIFlagNonTrivial,60  i_DIFlagBigEndian,61  i_DIFlagLittleEndian,62  i_DIFlagIndirectVirtualBase,63  i_DIFlagAccessibility,64  i_DIFlagPtrToMemberRep65} LLVMDIFlag_i;66 67static LLVMDIFlags map_DIFlag(LLVMDIFlag_i DIF) {68  switch (DIF) {69  case i_DIFlagZero:70    return LLVMDIFlagZero;71  case i_DIFlagPrivate:72    return LLVMDIFlagPrivate;73  case i_DIFlagProtected:74    return LLVMDIFlagProtected;75  case i_DIFlagPublic:76    return LLVMDIFlagPublic;77  case i_DIFlagFwdDecl:78    return LLVMDIFlagFwdDecl;79  case i_DIFlagAppleBlock:80    return LLVMDIFlagAppleBlock;81  case i_DIFlagReservedBit4:82    return LLVMDIFlagReservedBit4;83  case i_DIFlagVirtual:84    return LLVMDIFlagVirtual;85  case i_DIFlagArtificial:86    return LLVMDIFlagArtificial;87  case i_DIFlagExplicit:88    return LLVMDIFlagExplicit;89  case i_DIFlagPrototyped:90    return LLVMDIFlagPrototyped;91  case i_DIFlagObjcClassComplete:92    return LLVMDIFlagObjcClassComplete;93  case i_DIFlagObjectPointer:94    return LLVMDIFlagObjectPointer;95  case i_DIFlagVector:96    return LLVMDIFlagVector;97  case i_DIFlagStaticMember:98    return LLVMDIFlagStaticMember;99  case i_DIFlagLValueReference:100    return LLVMDIFlagLValueReference;101  case i_DIFlagRValueReference:102    return LLVMDIFlagRValueReference;103  case i_DIFlagReserved:104    return LLVMDIFlagReserved;105  case i_DIFlagSingleInheritance:106    return LLVMDIFlagSingleInheritance;107  case i_DIFlagMultipleInheritance:108    return LLVMDIFlagMultipleInheritance;109  case i_DIFlagVirtualInheritance:110    return LLVMDIFlagVirtualInheritance;111  case i_DIFlagIntroducedVirtual:112    return LLVMDIFlagIntroducedVirtual;113  case i_DIFlagBitField:114    return LLVMDIFlagBitField;115  case i_DIFlagNoReturn:116    return LLVMDIFlagNoReturn;117  case i_DIFlagTypePassByValue:118    return LLVMDIFlagTypePassByValue;119  case i_DIFlagTypePassByReference:120    return LLVMDIFlagTypePassByReference;121  case i_DIFlagEnumClass:122    return LLVMDIFlagEnumClass;123  case i_DIFlagFixedEnum:124    return LLVMDIFlagFixedEnum;125  case i_DIFlagThunk:126    return LLVMDIFlagThunk;127  case i_DIFlagNonTrivial:128    return LLVMDIFlagNonTrivial;129  case i_DIFlagBigEndian:130    return LLVMDIFlagBigEndian;131  case i_DIFlagLittleEndian:132    return LLVMDIFlagLittleEndian;133  case i_DIFlagIndirectVirtualBase:134    return LLVMDIFlagIndirectVirtualBase;135  case i_DIFlagAccessibility:136    return LLVMDIFlagAccessibility;137  case i_DIFlagPtrToMemberRep:138    return LLVMDIFlagPtrToMemberRep;139  }140}141 142/* unit -> int */143value llvm_debug_metadata_version(value Unit) {144  return Val_int(LLVMDebugMetadataVersion());145}146 147/* llmodule -> int */148value llvm_get_module_debug_metadata_version(value Module) {149  return Val_int(LLVMGetModuleDebugMetadataVersion(Module_val(Module)));150}151 152#define DIFlags_val(v) (*(LLVMDIFlags *)(Data_custom_val(v)))153 154static struct custom_operations diflags_ops = {155    (char *)"DebugInfo.lldiflags", custom_finalize_default,156    custom_compare_default,        custom_hash_default,157    custom_serialize_default,      custom_deserialize_default,158    custom_compare_ext_default};159 160static value alloc_diflags(LLVMDIFlags Flags) {161  value V = caml_alloc_custom(&diflags_ops, sizeof(LLVMDIFlags), 0, 1);162  DIFlags_val(V) = Flags;163  return V;164}165 166LLVMDIFlags llvm_diflags_get(value i_Flag) {167  LLVMDIFlags Flags = map_DIFlag(Int_val(i_Flag));168  return alloc_diflags(Flags);169}170 171LLVMDIFlags llvm_diflags_set(value Flags, value i_Flag) {172  LLVMDIFlags FlagsNew = DIFlags_val(Flags) | map_DIFlag(Int_val(i_Flag));173  return alloc_diflags(FlagsNew);174}175 176value llvm_diflags_test(value Flags, value i_Flag) {177  LLVMDIFlags Flag = map_DIFlag(Int_val(i_Flag));178  return Val_bool((DIFlags_val(Flags) & Flag) == Flag);179}180 181#define DIBuilder_val(v) (*(LLVMDIBuilderRef *)(Data_custom_val(v)))182 183static void llvm_finalize_dibuilder(value B) {184  LLVMDIBuilderFinalize(DIBuilder_val(B));185  LLVMDisposeDIBuilder(DIBuilder_val(B));186}187 188static struct custom_operations dibuilder_ops = {189    (char *)"DebugInfo.lldibuilder", llvm_finalize_dibuilder,190    custom_compare_default,          custom_hash_default,191    custom_serialize_default,        custom_deserialize_default,192    custom_compare_ext_default};193 194static value alloc_dibuilder(LLVMDIBuilderRef B) {195  value V = caml_alloc_custom(&dibuilder_ops, sizeof(LLVMDIBuilderRef), 0, 1);196  DIBuilder_val(V) = B;197  return V;198}199 200/* llmodule -> lldibuilder */201value llvm_dibuilder(value M) {202  return alloc_dibuilder(LLVMCreateDIBuilder(Module_val(M)));203}204 205value llvm_dibuild_finalize(value Builder) {206  LLVMDIBuilderFinalize(DIBuilder_val(Builder));207  return Val_unit;208}209 210value llvm_dibuild_create_compile_unit_native(211    value Builder, value Lang, value FileRef, value Producer, value IsOptimized,212    value Flags, value RuntimeVer, value SplitName, value Kind, value DWOId,213    value SplitDebugInline, value DebugInfoForProfiling, value SysRoot,214    value SDK) {215  return to_val(LLVMDIBuilderCreateCompileUnit(216      DIBuilder_val(Builder), Int_val(Lang), Metadata_val(FileRef),217      String_val(Producer), caml_string_length(Producer), Bool_val(IsOptimized),218      String_val(Flags), caml_string_length(Flags), Int_val(RuntimeVer),219      String_val(SplitName), caml_string_length(SplitName), Int_val(Kind),220      Int_val(DWOId), Bool_val(SplitDebugInline),221      Bool_val(DebugInfoForProfiling), String_val(SysRoot),222      caml_string_length(SysRoot), String_val(SDK), caml_string_length(SDK)));223}224 225value llvm_dibuild_create_compile_unit_bytecode(value *argv, int argn) {226  return llvm_dibuild_create_compile_unit_native(227      argv[0],  // Builder228      argv[1],  // Lang229      argv[2],  // FileRef230      argv[3],  // Producer231      argv[4],  // IsOptimized232      argv[5],  // Flags233      argv[6],  // RuntimeVer234      argv[7],  // SplitName235      argv[8],  // Kind236      argv[9],  // DWOId237      argv[10], // SplitDebugInline238      argv[11], // DebugInfoForProfiling239      argv[12], // SysRoot240      argv[13]  // SDK241  );242}243 244value llvm_dibuild_create_file(value Builder, value Filename, value Directory) {245  return to_val(LLVMDIBuilderCreateFile(246      DIBuilder_val(Builder), String_val(Filename),247      caml_string_length(Filename), String_val(Directory),248      caml_string_length(Directory)));249}250 251value llvm_dibuild_create_module_native(value Builder, value ParentScope,252                                        value Name, value ConfigMacros,253                                        value IncludePath, value SysRoot) {254  return to_val(LLVMDIBuilderCreateModule(255      DIBuilder_val(Builder), Metadata_val(ParentScope), String_val(Name),256      caml_string_length(Name), String_val(ConfigMacros),257      caml_string_length(ConfigMacros), String_val(IncludePath),258      caml_string_length(IncludePath), String_val(SysRoot),259      caml_string_length(SysRoot)));260}261 262value llvm_dibuild_create_module_bytecode(value *argv, int argn) {263  return llvm_dibuild_create_module_native(argv[0], // Builder264                                           argv[1], // ParentScope265                                           argv[2], // Name266                                           argv[3], // ConfigMacros267                                           argv[4], // IncludePath268                                           argv[5]  // SysRoot269  );270}271 272value llvm_dibuild_create_namespace(value Builder, value ParentScope,273                                    value Name, value ExportSymbols) {274  return to_val(LLVMDIBuilderCreateNameSpace(275      DIBuilder_val(Builder), Metadata_val(ParentScope), String_val(Name),276      caml_string_length(Name), Bool_val(ExportSymbols)));277}278 279value llvm_dibuild_create_function_native(value Builder, value Scope,280                                          value Name, value LinkageName,281                                          value File, value LineNo, value Ty,282                                          value IsLocalToUnit,283                                          value IsDefinition, value ScopeLine,284                                          value Flags, value IsOptimized) {285  return to_val(LLVMDIBuilderCreateFunction(286      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),287      caml_string_length(Name), String_val(LinkageName),288      caml_string_length(LinkageName), Metadata_val(File), Int_val(LineNo),289      Metadata_val(Ty), Bool_val(IsLocalToUnit), Bool_val(IsDefinition),290      Int_val(ScopeLine), DIFlags_val(Flags), Bool_val(IsOptimized)));291}292 293value llvm_dibuild_create_function_bytecode(value *argv, int argn) {294  return llvm_dibuild_create_function_native(argv[0],  // Builder,295                                             argv[1],  // Scope296                                             argv[2],  // Name297                                             argv[3],  // LinkageName298                                             argv[4],  // File299                                             argv[5],  // LineNo300                                             argv[6],  // Ty301                                             argv[7],  // IsLocalUnit302                                             argv[8],  // IsDefinition303                                             argv[9],  // ScopeLine304                                             argv[10], // Flags305                                             argv[11]  // IsOptimized306  );307}308 309value llvm_dibuild_create_lexical_block(value Builder, value Scope, value File,310                                        value Line, value Column) {311  return to_val(LLVMDIBuilderCreateLexicalBlock(312      DIBuilder_val(Builder), Metadata_val(Scope), Metadata_val(File),313      Int_val(Line), Int_val(Column)));314}315 316value llvm_metadata_null(value Unit) { return to_val(NULL); }317 318value llvm_dibuild_create_debug_location(value Ctx, value Line, value Column,319                                         value Scope, value InlinedAt) {320  return to_val(LLVMDIBuilderCreateDebugLocation(321      Context_val(Ctx), Int_val(Line), Int_val(Column), Metadata_val(Scope),322      Metadata_val(InlinedAt)));323}324 325value llvm_di_location_get_line(value Location) {326  return Val_int(LLVMDILocationGetLine(Metadata_val(Location)));327}328 329value llvm_di_location_get_column(value Location) {330  return Val_int(LLVMDILocationGetColumn(Metadata_val(Location)));331}332 333value llvm_di_location_get_scope(value Location) {334  return to_val(LLVMDILocationGetScope(Metadata_val(Location)));335}336 337value llvm_di_location_get_inlined_at(value Location) {338  return ptr_to_option(LLVMDILocationGetInlinedAt(Metadata_val(Location)));339}340 341value llvm_di_scope_get_file(value Scope) {342  return ptr_to_option(LLVMDIScopeGetFile(Metadata_val(Scope)));343}344 345value llvm_di_file_get_directory(value File) {346  unsigned Len;347  const char *Directory = LLVMDIFileGetDirectory(Metadata_val(File), &Len);348  return cstr_to_string(Directory, Len);349}350 351value llvm_di_file_get_filename(value File) {352  unsigned Len;353  const char *Filename = LLVMDIFileGetFilename(Metadata_val(File), &Len);354  return cstr_to_string(Filename, Len);355}356 357value llvm_di_file_get_source(value File) {358  unsigned Len;359  const char *Source = LLVMDIFileGetSource(Metadata_val(File), &Len);360  return cstr_to_string(Source, Len);361}362 363value llvm_dibuild_get_or_create_type_array(value Builder, value Data) {364  mlsize_t Count = Wosize_val(Data);365  LLVMMetadataRef *Temp = from_val_array(Data);366  LLVMMetadataRef Metadata =367      LLVMDIBuilderGetOrCreateTypeArray(DIBuilder_val(Builder), Temp, Count);368  free(Temp);369  return to_val(Metadata);370}371 372value llvm_dibuild_get_or_create_array(value Builder, value Data) {373  mlsize_t Count = Wosize_val(Data);374  LLVMMetadataRef *Temp = from_val_array(Data);375  LLVMMetadataRef Metadata =376      LLVMDIBuilderGetOrCreateArray(DIBuilder_val(Builder), Temp, Count);377  free(Temp);378  return to_val(Metadata);379}380 381value llvm_dibuild_create_subroutine_type(value Builder, value File,382                                          value ParameterTypes, value Flags) {383  mlsize_t Count = Wosize_val(ParameterTypes);384  LLVMMetadataRef *Temp = from_val_array(ParameterTypes);385  LLVMMetadataRef Metadata = LLVMDIBuilderCreateSubroutineType(386      DIBuilder_val(Builder), Metadata_val(File), Temp,387      Wosize_val(ParameterTypes), DIFlags_val(Flags));388  free(Temp);389  return to_val(Metadata);390}391 392value llvm_dibuild_create_enumerator(value Builder, value Name, value Value,393                                     value IsUnsigned) {394  return to_val(LLVMDIBuilderCreateEnumerator(395      DIBuilder_val(Builder), String_val(Name), caml_string_length(Name),396      (int64_t)Int_val(Value), Bool_val(IsUnsigned)));397}398 399value llvm_dibuild_create_enumeration_type_native(400    value Builder, value Scope, value Name, value File, value LineNumber,401    value SizeInBits, value AlignInBits, value Elements, value ClassTy) {402  mlsize_t Count = Wosize_val(Elements);403  LLVMMetadataRef *Temp = from_val_array(Elements);404  LLVMMetadataRef Metadata = LLVMDIBuilderCreateEnumerationType(405      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),406      caml_string_length(Name), Metadata_val(File), Int_val(LineNumber),407      (uint64_t)Int_val(SizeInBits), Int_val(AlignInBits), Temp, Count,408      Metadata_val(ClassTy));409  free(Temp);410  return to_val(Metadata);411}412 413value llvm_dibuild_create_enumeration_type_bytecode(value *argv, int argn) {414  return llvm_dibuild_create_enumeration_type_native(argv[0], // Builder415                                                     argv[1], // Scope416                                                     argv[2], // Name417                                                     argv[3], // File418                                                     argv[4], // LineNumber419                                                     argv[5], // SizeInBits420                                                     argv[6], // AlignInBits421                                                     argv[7], // Elements422                                                     argv[8]  // ClassTy423  );424}425 426value llvm_dibuild_create_union_type_native(427    value Builder, value Scope, value Name, value File, value LineNumber,428    value SizeInBits, value AlignInBits, value Flags, value Elements,429    value RunTimeLanguage, value UniqueId) {430  LLVMMetadataRef *Temp = from_val_array(Elements);431  LLVMMetadataRef Metadata = LLVMDIBuilderCreateUnionType(432      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),433      caml_string_length(Name), Metadata_val(File), Int_val(LineNumber),434      (uint64_t)Int_val(SizeInBits), Int_val(AlignInBits), DIFlags_val(Flags),435      Temp, Wosize_val(Elements), Int_val(RunTimeLanguage),436      String_val(UniqueId), caml_string_length(UniqueId));437  free(Temp);438  return to_val(Metadata);439}440 441value llvm_dibuild_create_union_type_bytecode(value *argv, int argn) {442  return llvm_dibuild_create_union_type_native(argv[0], // Builder443                                               argv[1], // Scope444                                               argv[2], // Name445                                               argv[3], // File446                                               argv[4], // LineNumber447                                               argv[5], // SizeInBits448                                               argv[6], // AlignInBits449                                               argv[7], // Flags450                                               argv[8], // Elements451                                               argv[9], // RunTimeLanguage452                                               argv[10] // UniqueId453  );454}455 456value llvm_dibuild_create_array_type(value Builder, value Size,457                                     value AlignInBits, value Ty,458                                     value Subscripts) {459  LLVMMetadataRef *Temp = from_val_array(Subscripts);460  LLVMMetadataRef Metadata = LLVMDIBuilderCreateArrayType(461      DIBuilder_val(Builder), (uint64_t)Int_val(Size), Int_val(AlignInBits),462      Metadata_val(Ty), Temp, Wosize_val(Subscripts));463  free(Temp);464  return to_val(Metadata);465}466 467value llvm_dibuild_create_vector_type(value Builder, value Size,468                                      value AlignInBits, value Ty,469                                      value Subscripts) {470  LLVMMetadataRef *Temp = from_val_array(Subscripts);471  LLVMMetadataRef Metadata = LLVMDIBuilderCreateVectorType(472      DIBuilder_val(Builder), (uint64_t)Int_val(Size), Int_val(AlignInBits),473      Metadata_val(Ty), Temp, Wosize_val(Subscripts));474  free(Temp);475  return to_val(Metadata);476}477 478value llvm_dibuild_create_unspecified_type(value Builder, value Name) {479  LLVMMetadataRef Metadata = LLVMDIBuilderCreateUnspecifiedType(480      DIBuilder_val(Builder), String_val(Name), caml_string_length(Name));481  return to_val(Metadata);482}483 484value llvm_dibuild_create_basic_type(value Builder, value Name,485                                     value SizeInBits, value Encoding,486                                     value Flags) {487  LLVMMetadataRef Metadata = LLVMDIBuilderCreateBasicType(488      DIBuilder_val(Builder), String_val(Name), caml_string_length(Name),489      (uint64_t)Int_val(SizeInBits), Int_val(Encoding), DIFlags_val(Flags));490  return to_val(Metadata);491}492 493value llvm_dibuild_create_pointer_type_native(value Builder, value PointeeTy,494                                              value SizeInBits,495                                              value AlignInBits,496                                              value AddressSpace, value Name) {497  LLVMMetadataRef Metadata = LLVMDIBuilderCreatePointerType(498      DIBuilder_val(Builder), Metadata_val(PointeeTy),499      (uint64_t)Int_val(SizeInBits), Int_val(AlignInBits),500      Int_val(AddressSpace), String_val(Name), caml_string_length(Name));501  return to_val(Metadata);502}503 504value llvm_dibuild_create_pointer_type_bytecode(value *argv, int argn) {505  return llvm_dibuild_create_pointer_type_native(argv[0], // Builder506                                                 argv[1], // PointeeTy507                                                 argv[2], // SizeInBits508                                                 argv[3], // AlignInBits509                                                 argv[4], // AddressSpace510                                                 argv[5]  // Name511  );512}513 514value llvm_dibuild_create_struct_type_native(515    value Builder, value Scope, value Name, value File, value LineNumber,516    value SizeInBits, value AlignInBits, value Flags, value DerivedFrom,517    value Elements, value RunTimeLanguage, value VTableHolder, value UniqueId) {518  LLVMMetadataRef *Temp = from_val_array(Elements);519  LLVMMetadataRef Metadata = LLVMDIBuilderCreateStructType(520      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),521      caml_string_length(Name), Metadata_val(File), Int_val(LineNumber),522      (uint64_t)Int_val(SizeInBits), Int_val(AlignInBits), DIFlags_val(Flags),523      Metadata_val(DerivedFrom), Temp, Wosize_val(Elements),524      Int_val(RunTimeLanguage), Metadata_val(VTableHolder),525      String_val(UniqueId), caml_string_length(UniqueId));526  free(Temp);527  return to_val(Metadata);528}529 530value llvm_dibuild_create_struct_type_bytecode(value *argv, int argn) {531  return llvm_dibuild_create_struct_type_native(argv[0],  // Builder532                                                argv[1],  // Scope533                                                argv[2],  // Name534                                                argv[3],  // File535                                                argv[4],  // LineNumber536                                                argv[5],  // SizeInBits537                                                argv[6],  // AlignInBits538                                                argv[7],  // Flags539                                                argv[8],  // DeriviedFrom540                                                argv[9],  // Elements541                                                argv[10], // RunTimeLanguage542                                                argv[11], // VTableHolder543                                                argv[12]  // UniqueId544  );545}546 547value llvm_dibuild_create_member_type_native(value Builder, value Scope,548                                             value Name, value File,549                                             value LineNumber, value SizeInBits,550                                             value AlignInBits,551                                             value OffsetInBits, value Flags,552                                             value Ty) {553  LLVMMetadataRef Metadata = LLVMDIBuilderCreateMemberType(554      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),555      caml_string_length(Name), Metadata_val(File), Int_val(LineNumber),556      (uint64_t)Int_val(SizeInBits), Int_val(AlignInBits),557      (uint64_t)Int_val(OffsetInBits), DIFlags_val(Flags), Metadata_val(Ty));558  return to_val(Metadata);559}560 561value llvm_dibuild_create_member_type_bytecode(value *argv, int argn) {562  return llvm_dibuild_create_member_type_native(argv[0], // Builder563                                                argv[1], // Scope564                                                argv[2], // Name565                                                argv[3], // File566                                                argv[4], // LineNumber567                                                argv[5], // SizeInBits568                                                argv[6], // AlignInBits569                                                argv[7], // OffsetInBits570                                                argv[8], // Flags571                                                argv[9]  // Ty572  );573}574 575value llvm_dibuild_create_static_member_type_native(576    value Builder, value Scope, value Name, value File, value LineNumber,577    value Type, value Flags, value ConstantVal, value AlignInBits) {578  LLVMMetadataRef Metadata = LLVMDIBuilderCreateStaticMemberType(579      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),580      caml_string_length(Name), Metadata_val(File), Int_val(LineNumber),581      Metadata_val(Type), DIFlags_val(Flags), Value_val(ConstantVal),582      Int_val(AlignInBits));583  return to_val(Metadata);584}585 586value llvm_dibuild_create_static_member_type_bytecode(value *argv, int argn) {587  return llvm_dibuild_create_static_member_type_native(argv[0], // Builder588                                                       argv[1], // Scope589                                                       argv[2], // Name590                                                       argv[3], // File591                                                       argv[4], // LineNumber592                                                       argv[5], // Type593                                                       argv[6], // Flags,594                                                       argv[7], // ConstantVal595                                                       argv[8]  // AlignInBits596  );597}598 599value llvm_dibuild_create_member_pointer_type_native(600    value Builder, value PointeeType, value ClassType, value SizeInBits,601    value AlignInBits, value Flags) {602  LLVMMetadataRef Metadata = LLVMDIBuilderCreateMemberPointerType(603      DIBuilder_val(Builder), Metadata_val(PointeeType),604      Metadata_val(ClassType), (uint64_t)Int_val(SizeInBits),605      Int_val(AlignInBits), llvm_diflags_get(Flags));606  return to_val(Metadata);607}608 609value llvm_dibuild_create_member_pointer_type_bytecode(value *argv, int argn) {610  return llvm_dibuild_create_member_pointer_type_native(argv[0], // Builder611                                                        argv[1], // PointeeType612                                                        argv[2], // ClassType613                                                        argv[3], // SizeInBits614                                                        argv[4], // AlignInBits615                                                        argv[5]  // Flags616  );617}618 619value llvm_dibuild_create_object_pointer_type(value Builder, value Type,620                                              value Implicit) {621  LLVMMetadataRef Metadata = LLVMDIBuilderCreateObjectPointerType(622      DIBuilder_val(Builder), Metadata_val(Type), Bool_val(Implicit));623  return to_val(Metadata);624}625 626value llvm_dibuild_create_qualified_type(value Builder, value Tag, value Type) {627  LLVMMetadataRef Metadata = LLVMDIBuilderCreateQualifiedType(628      DIBuilder_val(Builder), Int_val(Tag), Metadata_val(Type));629  return to_val(Metadata);630}631 632value llvm_dibuild_create_reference_type(value Builder, value Tag, value Type) {633  LLVMMetadataRef Metadata = LLVMDIBuilderCreateReferenceType(634      DIBuilder_val(Builder), Int_val(Tag), Metadata_val(Type));635  return to_val(Metadata);636}637 638value llvm_dibuild_create_null_ptr_type(value Builder) {639  return to_val(LLVMDIBuilderCreateNullPtrType(DIBuilder_val(Builder)));640}641 642value llvm_dibuild_create_typedef_native(value Builder, value Type, value Name,643                                         value File, value LineNo, value Scope,644                                         value AlignInBits) {645  LLVMMetadataRef Metadata = LLVMDIBuilderCreateTypedef(646      DIBuilder_val(Builder), Metadata_val(Type), String_val(Name),647      caml_string_length(Name), Metadata_val(File), Int_val(LineNo),648      Metadata_val(Scope), Int_val(AlignInBits));649  return to_val(Metadata);650}651 652value llvm_dibuild_create_typedef_bytecode(value *argv, int argn) {653 654  return llvm_dibuild_create_typedef_native(argv[0], // Builder655                                            argv[1], // Type656                                            argv[2], // Name657                                            argv[3], // File658                                            argv[4], // LineNo659                                            argv[5], // Scope660                                            argv[6]  // AlignInBits661  );662}663 664value llvm_dibuild_create_inheritance_native(value Builder, value Ty,665                                             value BaseTy, value BaseOffset,666                                             value VBPtrOffset, value Flags) {667  LLVMMetadataRef Metadata = LLVMDIBuilderCreateInheritance(668      DIBuilder_val(Builder), Metadata_val(Ty), Metadata_val(BaseTy),669      (uint64_t)Int_val(BaseOffset), Int_val(VBPtrOffset), DIFlags_val(Flags));670  return to_val(Metadata);671}672 673value llvm_dibuild_create_inheritance_bytecode(value *argv, int arg) {674  return llvm_dibuild_create_inheritance_native(argv[0], // Builder675                                                argv[1], // Ty676                                                argv[2], // BaseTy677                                                argv[3], // BaseOffset678                                                argv[4], // VBPtrOffset679                                                argv[5]  // Flags680  );681}682 683value llvm_dibuild_create_forward_decl_native(684    value Builder, value Tag, value Name, value Scope, value File, value Line,685    value RuntimeLang, value SizeInBits, value AlignInBits,686    value UniqueIdentifier) {687  LLVMMetadataRef Metadata = LLVMDIBuilderCreateForwardDecl(688      DIBuilder_val(Builder), Int_val(Tag), String_val(Name),689      caml_string_length(Name), Metadata_val(Scope), Metadata_val(File),690      Int_val(Line), Int_val(RuntimeLang), (uint64_t)Int_val(SizeInBits),691      Int_val(AlignInBits), String_val(UniqueIdentifier),692      caml_string_length(UniqueIdentifier));693  return to_val(Metadata);694}695 696value llvm_dibuild_create_forward_decl_bytecode(value *argv, int arg) {697 698  return llvm_dibuild_create_forward_decl_native(argv[0], // Builder699                                                 argv[1], // Tag700                                                 argv[2], // Name701                                                 argv[3], // Scope702                                                 argv[4], // File703                                                 argv[5], // Line704                                                 argv[6], // RuntimeLang705                                                 argv[7], // SizeInBits706                                                 argv[8], // AlignInBits707                                                 argv[9]  // UniqueIdentifier708  );709}710 711value llvm_dibuild_create_replaceable_composite_type_native(712    value Builder, value Tag, value Name, value Scope, value File, value Line,713    value RuntimeLang, value SizeInBits, value AlignInBits, value Flags,714    value UniqueIdentifier) {715  LLVMMetadataRef Metadata = LLVMDIBuilderCreateReplaceableCompositeType(716      DIBuilder_val(Builder), Int_val(Tag), String_val(Name),717      caml_string_length(Name), Metadata_val(Scope), Metadata_val(File),718      Int_val(Line), Int_val(RuntimeLang), (uint64_t)Int_val(SizeInBits),719      Int_val(AlignInBits), DIFlags_val(Flags), String_val(UniqueIdentifier),720      caml_string_length(UniqueIdentifier));721  return to_val(Metadata);722}723 724value llvm_dibuild_create_replaceable_composite_type_bytecode(value *argv,725                                                              int arg) {726 727  return llvm_dibuild_create_replaceable_composite_type_native(728      argv[0], // Builder729      argv[1], // Tag730      argv[2], // Name731      argv[3], // Scope732      argv[4], // File733      argv[5], // Line734      argv[6], // RuntimeLang735      argv[7], // SizeInBits736      argv[8], // AlignInBits737      argv[9], // Flags738      argv[10] // UniqueIdentifier739  );740}741 742value llvm_dibuild_create_bit_field_member_type_native(743    value Builder, value Scope, value Name, value File, value LineNum,744    value SizeInBits, value OffsetInBits, value StorageOffsetInBits,745    value Flags, value Ty) {746  LLVMMetadataRef Metadata = LLVMDIBuilderCreateBitFieldMemberType(747      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),748      caml_string_length(Name), Metadata_val(File), Int_val(LineNum),749      (uint64_t)Int_val(SizeInBits), (uint64_t)Int_val(OffsetInBits),750      (uint64_t)Int_val(StorageOffsetInBits), DIFlags_val(Flags),751      Metadata_val(Ty));752  return to_val(Metadata);753}754 755value llvm_dibuild_create_bit_field_member_type_bytecode(value *argv, int arg) {756 757  return llvm_dibuild_create_bit_field_member_type_native(758      argv[0], // Builder759      argv[1], // Scope760      argv[2], // Name761      argv[3], // File762      argv[4], // LineNum763      argv[5], // SizeInBits764      argv[6], // OffsetInBits765      argv[7], // StorageOffsetInBits766      argv[8], // Flags767      argv[9]  // Ty768  );769}770 771value llvm_dibuild_create_class_type_native(772    value Builder, value Scope, value Name, value File, value LineNumber,773    value SizeInBits, value AlignInBits, value OffsetInBits, value Flags,774    value DerivedFrom, value Elements, value VTableHolder,775    value TemplateParamsNode, value UniqueIdentifier) {776  LLVMMetadataRef *Temp = from_val_array(Elements);777  LLVMMetadataRef Metadata = LLVMDIBuilderCreateClassType(778      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),779      caml_string_length(Name), Metadata_val(File), Int_val(LineNumber),780      (uint64_t)Int_val(SizeInBits), Int_val(AlignInBits),781      (uint64_t)Int_val(OffsetInBits), DIFlags_val(Flags),782      Metadata_val(DerivedFrom), Temp, Wosize_val(Elements),783      Metadata_val(VTableHolder), Metadata_val(TemplateParamsNode),784      String_val(UniqueIdentifier), caml_string_length(UniqueIdentifier));785  free(Temp);786  return to_val(Metadata);787}788 789value llvm_dibuild_create_class_type_bytecode(value *argv, int arg) {790 791  return llvm_dibuild_create_class_type_native(argv[0],  // Builder792                                               argv[1],  // Scope793                                               argv[2],  // Name794                                               argv[3],  // File795                                               argv[4],  // LineNumber796                                               argv[5],  // SizeInBits797                                               argv[6],  // AlignInBits798                                               argv[7],  // OffsetInBits799                                               argv[8],  // Flags800                                               argv[9],  // DerivedFrom801                                               argv[10], // Elements802                                               argv[11], // VTableHolder803                                               argv[12], // TemplateParamsNode804                                               argv[13]  // UniqueIdentifier805  );806}807 808value llvm_dibuild_create_artificial_type(value Builder, value Type) {809  LLVMMetadataRef Metadata = LLVMDIBuilderCreateArtificialType(810      DIBuilder_val(Builder), Metadata_val(Type));811  return to_val(Metadata);812}813 814value llvm_di_type_get_name(value DType) {815  size_t Len;816  const char *Name = LLVMDITypeGetName(Metadata_val(DType), &Len);817  return cstr_to_string(Name, Len);818}819 820value llvm_di_type_get_size_in_bits(value DType) {821  uint64_t Size = LLVMDITypeGetSizeInBits(Metadata_val(DType));822  return Val_int((int)Size);823}824 825value llvm_di_type_get_offset_in_bits(value DType) {826  uint64_t Size = LLVMDITypeGetOffsetInBits(Metadata_val(DType));827  return Val_int((int)Size);828}829 830value llvm_di_type_get_align_in_bits(value DType) {831  uint32_t Size = LLVMDITypeGetAlignInBits(Metadata_val(DType));832  return Val_int(Size);833}834 835value llvm_di_type_get_line(value DType) {836  unsigned Line = LLVMDITypeGetLine(Metadata_val(DType));837  return Val_int(Line);838}839 840value llvm_di_type_get_flags(value DType) {841  LLVMDIFlags Flags = LLVMDITypeGetFlags(Metadata_val(DType));842  return alloc_diflags(Flags);843}844 845value llvm_get_subprogram(value Func) {846  return ptr_to_option(LLVMGetSubprogram(Value_val(Func)));847}848 849value llvm_set_subprogram(value Func, value SP) {850  LLVMSetSubprogram(Value_val(Func), Metadata_val(SP));851  return Val_unit;852}853 854value llvm_di_subprogram_get_line(value Subprogram) {855  return Val_int(LLVMDISubprogramGetLine(Metadata_val(Subprogram)));856}857 858value llvm_instr_get_debug_loc(value Inst) {859  return ptr_to_option(LLVMInstructionGetDebugLoc(Value_val(Inst)));860}861 862value llvm_instr_set_debug_loc(value Inst, value Loc) {863  LLVMInstructionSetDebugLoc(Value_val(Inst), Metadata_val(Loc));864  return Val_unit;865}866 867value llvm_dibuild_create_constant_value_expression(value Builder,868                                                    value Value) {869  LLVMMetadataRef Metadata = LLVMDIBuilderCreateConstantValueExpression(870      DIBuilder_val(Builder), (uint64_t)Int_val(Value));871  return to_val(Metadata);872}873 874value llvm_dibuild_create_global_variable_expression_native(875    value Builder, value Scope, value Name, value Linkage, value File,876    value Line, value Ty, value LocalToUnit, value Expr, value Decl,877    value AlignInBits) {878  LLVMMetadataRef Metadata = LLVMDIBuilderCreateGlobalVariableExpression(879      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),880      caml_string_length(Name), String_val(Linkage),881      caml_string_length(Linkage), Metadata_val(File), Int_val(Line),882      Metadata_val(Ty), Bool_val(LocalToUnit), Metadata_val(Expr),883      Metadata_val(Decl), Int_val(AlignInBits));884  return to_val(Metadata);885}886 887value llvm_dibuild_create_global_variable_expression_bytecode(value *argv,888                                                              int arg) {889 890  return llvm_dibuild_create_global_variable_expression_native(891      argv[0], // Builder892      argv[1], // Scope893      argv[2], // Name894      argv[3], // Linkage895      argv[4], // File896      argv[5], // Line897      argv[6], // Ty898      argv[7], // LocalToUnit899      argv[8], // Expr900      argv[9], // Decl901      argv[10] // AlignInBits902  );903}904 905value llvm_di_global_variable_expression_get_variable(value GVE) {906  return ptr_to_option(907      LLVMDIGlobalVariableExpressionGetVariable(Metadata_val(GVE)));908}909 910value llvm_di_variable_get_line(value Variable) {911  return Val_int(LLVMDIVariableGetLine(Metadata_val(Variable)));912}913 914value llvm_di_variable_get_file(value Variable) {915  return ptr_to_option(LLVMDIVariableGetFile(Metadata_val(Variable)));916}917 918value llvm_get_metadata_kind(value Metadata) {919  return Val_int(LLVMGetMetadataKind(Metadata_val(Metadata)));920}921 922value llvm_dibuild_create_auto_variable_native(value Builder, value Scope,923                                               value Name, value File,924                                               value Line, value Ty,925                                               value AlwaysPreserve,926                                               value Flags, value AlignInBits) {927  return to_val(LLVMDIBuilderCreateAutoVariable(928      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),929      caml_string_length(Name), Metadata_val(File), Int_val(Line),930      Metadata_val(Ty), Bool_val(AlwaysPreserve), DIFlags_val(Flags),931      Int_val(AlignInBits)));932}933 934value llvm_dibuild_create_auto_variable_bytecode(value *argv, int arg) {935 936  return llvm_dibuild_create_auto_variable_native(argv[0], // Builder937                                                  argv[1], // Scope938                                                  argv[2], // Name939                                                  argv[3], // File940                                                  argv[4], // Line941                                                  argv[5], // Ty942                                                  argv[6], // AlwaysPreserve943                                                  argv[7], // Flags944                                                  argv[8]  // AlignInBits945  );946}947 948value llvm_dibuild_create_parameter_variable_native(949    value Builder, value Scope, value Name, value ArgNo, value File, value Line,950    value Ty, value AlwaysPreserve, value Flags) {951  LLVMMetadataRef Metadata = LLVMDIBuilderCreateParameterVariable(952      DIBuilder_val(Builder), Metadata_val(Scope), String_val(Name),953      caml_string_length(Name), (unsigned)Int_val(ArgNo), Metadata_val(File),954      Int_val(Line), Metadata_val(Ty), Bool_val(AlwaysPreserve),955      DIFlags_val(Flags));956  return to_val(Metadata);957}958 959value llvm_dibuild_create_parameter_variable_bytecode(value *argv, int arg) {960  return llvm_dibuild_create_parameter_variable_native(961      argv[0], // Builder962      argv[1], // Scope963      argv[2], // Name964      argv[3], // ArgNo965      argv[4], // File966      argv[5], // Line967      argv[6], // Ty968      argv[7], // AlwaysPreserve969      argv[8]  // Flags970  );971}972 973value llvm_dibuild_insert_declare_before_native(value Builder, value Storage,974                                                value VarInfo, value Expr,975                                                value DebugLoc, value Instr) {976  LLVMDbgRecordRef Value = LLVMDIBuilderInsertDeclareRecordBefore(977      DIBuilder_val(Builder), Value_val(Storage), Metadata_val(VarInfo),978      Metadata_val(Expr), Metadata_val(DebugLoc), Value_val(Instr));979  return to_val(Value);980}981 982value llvm_dibuild_insert_declare_before_bytecode(value *argv, int arg) {983 984  return llvm_dibuild_insert_declare_before_native(argv[0], // Builder985                                                   argv[1], // Storage986                                                   argv[2], // VarInfo987                                                   argv[3], // Expr988                                                   argv[4], // DebugLoc989                                                   argv[5]  // Instr990  );991}992 993value llvm_dibuild_insert_declare_at_end_native(value Builder, value Storage,994                                                value VarInfo, value Expr,995                                                value DebugLoc, value Block) {996  LLVMDbgRecordRef Value = LLVMDIBuilderInsertDeclareRecordAtEnd(997      DIBuilder_val(Builder), Value_val(Storage), Metadata_val(VarInfo),998      Metadata_val(Expr), Metadata_val(DebugLoc), BasicBlock_val(Block));999  return to_val(Value);1000}1001 1002value llvm_dibuild_insert_declare_at_end_bytecode(value *argv, int arg) {1003  return llvm_dibuild_insert_declare_at_end_native(argv[0], // Builder1004                                                   argv[1], // Storage1005                                                   argv[2], // VarInfo1006                                                   argv[3], // Expr1007                                                   argv[4], // DebugLoc1008                                                   argv[5]  // Block1009  );1010}1011 1012value llvm_dibuild_expression(value Builder, value Addr) {1013  return to_val(LLVMDIBuilderCreateExpression(1014      DIBuilder_val(Builder), (uint64_t *)Op_val(Addr), Wosize_val(Addr)));1015}1016 1017/* llmodule -> bool */1018value llvm_is_new_dbg_info_format(value Module) {1019  return Val_bool(LLVMIsNewDbgInfoFormat(Module_val(Module)));1020}1021 1022/* llmodule -> bool -> unit */1023value llvm_set_is_new_dbg_info_format(value Module, value UseNewFormat) {1024  LLVMSetIsNewDbgInfoFormat(Module_val(Module), Bool_val(UseNewFormat));1025  return Val_unit;1026}1027