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