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