brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.0 KiB · 6ebc7c3 Raw
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