472 lines · plain
1(* RUN: rm -rf %t && mkdir -p %t && cp %s %t/debuginfo.ml && cp %S/Utils/Testsuite.ml %t/Testsuite.ml2 * RUN: %ocamlc -g -w +A -package llvm.all_backends -package llvm.target -package llvm.analysis -package llvm.debuginfo -I %t/ -linkpkg %t/Testsuite.ml %t/debuginfo.ml -o %t/executable3 * RUN: %t/executable | FileCheck %s4 * RUN: %ocamlopt -g -w +A -package llvm.all_backends -package llvm.target -package llvm.analysis -package llvm.debuginfo -I %t/ -linkpkg %t/Testsuite.ml %t/debuginfo.ml -o %t/executable5 * RUN: %t/executable | FileCheck %s6 * XFAIL: vg_leak7 *)8 9open Testsuite10 11let context = Llvm.global_context ()12 13let filename = "di_test_file"14 15let directory = "di_test_dir"16 17let module_name = "di_test_module"18 19let null_metadata = Llvm_debuginfo.llmetadata_null ()20 21let string_of_metadata md =22 Llvm.string_of_llvalue (Llvm.metadata_as_value context md)23 24let stdout_metadata md = Printf.printf "%s\n" (string_of_metadata md)25 26let prepare_target llmod =27 Llvm_all_backends.initialize ();28 let triple = Llvm_target.Target.default_triple () in29 let lltarget = Llvm_target.Target.by_triple triple in30 let llmachine = Llvm_target.TargetMachine.create ~triple lltarget in31 let lldly =32 Llvm_target.DataLayout.as_string33 (Llvm_target.TargetMachine.data_layout llmachine)34 in35 let _ = Llvm.set_target_triple triple llmod in36 let _ = Llvm.set_data_layout lldly llmod in37 ()38 39let new_module () =40 let m = Llvm.create_module context module_name in41 let () = prepare_target m in42 let () = Llvm_debuginfo.set_is_new_dbg_info_format m true in43 insist (Llvm_debuginfo.is_new_dbg_info_format m);44 m45 46let test_get_module () =47 group "module_level_tests";48 let m = new_module () in49 let cur_ver = Llvm_debuginfo.debug_metadata_version () in50 insist (cur_ver > 0);51 let m_ver = Llvm_debuginfo.get_module_debug_metadata_version m in52 (* We haven't added any debug info to the module *)53 insist (m_ver = 0);54 let dibuilder = Llvm_debuginfo.dibuilder m in55 let di_version_key = "Debug Info Version" in56 let ver =57 Llvm.value_as_metadata @@ Llvm.const_int (Llvm.i32_type context) cur_ver58 in59 let () =60 Llvm.add_module_flag m Llvm.ModuleFlagBehavior.Warning di_version_key ver61 in62 let file_di =63 Llvm_debuginfo.dibuild_create_file dibuilder ~filename ~directory64 in65 stdout_metadata file_di;66 (* CHECK: [[FILE_PTR:<0x[0-9a-f]*>]] = !DIFile(filename: "di_test_file", directory: "di_test_dir")67 *)68 insist69 ( Llvm_debuginfo.di_file_get_filename ~file:file_di = filename70 && Llvm_debuginfo.di_file_get_directory ~file:file_di = directory );71 insist72 ( Llvm_debuginfo.get_metadata_kind file_di73 = Llvm_debuginfo.MetadataKind.DIFileMetadataKind );74 let cu_di =75 Llvm_debuginfo.dibuild_create_compile_unit dibuilder76 Llvm_debuginfo.DWARFSourceLanguageKind.C89 ~file_ref:file_di77 ~producer:"TestGen" ~is_optimized:false ~flags:"" ~runtime_ver:078 ~split_name:"" Llvm_debuginfo.DWARFEmissionKind.LineTablesOnly ~dwoid:079 ~di_inlining:false ~di_profiling:false ~sys_root:"" ~sdk:""80 in81 stdout_metadata cu_di;82 (* CHECK: [[CMPUNIT_PTR:<0x[0-9a-f]*>]] = distinct !DICompileUnit(language: DW_LANG_C89, file: [[FILE_PTR]], producer: "TestGen", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false)83 *)84 insist85 ( Llvm_debuginfo.get_metadata_kind cu_di86 = Llvm_debuginfo.MetadataKind.DICompileUnitMetadataKind );87 let m_di =88 Llvm_debuginfo.dibuild_create_module dibuilder ~parent_ref:cu_di89 ~name:module_name ~config_macros:"" ~include_path:"" ~sys_root:""90 in91 insist92 ( Llvm_debuginfo.get_metadata_kind m_di93 = Llvm_debuginfo.MetadataKind.DIModuleMetadataKind );94 insist (Llvm_debuginfo.get_module_debug_metadata_version m = cur_ver);95 stdout_metadata m_di;96 (* CHECK: [[MODULE_PTR:<0x[0-9a-f]*>]] = !DIModule(scope: null, name: "di_test_module")97 *)98 (m, dibuilder, file_di, m_di)99 100let flags_zero = Llvm_debuginfo.diflags_get Llvm_debuginfo.DIFlag.Zero101 102let int_ty_di bits dibuilder =103 Llvm_debuginfo.dibuild_create_basic_type dibuilder ~name:"int"104 ~size_in_bits:bits ~encoding:0x05105 (* llvm::dwarf::DW_ATE_signed *) flags_zero106 107let test_get_function m dibuilder file_di m_di =108 group "function_level_tests";109 110 (* Create a function of type "void foo (int)". *)111 let int_ty_di = int_ty_di 32 dibuilder in112 stdout_metadata int_ty_di;113 (* CHECK: [[INT32_PTR:<0x[0-9a-f]*>]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)114 *)115 let int_ptr_ty_di =116 Llvm_debuginfo.dibuild_create_pointer_type dibuilder117 ~pointee_ty:int_ty_di118 ~size_in_bits:32119 ~align_in_bits:32120 ~address_space:0121 ~name:"ptrint"122 in123 stdout_metadata int_ptr_ty_di;124 (* CHECK: [[PTRINT32_PTR:<0x[0-9a-f]*>]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "ptrint", baseType: [[INT32_PTR]], size: 32, align: 32, dwarfAddressSpace: 0)125 *)126 let param_types = [| null_metadata; int_ty_di; int_ptr_ty_di |] in127 let fty_di =128 Llvm_debuginfo.dibuild_create_subroutine_type dibuilder ~file:file_di129 ~param_types flags_zero130 in131 insist132 ( Llvm_debuginfo.get_metadata_kind fty_di133 = Llvm_debuginfo.MetadataKind.DISubroutineTypeMetadataKind );134 (* To be able to print and verify the type array of the subroutine type,135 * since we have no way to access it from fty_di, we build it again. *)136 let fty_di_args =137 Llvm_debuginfo.dibuild_get_or_create_type_array dibuilder ~data:param_types138 in139 stdout_metadata fty_di_args;140 (* CHECK: [[FARGS_PTR:<0x[0-9a-f]*>]] = !{null, [[INT32_PTR]], [[PTRINT32_PTR]]}141 *)142 stdout_metadata fty_di;143 (* CHECK: [[SBRTNTY_PTR:<0x[0-9a-f]*>]] = !DISubroutineType(types: [[FARGS_PTR]])144 *)145 (* Let's create the LLVM-IR function now. *)146 let name = "tfun" in147 let fty =148 Llvm.function_type (Llvm.void_type context)149 [| Llvm.i32_type context; Llvm.pointer_type context |]150 in151 let f = Llvm.define_function name fty m in152 let f_di =153 Llvm_debuginfo.dibuild_create_function dibuilder ~scope:m_di ~name154 ~linkage_name:name ~file:file_di ~line_no:10 ~ty:fty_di155 ~is_local_to_unit:false ~is_definition:true ~scope_line:10156 ~flags:flags_zero ~is_optimized:false157 in158 stdout_metadata f_di;159 (* CHECK: [[SBPRG_PTR:<0x[0-9a-f]*>]] = distinct !DISubprogram(name: "tfun", linkageName: "tfun", scope: [[MODULE_PTR]], file: [[FILE_PTR]], line: 10, type: [[SBRTNTY_PTR]], scopeLine: 10, spFlags: DISPFlagDefinition, unit: [[CMPUNIT_PTR]])160 *)161 Llvm_debuginfo.set_subprogram f f_di;162 ( match Llvm_debuginfo.get_subprogram f with163 | Some f_di' -> insist (f_di = f_di')164 | None -> insist false );165 insist166 ( Llvm_debuginfo.get_metadata_kind f_di167 = Llvm_debuginfo.MetadataKind.DISubprogramMetadataKind );168 insist (Llvm_debuginfo.di_subprogram_get_line f_di = 10);169 (fty, f, f_di)170 171let test_bbinstr fty f f_di file_di dibuilder =172 group "basic_block and instructions tests";173 (* Create this pattern:174 * if (arg0 != 0) {175 * foo(arg0, arg1);176 * }177 * return;178 *)179 let arg0 = (Llvm.params f).(0) in180 let arg1 = (Llvm.params f).(1) in181 let builder = Llvm.builder_at_end context (Llvm.entry_block f) in182 let zero = Llvm.const_int (Llvm.i32_type context) 0 in183 let cmpi = Llvm.build_icmp Llvm.Icmp.Ne zero arg0 "cmpi" builder in184 let truebb = Llvm.append_block context "truebb" f in185 let falsebb = Llvm.append_block context "falsebb" f in186 let _ = Llvm.build_cond_br cmpi truebb falsebb builder in187 let foodecl = Llvm.declare_function "foo" fty (Llvm.global_parent f) in188 let _ =189 Llvm.position_at_end truebb builder;190 let scope =191 Llvm_debuginfo.dibuild_create_lexical_block dibuilder ~scope:f_di192 ~file:file_di ~line:9 ~column:4193 in194 let file_of_f_di = Llvm_debuginfo.di_scope_get_file ~scope:f_di in195 let file_of_scope = Llvm_debuginfo.di_scope_get_file ~scope in196 insist197 ( match (file_of_f_di, file_of_scope) with198 | Some file_of_f_di', Some file_of_scope' ->199 file_of_f_di' = file_di && file_of_scope' = file_di200 | _ -> false );201 let foocall = Llvm.build_call fty foodecl [| arg0; arg1 |] "" builder in202 let foocall_loc =203 Llvm_debuginfo.dibuild_create_debug_location context ~line:10 ~column:12204 ~scope205 in206 Llvm_debuginfo.instr_set_debug_loc foocall (Some foocall_loc);207 insist208 ( match Llvm_debuginfo.instr_get_debug_loc foocall with209 | Some foocall_loc' -> foocall_loc' = foocall_loc210 | None -> false );211 stdout_metadata scope;212 (* CHECK: [[BLOCK_PTR:<0x[0-9a-f]*>]] = distinct !DILexicalBlock(scope: [[SBPRG_PTR]], file: [[FILE_PTR]], line: 9, column: 4)213 *)214 stdout_metadata foocall_loc;215 (* CHECK: !DILocation(line: 10, column: 12, scope: [[BLOCK_PTR]])216 *)217 insist218 ( Llvm_debuginfo.di_location_get_scope ~location:foocall_loc = scope219 && Llvm_debuginfo.di_location_get_line ~location:foocall_loc = 10220 && Llvm_debuginfo.di_location_get_column ~location:foocall_loc = 12 );221 insist222 ( Llvm_debuginfo.get_metadata_kind foocall_loc223 = Llvm_debuginfo.MetadataKind.DILocationMetadataKind224 && Llvm_debuginfo.get_metadata_kind scope225 = Llvm_debuginfo.MetadataKind.DILexicalBlockMetadataKind );226 Llvm.build_br falsebb builder227 in228 let _ =229 Llvm.position_at_end falsebb builder;230 Llvm.build_ret_void builder231 in232 (* Printf.printf "%s\n" (Llvm.string_of_llmodule (Llvm.global_parent f)); *)233 ()234 235let test_global_variable_expression dibuilder f_di m_di =236 group "global variable expression tests";237 let cexpr_di =238 Llvm_debuginfo.dibuild_create_constant_value_expression dibuilder 0239 in240 stdout_metadata cexpr_di;241 (* CHECK: [[DICEXPR:!DIExpression\(DW_OP_constu, 0, DW_OP_stack_value\)]]242 *)243 insist244 ( Llvm_debuginfo.get_metadata_kind cexpr_di245 = Llvm_debuginfo.MetadataKind.DIExpressionMetadataKind );246 let ty = int_ty_di 64 dibuilder in247 stdout_metadata ty;248 (* CHECK: [[INT64TY_PTR:<0x[0-9a-f]*>]] = !DIBasicType(name: "int", size: 64, encoding: DW_ATE_signed)249 *)250 let gvexpr_di =251 Llvm_debuginfo.dibuild_create_global_variable_expression dibuilder252 ~scope:m_di ~name:"my_global" ~linkage:"" ~file:f_di ~line:5 ~ty253 ~is_local_to_unit:true ~expr:cexpr_di ~decl:null_metadata ~align_in_bits:0254 in255 insist256 ( Llvm_debuginfo.get_metadata_kind gvexpr_di257 = Llvm_debuginfo.MetadataKind.DIGlobalVariableExpressionMetadataKind );258 ( match259 Llvm_debuginfo.di_global_variable_expression_get_variable gvexpr_di260 with261 | Some gvexpr_var_di ->262 insist263 ( Llvm_debuginfo.get_metadata_kind gvexpr_var_di264 = Llvm_debuginfo.MetadataKind.DIGlobalVariableMetadataKind );265 stdout_metadata gvexpr_var_di266 (* CHECK: [[GV_PTR:<0x[0-9a-f]*>]] = distinct !DIGlobalVariable(name: "my_global", scope: [[MODULE_PTR]], file: [[FILE_PTR]], line: 5, type: [[INT64TY_PTR]], isLocal: true, isDefinition: true)267 *)268 | None -> insist false );269 stdout_metadata gvexpr_di;270 (* CHECK: [[GVEXP_PTR:<0x[0-9a-f]*>]] = !DIGlobalVariableExpression(var: [[GV_PTR]], expr: [[DICEXPR]])271 *)272 ()273 274let test_variables f dibuilder file_di fun_di =275 let entry_term = Option.get @@ (Llvm.block_terminator (Llvm.entry_block f)) in276 group "Local and parameter variable tests";277 let ty = int_ty_di 64 dibuilder in278 stdout_metadata ty;279 (* CHECK: [[INT64TY_PTR:<0x[0-9a-f]*>]] = !DIBasicType(name: "int", size: 64, encoding: DW_ATE_signed)280 *)281 let auto_var =282 Llvm_debuginfo.dibuild_create_auto_variable dibuilder ~scope:fun_di283 ~name:"my_local" ~file:file_di ~line:10 ~ty284 ~always_preserve:false flags_zero ~align_in_bits:0285 in286 stdout_metadata auto_var;287 (* CHECK: [[LOCAL_VAR_PTR:<0x[0-9a-f]*>]] = !DILocalVariable(name: "my_local", scope: <{{0x[0-9a-f]*}}>, file: <{{0x[0-9a-f]*}}>, line: 10, type: [[INT64TY_PTR]])288 *)289 let builder = Llvm.builder_before context entry_term in290 let all = Llvm.build_alloca (Llvm.i64_type context) "my_alloca" builder in291 let scope =292 Llvm_debuginfo.dibuild_create_lexical_block dibuilder ~scope:fun_di293 ~file:file_di ~line:9 ~column:4294 in295 let location =296 Llvm_debuginfo.dibuild_create_debug_location297 context ~line:10 ~column:12 ~scope298 in299 let vdi = Llvm_debuginfo.dibuild_insert_declare_before dibuilder ~storage:all300 ~var_info:auto_var ~expr:(Llvm_debuginfo.dibuild_expression dibuilder [||])301 ~location ~instr:entry_term302 in303 let () = Printf.printf "%s\n" (Llvm.string_of_lldbgrecord vdi) in304 (* CHECK: dbg_declare(ptr %my_alloca, ![[#]], !DIExpression(), ![[#]])305 *)306 let arg1 = (Llvm.params f).(1) in307 let arg_var = Llvm_debuginfo.dibuild_create_parameter_variable dibuilder ~scope:fun_di308 ~name:"my_arg" ~argno:1 ~file:file_di ~line:10 ~ty309 ~always_preserve:false flags_zero310 in311 let argdi = Llvm_debuginfo.dibuild_insert_declare_before dibuilder ~storage:arg1312 ~var_info:arg_var ~expr:(Llvm_debuginfo.dibuild_expression dibuilder [||])313 ~location ~instr:entry_term314 in315 let () = Printf.printf "%s\n" (Llvm.string_of_lldbgrecord argdi) in316 (* CHECK: dbg_declare(ptr %1, ![[#]], !DIExpression(), ![[#]])317 *)318 ()319 320let test_types dibuilder file_di m_di =321 group "type tests";322 let namespace_di =323 Llvm_debuginfo.dibuild_create_namespace dibuilder ~parent_ref:m_di324 ~name:"NameSpace1" ~export_symbols:false325 in326 stdout_metadata namespace_di;327 (* CHECK: [[NAMESPACE_PTR:<0x[0-9a-f]*>]] = !DINamespace(name: "NameSpace1", scope: [[MODULE_PTR]])328 *)329 let int64_ty_di = int_ty_di 64 dibuilder in330 let structty_args = [| int64_ty_di; int64_ty_di; int64_ty_di |] in331 let struct_ty_di =332 Llvm_debuginfo.dibuild_create_struct_type dibuilder ~scope:namespace_di333 ~name:"StructType1" ~file:file_di ~line_number:20 ~size_in_bits:192334 ~align_in_bits:0 flags_zero ~derived_from:null_metadata335 ~elements:structty_args Llvm_debuginfo.DWARFSourceLanguageKind.C89336 ~vtable_holder:null_metadata ~unique_id:"StructType1"337 in338 (* Since there's no way to fetch the element types which is now339 * a type array, we build that again for checking. *)340 let structty_di_eltypes =341 Llvm_debuginfo.dibuild_get_or_create_type_array dibuilder342 ~data:structty_args343 in344 stdout_metadata structty_di_eltypes;345 (* CHECK: [[STRUCTELT_PTR:<0x[0-9a-f]*>]] = !{[[INT64TY_PTR]], [[INT64TY_PTR]], [[INT64TY_PTR]]}346 *)347 stdout_metadata struct_ty_di;348 (* CHECK: [[STRUCT_PTR:<0x[0-9a-f]*>]] = !DICompositeType(tag: DW_TAG_structure_type, name: "StructType1", scope: [[NAMESPACE_PTR]], file: [[FILE_PTR]], line: 20, size: 192, elements: [[STRUCTELT_PTR]], identifier: "StructType1")349 *)350 insist351 ( Llvm_debuginfo.get_metadata_kind struct_ty_di352 = Llvm_debuginfo.MetadataKind.DICompositeTypeMetadataKind );353 let structptr_di =354 Llvm_debuginfo.dibuild_create_pointer_type dibuilder355 ~pointee_ty:struct_ty_di ~size_in_bits:192 ~align_in_bits:0356 ~address_space:0 ~name:""357 in358 stdout_metadata structptr_di;359 (* CHECK: [[STRUCTPTR_PTR:<0x[0-9a-f]*>]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[STRUCT_PTR]], size: 192, dwarfAddressSpace: 0)360 *)361 insist362 ( Llvm_debuginfo.get_metadata_kind structptr_di363 = Llvm_debuginfo.MetadataKind.DIDerivedTypeMetadataKind );364 let enumerator1 =365 Llvm_debuginfo.dibuild_create_enumerator dibuilder ~name:"Test_A" ~value:0366 ~is_unsigned:true367 in368 stdout_metadata enumerator1;369 (* CHECK: [[ENUMERATOR1_PTR:<0x[0-9a-f]*>]] = !DIEnumerator(name: "Test_A", value: 0, isUnsigned: true)370 *)371 let enumerator2 =372 Llvm_debuginfo.dibuild_create_enumerator dibuilder ~name:"Test_B" ~value:1373 ~is_unsigned:true374 in375 stdout_metadata enumerator2;376 (* CHECK: [[ENUMERATOR2_PTR:<0x[0-9a-f]*>]] = !DIEnumerator(name: "Test_B", value: 1, isUnsigned: true)377 *)378 let enumerator3 =379 Llvm_debuginfo.dibuild_create_enumerator dibuilder ~name:"Test_C" ~value:2380 ~is_unsigned:true381 in382 insist383 ( Llvm_debuginfo.get_metadata_kind enumerator1384 = Llvm_debuginfo.MetadataKind.DIEnumeratorMetadataKind385 && Llvm_debuginfo.get_metadata_kind enumerator2386 = Llvm_debuginfo.MetadataKind.DIEnumeratorMetadataKind387 && Llvm_debuginfo.get_metadata_kind enumerator3388 = Llvm_debuginfo.MetadataKind.DIEnumeratorMetadataKind );389 stdout_metadata enumerator3;390 (* CHECK: [[ENUMERATOR3_PTR:<0x[0-9a-f]*>]] = !DIEnumerator(name: "Test_C", value: 2, isUnsigned: true)391 *)392 let elements = [| enumerator1; enumerator2; enumerator3 |] in393 let enumeration_ty_di =394 Llvm_debuginfo.dibuild_create_enumeration_type dibuilder ~scope:namespace_di395 ~name:"EnumTest" ~file:file_di ~line_number:1 ~size_in_bits:64396 ~align_in_bits:0 ~elements ~class_ty:int64_ty_di397 in398 let elements_arr =399 Llvm_debuginfo.dibuild_get_or_create_array dibuilder ~data:elements400 in401 stdout_metadata elements_arr;402 (* CHECK: [[ELEMENTS_PTR:<0x[0-9a-f]*>]] = !{[[ENUMERATOR1_PTR]], [[ENUMERATOR2_PTR]], [[ENUMERATOR3_PTR]]}403 *)404 stdout_metadata enumeration_ty_di;405 (* CHECK: [[ENUMERATION_PTR:<0x[0-9a-f]*>]] = !DICompositeType(tag: DW_TAG_enumeration_type, name: "EnumTest", scope: [[NAMESPACE_PTR]], file: [[FILE_PTR]], line: 1, baseType: [[INT64TY_PTR]], size: 64, elements: [[ELEMENTS_PTR]])406 *)407 insist408 ( Llvm_debuginfo.get_metadata_kind enumeration_ty_di409 = Llvm_debuginfo.MetadataKind.DICompositeTypeMetadataKind );410 let int32_ty_di = int_ty_di 32 dibuilder in411 let class_mem1 =412 Llvm_debuginfo.dibuild_create_member_type dibuilder ~scope:namespace_di413 ~name:"Field1" ~file:file_di ~line_number:3 ~size_in_bits:32414 ~align_in_bits:0 ~offset_in_bits:0 flags_zero ~ty:int32_ty_di415 in416 stdout_metadata class_mem1;417 (* CHECK: [[MEMB1_PTR:<0x[0-9a-f]*>]] = !DIDerivedType(tag: DW_TAG_member, name: "Field1", scope: [[NAMESPACE_PTR]], file: [[FILE_PTR]], line: 3, baseType: [[INT32_PTR]], size: 32)418 *)419 insist (Llvm_debuginfo.di_type_get_name class_mem1 = "Field1");420 insist (Llvm_debuginfo.di_type_get_line class_mem1 = 3);421 let class_mem2 =422 Llvm_debuginfo.dibuild_create_member_type dibuilder ~scope:namespace_di423 ~name:"Field2" ~file:file_di ~line_number:4 ~size_in_bits:64424 ~align_in_bits:8 ~offset_in_bits:32 flags_zero ~ty:int64_ty_di425 in426 stdout_metadata class_mem2;427 (* CHECK: [[MEMB2_PTR:<0x[0-9a-f]*>]] = !DIDerivedType(tag: DW_TAG_member, name: "Field2", scope: [[NAMESPACE_PTR]], file: [[FILE_PTR]], line: 4, baseType: [[INT64TY_PTR]], size: 64, align: 8, offset: 32)428 *)429 insist (Llvm_debuginfo.di_type_get_offset_in_bits class_mem2 = 32);430 insist (Llvm_debuginfo.di_type_get_size_in_bits class_mem2 = 64);431 insist (Llvm_debuginfo.di_type_get_align_in_bits class_mem2 = 8);432 let class_elements = [| class_mem1; class_mem2 |] in433 insist434 ( Llvm_debuginfo.get_metadata_kind class_mem1435 = Llvm_debuginfo.MetadataKind.DIDerivedTypeMetadataKind436 && Llvm_debuginfo.get_metadata_kind class_mem2437 = Llvm_debuginfo.MetadataKind.DIDerivedTypeMetadataKind );438 stdout_metadata439 (Llvm_debuginfo.dibuild_get_or_create_type_array dibuilder440 ~data:class_elements);441 (* CHECK: [[CLASSMEM_PTRS:<0x[0-9a-f]*>]] = !{[[MEMB1_PTR]], [[MEMB2_PTR]]}442 *)443 let classty_di =444 Llvm_debuginfo.dibuild_create_class_type dibuilder ~scope:namespace_di445 ~name:"MyClass" ~file:file_di ~line_number:1 ~size_in_bits:96446 ~align_in_bits:0 ~offset_in_bits:0 flags_zero ~derived_from:null_metadata447 ~elements:class_elements ~vtable_holder:null_metadata448 ~template_params_node:null_metadata ~unique_identifier:"MyClass"449 in450 stdout_metadata classty_di;451 (* [[CLASS_PTR:<0x[0-9a-f]*>]] = !DICompositeType(tag: DW_TAG_structure_type, name: "MyClass", scope: [[NAMESPACE_PTR]], file: [[FILE_PTR]], line: 1, size: 96, elements: [[CLASSMEM_PTRS]], identifier: "MyClass")452 *)453 insist454 ( Llvm_debuginfo.get_metadata_kind classty_di455 = Llvm_debuginfo.MetadataKind.DICompositeTypeMetadataKind );456 ()457 458let () =459 let m, dibuilder, file_di, m_di = test_get_module () in460 let fty, f, fun_di = test_get_function m dibuilder file_di m_di in461 let () = test_bbinstr fty f fun_di file_di dibuilder in462 let () = test_global_variable_expression dibuilder file_di m_di in463 let () = test_variables f dibuilder file_di fun_di in464 let () = test_types dibuilder file_di m_di in465 Llvm_debuginfo.dibuild_finalize dibuilder;466 ( match Llvm_analysis.verify_module m with467 | Some err ->468 prerr_endline ("Verification of module failed: " ^ err);469 exit_status := 1470 | None -> () );471 exit !exit_status472