# RUN: yaml2obj %s -o %t.o # RUN: echo '---' > %t2.map # RUN: echo "triple: 'x86_64-apple-darwin'" >> %t2.map # RUN: echo 'objects:' >> %t2.map # RUN: echo " - filename: '%t.o'" >> %t2.map # RUN: echo ' symbols:' >> %t2.map # RUN: echo ' - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x10000, size: 0x10 }' >> %t2.map # RUN: echo '...' >> %t2.map # RUN: dsymutil --linker=parallel -y %t2.map -f -o %t1.out # RUN: llvm-dwarfdump -a %t1.out | FileCheck %s ## This test checks debug info for the case when one compilation unit ## contains forward declaration of the type and another compilation unit ## contains definition for that type. The result should have type table ## containing definition for that type and corresponding variables should ## properly reference that type. ## CU1: ## ## class class1; ## template class class2; ## ## class1 *var1; ## class2 *var2; ## ## CU2: ## ## class class1 { ## char member1; ## float member2; ## }; ## ## template class class2 { ## char member1; ## }; ## ## class1 *var1; ## class2 *var2; # CHECK: file format Mach-O 64-bit x86-64 # CHECK: .debug_info contents: # CHECK: Compile Unit: # CHECK: DW_TAG_compile_unit # CHECK: DW_AT_name{{.*}}"__artificial_type_unit" # CHECK: 0x[[CHAR:[0-9a-f]*]]: DW_TAG_base_type # CHECK: DW_AT_name{{.*}}"char" # CHECK: 0x[[FLOAT:[0-9a-f]*]]: DW_TAG_base_type # CHECK: DW_AT_name{{.*}}"float" # CHECK: 0x[[INT:[0-9a-f]*]]: DW_TAG_base_type # CHECK: DW_AT_name{{.*}}"int" # CHECK: 0x[[CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1" # CHECK: DW_TAG_member # CHECK: DW_AT_type{{.*}}0x[[CHAR]] "char" # CHECK: DW_AT_name{{.*}}"member1" # CHECK: DW_TAG_member # CHECK: DW_AT_type{{.*}}0x[[FLOAT]] "float" # CHECK: DW_AT_name{{.*}}"member2" # CHECK: 0x[[CLASS2:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class2" # CHECK: DW_TAG_template_type_parameter{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[INT]] "int" # CHECK: DW_TAG_member # CHECK: DW_AT_type{{.*}}0x[[CHAR]] "char" # CHECK: DW_AT_name{{.*}}"member1" # CHECK: 0x[[PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CLASS1]] "class1" # CHECK: 0x[[PTR_CLASS2:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CLASS2]] "class2" # CHECK: DW_TAG_compile_unit # CHECK: DW_AT_name{{.*}}"CU1" # CHECK: DW_TAG_variable # CHECK: DW_AT_name{{.*}}"var1" # CHECK: DW_AT_type{{.*}}0x{{.*}}[[PTR_CLASS1]] "class1 *" # CHECK: DW_TAG_variable # CHECK: DW_AT_name{{.*}}"var2" # CHECK: DW_AT_type{{.*}}0x{{.*}}[[PTR_CLASS2]] "class2 *" # CHECK: DW_TAG_compile_unit # CHECK: DW_AT_name{{.*}}"CU2" # CHECK: DW_TAG_variable # CHECK: DW_AT_name{{.*}}"var1" # CHECK: DW_AT_type{{.*}}0x{{.*}}[[PTR_CLASS1]] "class1 *" # CHECK: DW_TAG_variable # CHECK: DW_AT_name{{.*}}"var2" # CHECK: DW_AT_type{{.*}}0x{{.*}}[[PTR_CLASS2]] "class2 *" --- !mach-o FileHeader: magic: 0xFEEDFACF cputype: 0x01000007 cpusubtype: 0x00000003 filetype: 0x00000001 ncmds: 2 sizeofcmds: 376 flags: 0x00002000 reserved: 0x00000000 LoadCommands: - cmd: LC_SEGMENT_64 cmdsize: 232 segname: '' vmaddr: 0x00 vmsize: 0x300 fileoff: 0x300 filesize: 0x300 maxprot: 7 initprot: 7 nsects: 2 flags: 0 Sections: - sectname: __debug_abbrev segname: __DWARF addr: 0x000000000000000F size: 0x9c offset: 0x00000380 align: 0 reloff: 0x00000000 nreloc: 0 flags: 0x02000000 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __debug_info segname: __DWARF addr: 0x000000000000100 size: 0xed offset: 0x0000041c align: 0 reloff: 0x00000600 nreloc: 1 flags: 0x02000000 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 relocations: - address: 0x000001FC symbolnum: 1 pcrel: true length: 3 extern: false type: 0 scattered: false value: 0 - cmd: LC_SYMTAB cmdsize: 24 symoff: 0x700 nsyms: 1 stroff: 0x710 strsize: 10 LinkEditData: NameList: - n_strx: 1 n_type: 0x0F n_sect: 1 n_desc: 0 n_value: 0 StringTable: - '' - '__Z3foov' - '' DWARF: debug_abbrev: - Table: - Tag: DW_TAG_compile_unit Children: DW_CHILDREN_yes Attributes: - Attribute: DW_AT_producer Form: DW_FORM_string - Attribute: DW_AT_language Form: DW_FORM_data2 - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_class_type Children: DW_CHILDREN_yes Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_member Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_class_type Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Attribute: DW_AT_declaration Form: DW_FORM_flag_present - Tag: DW_TAG_class_type Children: DW_CHILDREN_yes Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Attribute: DW_AT_declaration Form: DW_FORM_flag_present - Tag: DW_TAG_template_type_parameter Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Tag: DW_TAG_base_type Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_pointer_type Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Tag: DW_TAG_variable Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Attribute: DW_AT_const_value Form: DW_FORM_data4 - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Table: - Tag: DW_TAG_compile_unit Children: DW_CHILDREN_yes Attributes: - Attribute: DW_AT_producer Form: DW_FORM_string - Attribute: DW_AT_language Form: DW_FORM_data2 - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_class_type Children: DW_CHILDREN_yes Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_member Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_class_type Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Attribute: DW_AT_declaration Form: DW_FORM_flag_present - Tag: DW_TAG_class_type Children: DW_CHILDREN_yes Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Attribute: DW_AT_declaration Form: DW_FORM_flag_present - Tag: DW_TAG_template_type_parameter Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Tag: DW_TAG_base_type Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Tag: DW_TAG_pointer_type Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_type Form: DW_FORM_ref_addr - Tag: DW_TAG_variable Children: DW_CHILDREN_no Attributes: - Attribute: DW_AT_name Form: DW_FORM_string - Attribute: DW_AT_const_value Form: DW_FORM_data4 - Attribute: DW_AT_type Form: DW_FORM_ref_addr debug_info: - Version: 4 Entries: - AbbrCode: 1 Values: - CStr: by_hand - Value: 0x04 - CStr: CU1 - AbbrCode: 4 Values: - CStr: class1 - AbbrCode: 5 Values: - CStr: class2 - AbbrCode: 6 Values: - Value: 0x00000030 - AbbrCode: 0 - AbbrCode: 7 Values: - CStr: int - AbbrCode: 8 Values: - Value: 0x0000001a - AbbrCode: 8 Values: - Value: 0x00000022 - AbbrCode: 9 Values: - CStr: var1 - Value: 0x00000000 - Value: 0x00000035 - AbbrCode: 9 Values: - CStr: var2 - Value: 0x00000000 - Value: 0x0000003a - AbbrCode: 0 - Version: 4 Entries: - AbbrCode: 1 Values: - CStr: by_hand - Value: 0x04 - CStr: CU2 - AbbrCode: 2 Values: - CStr: class1 - AbbrCode: 3 Values: - Value: 0x000000b9 - CStr: member1 - AbbrCode: 3 Values: - Value: 0x000000bf - CStr: member2 - AbbrCode: 0 - AbbrCode: 2 Values: - CStr: class2 - AbbrCode: 6 Values: - Value: 0x000000b4 - AbbrCode: 3 Values: - Value: 0x000000b9 - CStr: member1 - AbbrCode: 0 - AbbrCode: 7 Values: - CStr: int - AbbrCode: 7 Values: - CStr: char - AbbrCode: 7 Values: - CStr: float - AbbrCode: 8 Values: - Value: 0x00000076 - AbbrCode: 8 Values: - Value: 0x00000099 - AbbrCode: 9 Values: - CStr: var1 - Value: 0x00000000 - Value: 0x000000c6 - AbbrCode: 9 Values: - CStr: var2 - Value: 0x00000000 - Value: 0x000000cb - AbbrCode: 0 ...