1(*===-- llvm_debuginfo.ml - LLVM OCaml Interface --------------*- OCaml -*-===* 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===----------------------------------------------------------------------===*) 8 9type lldibuilder 10 11(** Source languages known by DWARF. *) 12module DWARFSourceLanguageKind = struct 13 type t = 14 | C89 15 | C 16 | Ada83 17 | C_plus_plus 18 | Cobol74 19 | Cobol85 20 | Fortran77 21 | Fortran90 22 | Pascal83 23 | Modula2 24 (* New in DWARF v3: *) 25 | LLVMJava 26 | C99 27 | Ada95 28 | Fortran95 29 | PLI 30 | ObjC 31 | ObjC_plus_plus 32 | UPC 33 | D 34 (* New in DWARF v4: *) 35 | LLVMPython 36 (* New in DWARF v5: *) 37 | LLVMOpenCL 38 | Go 39 | Modula3 40 | Haskell 41 | C_plus_plus_03 42 | C_plus_plus_11 43 | OCaml 44 | Rust 45 | C11 46 | Swift 47 | Julia 48 | Dylan 49 | C_plus_plus_14 50 | Fortran03 51 | Fortran08 52 | RenderScript 53 | BLISS 54 (* Vendor extensions: *) 55 | LLVMMips_Assembler 56 | GOOGLE_RenderScript 57 | BORLAND_Delphi 58end 59 60module DIFlag = struct 61 type t = 62 | Zero 63 | Private 64 | Protected 65 | Public 66 | FwdDecl 67 | AppleBlock 68 | ReservedBit4 69 | Virtual 70 | Artificial 71 | Explicit 72 | Prototyped 73 | ObjcClassComplete 74 | ObjectPointer 75 | Vector 76 | StaticMember 77 | LValueReference 78 | RValueReference 79 | Reserved 80 | SingleInheritance 81 | MultipleInheritance 82 | VirtualInheritance 83 | IntroducedVirtual 84 | BitField 85 | NoReturn 86 | TypePassByValue 87 | TypePassByReference 88 | EnumClass 89 | FixedEnum 90 | Thunk 91 | NonTrivial 92 | BigEndian 93 | LittleEndian 94 | IndirectVirtualBase 95 | Accessibility 96 | PtrToMemberRep 97end 98 99type lldiflags 100 101external diflags_get : DIFlag.t -> lldiflags = "llvm_diflags_get" 102 103external diflags_set : lldiflags -> DIFlag.t -> lldiflags = "llvm_diflags_set" 104 105external diflags_test : lldiflags -> DIFlag.t -> bool = "llvm_diflags_test" 106 107(** The kind of metadata nodes. *) 108module MetadataKind = struct 109 type t = 110 | MDStringMetadataKind 111 | ConstantAsMetadataMetadataKind 112 | LocalAsMetadataMetadataKind 113 | DistinctMDOperandPlaceholderMetadataKind 114 | MDTupleMetadataKind 115 | DILocationMetadataKind 116 | DIExpressionMetadataKind 117 | DIGlobalVariableExpressionMetadataKind 118 | GenericDINodeMetadataKind 119 | DISubrangeMetadataKind 120 | DIEnumeratorMetadataKind 121 | DIBasicTypeMetadataKind 122 | DIDerivedTypeMetadataKind 123 | DICompositeTypeMetadataKind 124 | DISubroutineTypeMetadataKind 125 | DIFileMetadataKind 126 | DICompileUnitMetadataKind 127 | DISubprogramMetadataKind 128 | DILexicalBlockMetadataKind 129 | DILexicalBlockFileMetadataKind 130 | DINamespaceMetadataKind 131 | DIModuleMetadataKind 132 | DITemplateTypeParameterMetadataKind 133 | DITemplateValueParameterMetadataKind 134 | DIGlobalVariableMetadataKind 135 | DILocalVariableMetadataKind 136 | DILabelMetadataKind 137 | DIObjCPropertyMetadataKind 138 | DIImportedEntityMetadataKind 139 | DIMacroMetadataKind 140 | DIMacroFileMetadataKind 141 | DICommonBlockMetadataKind 142end 143 144(** The amount of debug information to emit. *) 145module DWARFEmissionKind = struct 146 type t = None | Full | LineTablesOnly 147end 148 149external debug_metadata_version : unit -> int = "llvm_debug_metadata_version" 150 151external get_module_debug_metadata_version : Llvm.llmodule -> int 152 = "llvm_get_module_debug_metadata_version" 153 154external dibuilder : Llvm.llmodule -> lldibuilder = "llvm_dibuilder" 155 156external dibuild_finalize : lldibuilder -> unit = "llvm_dibuild_finalize" 157 158(* See LLVMDIBuilderCreateCompileUnit for argument details. *) 159external dibuild_create_compile_unit : 160 lldibuilder -> 161 DWARFSourceLanguageKind.t -> 162 file_ref:Llvm.llmetadata -> 163 producer:string -> 164 is_optimized:bool -> 165 flags:string -> 166 runtime_ver:int -> 167 split_name:string -> 168 DWARFEmissionKind.t -> 169 dwoid:int -> 170 di_inlining:bool -> 171 di_profiling:bool -> 172 sys_root:string -> 173 sdk:string -> 174 Llvm.llmetadata 175 = "llvm_dibuild_create_compile_unit_bytecode" "llvm_dibuild_create_compile_unit_native" 176 177external dibuild_create_file : 178 lldibuilder -> filename:string -> directory:string -> Llvm.llmetadata 179 = "llvm_dibuild_create_file" 180 181external dibuild_create_module : 182 lldibuilder -> 183 parent_ref:Llvm.llmetadata -> 184 name:string -> 185 config_macros:string -> 186 include_path:string -> 187 sys_root:string -> 188 Llvm.llmetadata 189 = "llvm_dibuild_create_module_bytecode" "llvm_dibuild_create_module_native" 190 191external dibuild_create_namespace : 192 lldibuilder -> 193 parent_ref:Llvm.llmetadata -> 194 name:string -> 195 bool:string -> 196 Llvm.llmetadata = "llvm_dibuild_create_namespace" 197 198external dibuild_create_function : 199 lldibuilder -> 200 scope:Llvm.llmetadata -> 201 name:string -> 202 linkage_name:string -> 203 file:Llvm.llmetadata -> 204 line_no:int -> 205 ty:Llvm.llmetadata -> 206 is_local_to_unit:bool -> 207 is_definition:bool -> 208 scope_line:int -> 209 flags:lldiflags -> 210 is_optimized:bool -> 211 Llvm.llmetadata 212 = "llvm_dibuild_create_function_bytecode" "llvm_dibuild_create_function_native" 213 214external dibuild_create_lexical_block : 215 lldibuilder -> 216 scope:Llvm.llmetadata -> 217 file:Llvm.llmetadata -> 218 line:int -> 219 column:int -> 220 Llvm.llmetadata = "llvm_dibuild_create_lexical_block" 221 222external dibuild_create_debug_location_helper : 223 Llvm.llcontext -> 224 line:int -> 225 column:int -> 226 scope:Llvm.llmetadata -> 227 inlined_at:Llvm.llmetadata -> 228 Llvm.llmetadata = "llvm_dibuild_create_debug_location" 229 230external llmetadata_null : unit -> Llvm.llmetadata = "llvm_metadata_null" 231(** [llmetadata_null ()] llmetadata is a wrapper around "llvm::Metadata *". 232 This function returns a nullptr valued llmetadata. For example, 233 it can be useful to pass NULL to LLVMInstructionSetDebugLoc. *) 234 235let dibuild_create_debug_location ?(inlined_at = llmetadata_null ()) llctx ~line 236 ~column ~scope = 237 dibuild_create_debug_location_helper llctx line column scope inlined_at 238 239external di_location_get_line : location:Llvm.llmetadata -> int 240 = "llvm_di_location_get_line" 241 242external di_location_get_column : location:Llvm.llmetadata -> int 243 = "llvm_di_location_get_column" 244 245external di_location_get_scope : location:Llvm.llmetadata -> Llvm.llmetadata 246 = "llvm_di_location_get_scope" 247 248external di_location_get_inlined_at : 249 location:Llvm.llmetadata -> Llvm.llmetadata option 250 = "llvm_di_location_get_inlined_at" 251 252external di_scope_get_file : scope:Llvm.llmetadata -> Llvm.llmetadata option 253 = "llvm_di_scope_get_file" 254 255external di_file_get_directory : file:Llvm.llmetadata -> string 256 = "llvm_di_file_get_directory" 257 258external di_file_get_filename : file:Llvm.llmetadata -> string 259 = "llvm_di_file_get_filename" 260 261external di_file_get_source : file:Llvm.llmetadata -> string 262 = "llvm_di_file_get_source" 263 264external dibuild_get_or_create_type_array : 265 lldibuilder -> data:Llvm.llmetadata array -> Llvm.llmetadata 266 = "llvm_dibuild_get_or_create_type_array" 267 268external dibuild_create_subroutine_type : 269 lldibuilder -> 270 file:Llvm.llmetadata -> 271 param_types:Llvm.llmetadata array -> 272 lldiflags -> 273 Llvm.llmetadata = "llvm_dibuild_create_subroutine_type" 274 275external dibuild_create_enumerator : 276 lldibuilder -> name:string -> value:int -> is_unsigned:bool -> Llvm.llmetadata 277 = "llvm_dibuild_create_enumerator" 278 279external dibuild_create_enumeration_type : 280 lldibuilder -> 281 scope:Llvm.llmetadata -> 282 name:string -> 283 file:Llvm.llmetadata -> 284 line_number:int -> 285 size_in_bits:int -> 286 align_in_bits:int -> 287 elements:Llvm.llmetadata array -> 288 class_ty:Llvm.llmetadata -> 289 Llvm.llmetadata 290 = "llvm_dibuild_create_enumeration_type_native" "llvm_dibuild_create_enumeration_type_bytecode" 291 292external dibuild_create_union_type : 293 lldibuilder -> 294 scope:Llvm.llmetadata -> 295 name:string -> 296 file:Llvm.llmetadata -> 297 line_number:int -> 298 size_in_bits:int -> 299 align_in_bits:int -> 300 lldiflags -> 301 elements:Llvm.llmetadata array -> 302 run_time_language:int -> 303 unique_id:string -> 304 Llvm.llmetadata 305 = "llvm_dibuild_create_union_type_native" "llvm_dibuild_create_union_type_bytecode" 306 307external dibuild_create_array_type : 308 lldibuilder -> 309 size:int -> 310 align_in_bits:int -> 311 ty:Llvm.llmetadata -> 312 subscripts:Llvm.llmetadata array -> 313 Llvm.llmetadata = "llvm_dibuild_create_array_type" 314 315external dibuild_create_vector_type : 316 lldibuilder -> 317 size:int -> 318 align_in_bits:int -> 319 ty:Llvm.llmetadata -> 320 subscripts:Llvm.llmetadata array -> 321 Llvm.llmetadata = "llvm_dibuild_create_array_type" 322 323external dibuild_create_unspecified_type : 324 lldibuilder -> name:string -> Llvm.llmetadata 325 = "llvm_dibuild_create_unspecified_type" 326 327external dibuild_create_basic_type : 328 lldibuilder -> 329 name:string -> 330 size_in_bits:int -> 331 encoding:int -> 332 lldiflags -> 333 Llvm.llmetadata = "llvm_dibuild_create_basic_type" 334 335external dibuild_create_pointer_type : 336 lldibuilder -> 337 pointee_ty:Llvm.llmetadata -> 338 size_in_bits:int -> 339 align_in_bits:int -> 340 address_space:int -> 341 name:string -> 342 Llvm.llmetadata 343 = "llvm_dibuild_create_pointer_type_native" "llvm_dibuild_create_pointer_type_bytecode" 344 345external dibuild_create_struct_type : 346 lldibuilder -> 347 scope:Llvm.llmetadata -> 348 name:string -> 349 file:Llvm.llmetadata -> 350 line_number:int -> 351 size_in_bits:int -> 352 align_in_bits:int -> 353 lldiflags -> 354 derived_from:Llvm.llmetadata -> 355 elements:Llvm.llmetadata array -> 356 run_time_lang:int -> 357 vtable_holder:Llvm.llmetadata -> 358 unique_id:string -> 359 Llvm.llmetadata 360 = "llvm_dibuild_create_struct_type_native" "llvm_dibuild_create_struct_type_bytecode" 361 362external dibuild_create_member_type : 363 lldibuilder -> 364 scope:Llvm.llmetadata -> 365 name:string -> 366 file:Llvm.llmetadata -> 367 line_number:int -> 368 size_in_bits:int -> 369 align_in_bits:int -> 370 offset_in_bits:int -> 371 lldiflags -> 372 ty:Llvm.llmetadata -> 373 Llvm.llmetadata 374 = "llvm_dibuild_create_member_type_native" "llvm_dibuild_create_member_type_bytecode" 375 376external dibuild_create_static_member_type : 377 lldibuilder -> 378 scope:Llvm.llmetadata -> 379 name:string -> 380 file:Llvm.llmetadata -> 381 line_number:int -> 382 ty:Llvm.llmetadata -> 383 lldiflags -> 384 const_val:Llvm.llvalue -> 385 align_in_bits:int -> 386 Llvm.llmetadata 387 = "llvm_dibuild_create_static_member_type_native" "llvm_dibuild_create_static_member_type_bytecode" 388 389external dibuild_create_member_pointer_type : 390 lldibuilder -> 391 pointee_type:Llvm.llmetadata -> 392 class_type:Llvm.llmetadata -> 393 size_in_bits:int -> 394 align_in_bits:int -> 395 lldiflags -> 396 Llvm.llmetadata 397 = "llvm_dibuild_create_member_pointer_type_native" "llvm_dibuild_create_member_pointer_type_bytecode" 398 399external dibuild_create_object_pointer_type : 400 lldibuilder -> Llvm.llmetadata -> Llvm.llmetadata 401 = "llvm_dibuild_create_object_pointer_type" 402 403external dibuild_create_qualified_type : 404 lldibuilder -> tag:int -> Llvm.llmetadata -> Llvm.llmetadata 405 = "llvm_dibuild_create_qualified_type" 406 407external dibuild_create_reference_type : 408 lldibuilder -> tag:int -> Llvm.llmetadata -> Llvm.llmetadata 409 = "llvm_dibuild_create_reference_type" 410 411external dibuild_create_null_ptr_type : lldibuilder -> Llvm.llmetadata 412 = "llvm_dibuild_create_null_ptr_type" 413 414external dibuild_create_typedef : 415 lldibuilder -> 416 ty:Llvm.llmetadata -> 417 name:string -> 418 file:Llvm.llmetadata -> 419 line_no:int -> 420 scope:Llvm.llmetadata -> 421 align_in_bits:int -> 422 Llvm.llmetadata 423 = "llvm_dibuild_create_typedef_native" "llvm_dibuild_create_typedef_bytecode" 424 425external dibuild_create_inheritance_native : 426 lldibuilder -> 427 ty:Llvm.llmetadata -> 428 base_ty:Llvm.llmetadata -> 429 base_offset:int -> 430 vb_ptr_offset:int -> 431 lldiflags -> 432 Llvm.llmetadata 433 = "llvm_dibuild_create_inheritance_native" "llvm_dibuild_create_inheritance_bytecode" 434 435external dibuild_create_forward_decl : 436 lldibuilder -> 437 tag:int -> 438 name:string -> 439 scope:Llvm.llmetadata -> 440 file:Llvm.llmetadata -> 441 line:int -> 442 runtime_lang:int -> 443 size_in_bits:int -> 444 align_in_bits:int -> 445 unique_identifier:string -> 446 Llvm.llmetadata 447 = "llvm_dibuild_create_forward_decl_native" "llvm_dibuild_create_forward_decl_bytecode" 448 449external dibuild_create_replaceable_composite_type : 450 lldibuilder -> 451 tag:int -> 452 name:string -> 453 scope:Llvm.llmetadata -> 454 file:Llvm.llmetadata -> 455 line:int -> 456 runtime_lang:int -> 457 size_in_bits:int -> 458 align_in_bits:int -> 459 lldiflags -> 460 unique_identifier:string -> 461 Llvm.llmetadata 462 = "llvm_dibuild_create_replaceable_composite_type_native" "llvm_dibuild_create_replaceable_composite_type_bytecode" 463 464external dibuild_create_bit_field_member_type : 465 lldibuilder -> 466 scope:Llvm.llmetadata -> 467 name:string -> 468 file:Llvm.llmetadata -> 469 line_num:int -> 470 size_in_bits:int -> 471 offset_in_bits:int -> 472 storage_offset_in_bits:int -> 473 lldiflags -> 474 ty:Llvm.llmetadata -> 475 Llvm.llmetadata 476 = "llvm_dibuild_create_bit_field_member_type_native" "llvm_dibuild_create_bit_field_member_type_bytecode" 477 478external dibuild_create_class_type : 479 lldibuilder -> 480 scope:Llvm.llmetadata -> 481 name:string -> 482 file:Llvm.llmetadata -> 483 line_number:int -> 484 size_in_bits:int -> 485 align_in_bits:int -> 486 offset_in_bits:int -> 487 lldiflags -> 488 derived_from:Llvm.llmetadata -> 489 elements:Llvm.llmetadata array -> 490 vtable_holder:Llvm.llmetadata -> 491 template_params_node:Llvm.llmetadata -> 492 unique_identifier:string -> 493 Llvm.llmetadata 494 = "llvm_dibuild_create_class_type_native" "llvm_dibuild_create_class_type_bytecode" 495 496external dibuild_create_artificial_type : 497 lldibuilder -> ty:Llvm.llmetadata -> Llvm.llmetadata 498 = "llvm_dibuild_create_artificial_type" 499 500external di_type_get_name : Llvm.llmetadata -> string = "llvm_di_type_get_name" 501 502external di_type_get_size_in_bits : Llvm.llmetadata -> int 503 = "llvm_di_type_get_size_in_bits" 504 505external di_type_get_offset_in_bits : Llvm.llmetadata -> int 506 = "llvm_di_type_get_offset_in_bits" 507 508external di_type_get_align_in_bits : Llvm.llmetadata -> int 509 = "llvm_di_type_get_align_in_bits" 510 511external di_type_get_line : Llvm.llmetadata -> int = "llvm_di_type_get_line" 512 513external di_type_get_flags : Llvm.llmetadata -> lldiflags 514 = "llvm_di_type_get_flags" 515 516external get_subprogram : Llvm.llvalue -> Llvm.llmetadata option 517 = "llvm_get_subprogram" 518 519external set_subprogram : Llvm.llvalue -> Llvm.llmetadata -> unit 520 = "llvm_set_subprogram" 521 522external di_subprogram_get_line : Llvm.llmetadata -> int 523 = "llvm_di_subprogram_get_line" 524 525external instr_get_debug_loc : Llvm.llvalue -> Llvm.llmetadata option 526 = "llvm_instr_get_debug_loc" 527 528external instr_set_debug_loc_helper : Llvm.llvalue -> Llvm.llmetadata -> unit 529 = "llvm_instr_set_debug_loc" 530 531let instr_set_debug_loc i mopt = 532 match mopt with 533 | None -> instr_set_debug_loc_helper i (llmetadata_null ()) 534 | Some m -> instr_set_debug_loc_helper i m 535 536external di_global_variable_expression_get_variable : 537 Llvm.llmetadata -> Llvm.llmetadata option 538 = "llvm_di_global_variable_expression_get_variable" 539 540external di_variable_get_line : Llvm.llmetadata -> int 541 = "llvm_di_variable_get_line" 542 543external di_variable_get_file : Llvm.llmetadata -> Llvm.llmetadata option 544 = "llvm_di_variable_get_file" 545 546external get_metadata_kind : Llvm.llmetadata -> MetadataKind.t 547 = "llvm_get_metadata_kind" 548