| ## This test checks debug info for the case when one compilation unit |
| ## contains a definition of a type and another compilation unit |
| ## contains a definition of the same type. When --garbage-collection |
| ## is enabled the result should contain the original definition in CU1 |
| ## and the definition from CU2 should have been removed. |
| |
| # RUN: yaml2obj %s -o %t.o |
| |
| ## Check --odr-deduplication. |
| # RUN: llvm-dwarfutil %t.o %t1 |
| # RUN: llvm-dwarfdump -a %t1 | FileCheck %s --check-prefixes=CHECK,CHECK-ODR |
| |
| ## Check --odr alias. |
| # RUN: llvm-dwarfutil --odr %t.o %t2 |
| # RUN: cmp %t1 %t2 |
| |
| ## Check --no-odr alias. |
| # RUN: llvm-dwarfutil --no-odr %t.o %t3 |
| # RUN: llvm-dwarfdump -a %t3 | FileCheck %s --check-prefixes=CHECK,CHECK-NOODR |
| |
| ## Check --no-odr-deduplication wins if last. |
| # RUN: llvm-dwarfutil --odr-deduplication --no-odr-deduplication %t.o %t4 |
| # RUN: cmp %t3 %t4 |
| |
| ## Check --odr-deduplication wins if last. |
| # RUN: llvm-dwarfutil --no-odr-deduplication --odr-deduplication %t.o %t6 |
| # RUN: cmp %t1 %t6 |
| |
| ## CU1: |
| ## |
| ## class class1 { |
| ## char member1; |
| ## float member2; |
| ## }; |
| ## |
| ## class1 *var1; |
| ## |
| ## CU2: |
| ## |
| ## class class1 { |
| ## char member1; |
| ## float member2; |
| ## }; |
| ## |
| ## class1 *var1; |
| |
| # CHECK: file format elf64-x86-64 |
| # CHECK: .debug_info contents: |
| |
| # CHECK: DW_TAG_compile_unit |
| # CHECK: DW_AT_name{{.*}}"CU1" |
| |
| # CHECK: 0x[[CU1_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1" |
| # CHECK: DW_TAG_member |
| # CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_CHAR:[0-9a-f]*]] "char" |
| # CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_CHAR:[0-9a-f]*]] "char" |
| # CHECK: DW_AT_name{{.*}}"member1" |
| |
| # CHECK: DW_TAG_member |
| # CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_FLOAT:[0-9a-f]*]] "float" |
| # CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_FLOAT:[0-9a-f]*]] "float" |
| # CHECK: DW_AT_name{{.*}}"member2" |
| |
| # CHECK: 0x[[CU1_INT:[0-9a-f]*]]: DW_TAG_base_type |
| # CHECK: DW_AT_name{{.*}}"int" |
| |
| # CHECK: 0x[[CU1_CHAR]]: DW_TAG_base_type |
| # CHECK: DW_AT_name{{.*}}"char" |
| |
| # CHECK: 0x[[CU1_FLOAT]]: DW_TAG_base_type |
| # CHECK: DW_AT_name{{.*}}"float" |
| |
| # CHECK-ODR: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1" |
| # CHECK-NOODR: 0x[[CU1_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CU1_CLASS1]] "class1" |
| |
| # CHECK: DW_TAG_variable |
| # CHECK: DW_AT_name{{.*}}"var1" |
| # CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU1_PTR_CLASS1]] "class1 *" |
| # CHECK-NOODR: DW_AT_type{{.*}}0x[[CU1_PTR_CLASS1]] "class1 *" |
| |
| # CHECK: DW_TAG_compile_unit |
| # CHECK: DW_AT_name{{.*}}"CU2" |
| |
| # CHECK-ODR-NOT: DW_TAG_class_type |
| # CHECK-ODR-NOT: "class1" |
| |
| # CHECK-ODR: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x00000000[[CU1_CLASS1]] "class1" |
| |
| # CHECK-ODR: DW_TAG_variable |
| # CHECK-ODR: DW_AT_name{{.*}}"var1" |
| # CHECK-ODR: DW_AT_type{{.*}}0x00000000[[CU2_PTR_CLASS1]] "class1 *" |
| |
| |
| # CHECK-NOODR: 0x[[CU2_CLASS1:[0-9a-f]*]]: DW_TAG_class_type{{.*[[:space:]].*}}DW_AT_name{{.*}}"class1" |
| # CHECK-NOODR: DW_TAG_member |
| # CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_CHAR:[0-9a-f]*]] "char" |
| # CHECK-NOODR: DW_AT_name{{.*}}"member1" |
| |
| # CHECK-NOODR: DW_TAG_member |
| # CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_FLOAT:[0-9a-f]*]] "float" |
| # CHECK-NOODR: DW_AT_name{{.*}}"member2" |
| |
| # CHECK-NOODR: 0x[[CU2_INT:[0-9a-f]*]]: DW_TAG_base_type |
| # CHECK-NOODR: DW_AT_name{{.*}}"int" |
| |
| # CHECK-NOODR: 0x[[CU2_CHAR]]: DW_TAG_base_type |
| # CHECK-NOODR: DW_AT_name{{.*}}"char" |
| |
| # CHECK-NOODR: 0x[[CU2_FLOAT]]: DW_TAG_base_type |
| # CHECK-NOODR: DW_AT_name{{.*}}"float" |
| |
| # CHECK-NOODR: 0x[[CU2_PTR_CLASS1:[0-9a-f]*]]: DW_TAG_pointer_type{{.*[[:space:]].*}}DW_AT_type{{.*}}0x[[CU2_CLASS1]] "class1" |
| |
| # CHECK-NOODR: DW_TAG_variable |
| # CHECK-NOODR: DW_AT_name{{.*}}"var1" |
| # CHECK-NOODR: DW_AT_type{{.*}}0x[[CU2_PTR_CLASS1]] "class1 *" |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .text |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC, SHF_EXECINSTR ] |
| Address: 0x1000 |
| Size: 0x1b |
| - Name: .text2 |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC, SHF_EXECINSTR ] |
| Address: 0x2000 |
| Size: 0x1b |
| 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 |
| - Attribute: DW_AT_low_pc |
| Form: DW_FORM_addr |
| - Attribute: DW_AT_high_pc |
| Form: DW_FORM_data8 |
| - 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_ref4 |
| - 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_ref4 |
| - 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_ref4 |
| - 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_ref4 |
| - 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 |
| - Attribute: DW_AT_low_pc |
| Form: DW_FORM_addr |
| - Attribute: DW_AT_high_pc |
| Form: DW_FORM_data8 |
| - 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_ref4 |
| - 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_ref4 |
| - 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_ref4 |
| - 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_ref4 |
| debug_info: |
| - Version: 4 |
| Entries: |
| - AbbrCode: 1 |
| Values: |
| - CStr: by_hand |
| - Value: 0x04 |
| - CStr: CU1 |
| - Value: 0x1000 |
| - Value: 0x1b |
| - AbbrCode: 2 |
| Values: |
| - CStr: class1 |
| - AbbrCode: 3 |
| Values: |
| - Value: 0x00000052 |
| - CStr: member1 |
| - AbbrCode: 3 |
| Values: |
| - Value: 0x00000058 |
| - CStr: member2 |
| - AbbrCode: 0 |
| - AbbrCode: 7 |
| Values: |
| - CStr: int |
| - AbbrCode: 7 |
| Values: |
| - CStr: char |
| - AbbrCode: 7 |
| Values: |
| - CStr: float |
| - AbbrCode: 8 |
| Values: |
| - Value: 0x0000002a |
| - AbbrCode: 9 |
| Values: |
| - CStr: var1 |
| - Value: 0x00000000 |
| - Value: 0x0000005f |
| - AbbrCode: 0 |
| - Version: 4 |
| Entries: |
| - AbbrCode: 1 |
| Values: |
| - CStr: by_hand |
| - Value: 0x04 |
| - CStr: CU2 |
| - Value: 0x2000 |
| - Value: 0x1b |
| - AbbrCode: 2 |
| Values: |
| - CStr: class1 |
| - AbbrCode: 3 |
| Values: |
| - Value: 0x00000052 |
| - CStr: member1 |
| - AbbrCode: 3 |
| Values: |
| - Value: 0x00000058 |
| - CStr: member2 |
| - AbbrCode: 0 |
| - AbbrCode: 7 |
| Values: |
| - CStr: int |
| - AbbrCode: 7 |
| Values: |
| - CStr: char |
| - AbbrCode: 7 |
| Values: |
| - CStr: float |
| - AbbrCode: 8 |
| Values: |
| - Value: 0x0000002a |
| - AbbrCode: 9 |
| Values: |
| - CStr: var1 |
| - Value: 0x00000000 |
| - Value: 0x0000005f |
| - AbbrCode: 0 |
| ... |