345 lines
10 KiB
Plaintext
345 lines
10 KiB
Plaintext
## 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
|
|
...
|