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  export_symbols:bool ->
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
232let dibuild_create_debug_location ?(inlined_at = llmetadata_null ()) llctx ~line
233    ~column ~scope =
234  dibuild_create_debug_location_helper llctx line column scope inlined_at
235
236external di_location_get_line : location:Llvm.llmetadata -> int
237  = "llvm_di_location_get_line"
238
239external di_location_get_column : location:Llvm.llmetadata -> int
240  = "llvm_di_location_get_column"
241
242external di_location_get_scope : location:Llvm.llmetadata -> Llvm.llmetadata
243  = "llvm_di_location_get_scope"
244
245external di_location_get_inlined_at :
246  location:Llvm.llmetadata -> Llvm.llmetadata option
247  = "llvm_di_location_get_inlined_at"
248
249external di_scope_get_file : scope:Llvm.llmetadata -> Llvm.llmetadata option
250  = "llvm_di_scope_get_file"
251
252external di_file_get_directory : file:Llvm.llmetadata -> string
253  = "llvm_di_file_get_directory"
254
255external di_file_get_filename : file:Llvm.llmetadata -> string
256  = "llvm_di_file_get_filename"
257
258external di_file_get_source : file:Llvm.llmetadata -> string
259  = "llvm_di_file_get_source"
260
261external dibuild_get_or_create_type_array :
262  lldibuilder -> data:Llvm.llmetadata array -> Llvm.llmetadata
263  = "llvm_dibuild_get_or_create_type_array"
264
265external dibuild_get_or_create_array :
266  lldibuilder -> data:Llvm.llmetadata array -> Llvm.llmetadata
267  = "llvm_dibuild_get_or_create_array"
268
269external dibuild_create_subroutine_type :
270  lldibuilder ->
271  file:Llvm.llmetadata ->
272  param_types:Llvm.llmetadata array ->
273  lldiflags ->
274  Llvm.llmetadata = "llvm_dibuild_create_subroutine_type"
275
276external dibuild_create_enumerator :
277  lldibuilder -> name:string -> value:int -> is_unsigned:bool -> Llvm.llmetadata
278  = "llvm_dibuild_create_enumerator"
279
280external dibuild_create_enumeration_type :
281  lldibuilder ->
282  scope:Llvm.llmetadata ->
283  name:string ->
284  file:Llvm.llmetadata ->
285  line_number:int ->
286  size_in_bits:int ->
287  align_in_bits:int ->
288  elements:Llvm.llmetadata array ->
289  class_ty:Llvm.llmetadata ->
290  Llvm.llmetadata
291  = "llvm_dibuild_create_enumeration_type_bytecode" "llvm_dibuild_create_enumeration_type_native"
292
293external dibuild_create_union_type :
294  lldibuilder ->
295  scope:Llvm.llmetadata ->
296  name:string ->
297  file:Llvm.llmetadata ->
298  line_number:int ->
299  size_in_bits:int ->
300  align_in_bits:int ->
301  lldiflags ->
302  elements:Llvm.llmetadata array ->
303  run_time_language:int ->
304  unique_id:string ->
305  Llvm.llmetadata
306  = "llvm_dibuild_create_union_type_bytecode" "llvm_dibuild_create_union_type_native"
307
308external dibuild_create_array_type :
309  lldibuilder ->
310  size:int ->
311  align_in_bits:int ->
312  ty:Llvm.llmetadata ->
313  subscripts:Llvm.llmetadata array ->
314  Llvm.llmetadata = "llvm_dibuild_create_array_type"
315
316external dibuild_create_vector_type :
317  lldibuilder ->
318  size:int ->
319  align_in_bits:int ->
320  ty:Llvm.llmetadata ->
321  subscripts:Llvm.llmetadata array ->
322  Llvm.llmetadata = "llvm_dibuild_create_array_type"
323
324external dibuild_create_unspecified_type :
325  lldibuilder -> name:string -> Llvm.llmetadata
326  = "llvm_dibuild_create_unspecified_type"
327
328external dibuild_create_basic_type :
329  lldibuilder ->
330  name:string ->
331  size_in_bits:int ->
332  encoding:int ->
333  lldiflags ->
334  Llvm.llmetadata = "llvm_dibuild_create_basic_type"
335
336external dibuild_create_pointer_type :
337  lldibuilder ->
338  pointee_ty:Llvm.llmetadata ->
339  size_in_bits:int ->
340  align_in_bits:int ->
341  address_space:int ->
342  name:string ->
343  Llvm.llmetadata
344  = "llvm_dibuild_create_pointer_type_bytecode" "llvm_dibuild_create_pointer_type_native"
345
346external dibuild_create_struct_type :
347  lldibuilder ->
348  scope:Llvm.llmetadata ->
349  name:string ->
350  file:Llvm.llmetadata ->
351  line_number:int ->
352  size_in_bits:int ->
353  align_in_bits:int ->
354  lldiflags ->
355  derived_from:Llvm.llmetadata ->
356  elements:Llvm.llmetadata array ->
357  DWARFSourceLanguageKind.t ->
358  vtable_holder:Llvm.llmetadata ->
359  unique_id:string ->
360  Llvm.llmetadata
361  = "llvm_dibuild_create_struct_type_bytecode" "llvm_dibuild_create_struct_type_native"
362
363external dibuild_create_member_type :
364  lldibuilder ->
365  scope:Llvm.llmetadata ->
366  name:string ->
367  file:Llvm.llmetadata ->
368  line_number:int ->
369  size_in_bits:int ->
370  align_in_bits:int ->
371  offset_in_bits:int ->
372  lldiflags ->
373  ty:Llvm.llmetadata ->
374  Llvm.llmetadata
375  = "llvm_dibuild_create_member_type_bytecode" "llvm_dibuild_create_member_type_native"
376
377external dibuild_create_static_member_type :
378  lldibuilder ->
379  scope:Llvm.llmetadata ->
380  name:string ->
381  file:Llvm.llmetadata ->
382  line_number:int ->
383  ty:Llvm.llmetadata ->
384  lldiflags ->
385  const_val:Llvm.llvalue ->
386  align_in_bits:int ->
387  Llvm.llmetadata
388  = "llvm_dibuild_create_static_member_type_bytecode" "llvm_dibuild_create_static_member_type_native"
389
390external dibuild_create_member_pointer_type :
391  lldibuilder ->
392  pointee_type:Llvm.llmetadata ->
393  class_type:Llvm.llmetadata ->
394  size_in_bits:int ->
395  align_in_bits:int ->
396  lldiflags ->
397  Llvm.llmetadata
398  = "llvm_dibuild_create_member_pointer_type_bytecode" "llvm_dibuild_create_member_pointer_type_native"
399
400external dibuild_create_object_pointer_type :
401  lldibuilder -> Llvm.llmetadata -> Llvm.llmetadata
402  = "llvm_dibuild_create_object_pointer_type"
403
404external dibuild_create_qualified_type :
405  lldibuilder -> tag:int -> Llvm.llmetadata -> Llvm.llmetadata
406  = "llvm_dibuild_create_qualified_type"
407
408external dibuild_create_reference_type :
409  lldibuilder -> tag:int -> Llvm.llmetadata -> Llvm.llmetadata
410  = "llvm_dibuild_create_reference_type"
411
412external dibuild_create_null_ptr_type : lldibuilder -> Llvm.llmetadata
413  = "llvm_dibuild_create_null_ptr_type"
414
415external dibuild_create_typedef :
416  lldibuilder ->
417  ty:Llvm.llmetadata ->
418  name:string ->
419  file:Llvm.llmetadata ->
420  line_no:int ->
421  scope:Llvm.llmetadata ->
422  align_in_bits:int ->
423  Llvm.llmetadata
424  = "llvm_dibuild_create_typedef_bytecode" "llvm_dibuild_create_typedef_native"
425
426external dibuild_create_inheritance :
427  lldibuilder ->
428  ty:Llvm.llmetadata ->
429  base_ty:Llvm.llmetadata ->
430  base_offset:int ->
431  vb_ptr_offset:int ->
432  lldiflags ->
433  Llvm.llmetadata
434  = "llvm_dibuild_create_inheritance_bytecode" "llvm_dibuild_create_inheritance_native"
435
436external dibuild_create_forward_decl :
437  lldibuilder ->
438  tag:int ->
439  name:string ->
440  scope:Llvm.llmetadata ->
441  file:Llvm.llmetadata ->
442  line:int ->
443  runtime_lang:int ->
444  size_in_bits:int ->
445  align_in_bits:int ->
446  unique_identifier:string ->
447  Llvm.llmetadata
448  = "llvm_dibuild_create_forward_decl_bytecode" "llvm_dibuild_create_forward_decl_native"
449
450external dibuild_create_replaceable_composite_type :
451  lldibuilder ->
452  tag:int ->
453  name:string ->
454  scope:Llvm.llmetadata ->
455  file:Llvm.llmetadata ->
456  line:int ->
457  runtime_lang:int ->
458  size_in_bits:int ->
459  align_in_bits:int ->
460  lldiflags ->
461  unique_identifier:string ->
462  Llvm.llmetadata
463  = "llvm_dibuild_create_replaceable_composite_type_bytecode" "llvm_dibuild_create_replaceable_composite_type_native"
464
465external dibuild_create_bit_field_member_type :
466  lldibuilder ->
467  scope:Llvm.llmetadata ->
468  name:string ->
469  file:Llvm.llmetadata ->
470  line_num:int ->
471  size_in_bits:int ->
472  offset_in_bits:int ->
473  storage_offset_in_bits:int ->
474  lldiflags ->
475  ty:Llvm.llmetadata ->
476  Llvm.llmetadata
477  = "llvm_dibuild_create_bit_field_member_type_bytecode" "llvm_dibuild_create_bit_field_member_type_native"
478
479external dibuild_create_class_type :
480  lldibuilder ->
481  scope:Llvm.llmetadata ->
482  name:string ->
483  file:Llvm.llmetadata ->
484  line_number:int ->
485  size_in_bits:int ->
486  align_in_bits:int ->
487  offset_in_bits:int ->
488  lldiflags ->
489  derived_from:Llvm.llmetadata ->
490  elements:Llvm.llmetadata array ->
491  vtable_holder:Llvm.llmetadata ->
492  template_params_node:Llvm.llmetadata ->
493  unique_identifier:string ->
494  Llvm.llmetadata
495  = "llvm_dibuild_create_class_type_bytecode" "llvm_dibuild_create_class_type_native"
496
497external dibuild_create_artificial_type :
498  lldibuilder -> ty:Llvm.llmetadata -> Llvm.llmetadata
499  = "llvm_dibuild_create_artificial_type"
500
501external di_type_get_name : Llvm.llmetadata -> string = "llvm_di_type_get_name"
502
503external di_type_get_size_in_bits : Llvm.llmetadata -> int
504  = "llvm_di_type_get_size_in_bits"
505
506external di_type_get_offset_in_bits : Llvm.llmetadata -> int
507  = "llvm_di_type_get_offset_in_bits"
508
509external di_type_get_align_in_bits : Llvm.llmetadata -> int
510  = "llvm_di_type_get_align_in_bits"
511
512external di_type_get_line : Llvm.llmetadata -> int = "llvm_di_type_get_line"
513
514external di_type_get_flags : Llvm.llmetadata -> lldiflags
515  = "llvm_di_type_get_flags"
516
517external get_subprogram : Llvm.llvalue -> Llvm.llmetadata option
518  = "llvm_get_subprogram"
519
520external set_subprogram : Llvm.llvalue -> Llvm.llmetadata -> unit
521  = "llvm_set_subprogram"
522
523external di_subprogram_get_line : Llvm.llmetadata -> int
524  = "llvm_di_subprogram_get_line"
525
526external instr_get_debug_loc : Llvm.llvalue -> Llvm.llmetadata option
527  = "llvm_instr_get_debug_loc"
528
529external instr_set_debug_loc_helper : Llvm.llvalue -> Llvm.llmetadata -> unit
530  = "llvm_instr_set_debug_loc"
531
532let instr_set_debug_loc i mopt =
533  match mopt with
534  | None -> instr_set_debug_loc_helper i (llmetadata_null ())
535  | Some m -> instr_set_debug_loc_helper i m
536
537external dibuild_create_constant_value_expression :
538  lldibuilder -> int -> Llvm.llmetadata
539  = "llvm_dibuild_create_constant_value_expression"
540
541external dibuild_create_global_variable_expression :
542  lldibuilder ->
543  scope:Llvm.llmetadata ->
544  name:string ->
545  linkage:string ->
546  file:Llvm.llmetadata ->
547  line:int ->
548  ty:Llvm.llmetadata ->
549  is_local_to_unit:bool ->
550  expr:Llvm.llmetadata ->
551  decl:Llvm.llmetadata ->
552  align_in_bits:int ->
553  Llvm.llmetadata
554  = "llvm_dibuild_create_global_variable_expression_bytecode" "llvm_dibuild_create_global_variable_expression_native"
555
556external di_global_variable_expression_get_variable :
557  Llvm.llmetadata -> Llvm.llmetadata option
558  = "llvm_di_global_variable_expression_get_variable"
559
560external di_variable_get_line : Llvm.llmetadata -> int
561  = "llvm_di_variable_get_line"
562
563external di_variable_get_file : Llvm.llmetadata -> Llvm.llmetadata option
564  = "llvm_di_variable_get_file"
565
566external get_metadata_kind : Llvm.llmetadata -> MetadataKind.t
567  = "llvm_get_metadata_kind"
568