[llvm] b86b709 - [DWARFLinker][DWARFv5] Add support for DW_FORM_addrx*
Alexey Lapshin via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 13 04:19:04 PDT 2023
Author: Alexey Lapshin
Date: 2023-03-13T12:15:56+01:00
New Revision: b86b709bcf80e28f8c191cd5921d3ae1f81756cb
URL: https://github.com/llvm/llvm-project/commit/b86b709bcf80e28f8c191cd5921d3ae1f81756cb
DIFF: https://github.com/llvm/llvm-project/commit/b86b709bcf80e28f8c191cd5921d3ae1f81756cb.diff
LOG: [DWARFLinker][DWARFv5] Add support for DW_FORM_addrx*
This patch add support of DWARFv5 attribute forms: DW_FORM_addrx1,
DW_FORM_addrx2, DW_FORM_addrx3, DW_FORM_addrx4.
Differential Revision: https://reviews.llvm.org/D145805
Added:
Modified:
llvm/lib/DWARFLinker/DWARFLinker.cpp
llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addrx.test
llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
Removed:
################################################################################
diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp
index 7640dfa40a682..ae9fb16907356 100644
--- a/llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp
@@ -1201,15 +1201,24 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
*Addr += Info.PCOffset;
}
- dwarf::Form Form = AttrSpec.Form;
-
- // DWARFLinker does not use addrx forms since it generates relocated
- // addresses. Replace DW_FORM_addrx with DW_FORM_addr here.
- if (Form == dwarf::DW_FORM_addrx)
- Form = dwarf::DW_FORM_addr;
+ switch (AttrSpec.Form) {
+ case dwarf::DW_FORM_addrx:
+ case dwarf::DW_FORM_addrx1:
+ case dwarf::DW_FORM_addrx2:
+ case dwarf::DW_FORM_addrx3:
+ case dwarf::DW_FORM_addrx4: {
+ // DWARFLinker does not use addrx forms since it generates relocated
+ // addresses. Replace DW_FORM_addrx* with DW_FORM_addr here.
+ AttrSpec.Form = dwarf::DW_FORM_addr;
+ break;
+ }
+ default:
+ // Nothing to do.
+ break;
+ }
Die.addValue(DIEAlloc, static_cast<dwarf::Attribute>(AttrSpec.Attr),
- static_cast<dwarf::Form>(Form), DIEInteger(*Addr));
+ AttrSpec.Form, DIEInteger(*Addr));
return Unit.getOrigUnit().getAddressByteSize();
}
@@ -1358,6 +1367,10 @@ unsigned DWARFLinker::DIECloner::cloneAttribute(
IsLittleEndian);
case dwarf::DW_FORM_addr:
case dwarf::DW_FORM_addrx:
+ case dwarf::DW_FORM_addrx1:
+ case dwarf::DW_FORM_addrx2:
+ case dwarf::DW_FORM_addrx3:
+ case dwarf::DW_FORM_addrx4:
return cloneAddressAttribute(Die, InputDIE, AttrSpec, AttrSize, Val, Unit,
Info);
case dwarf::DW_FORM_data1:
diff --git a/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addrx.test b/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addrx.test
index 65e5e81ddca78..bf52bac1237c1 100644
--- a/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addrx.test
+++ b/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addrx.test
@@ -21,7 +21,7 @@
#DWARF-CHECK: DW_TAG_compile_unit
#DWARF-CHECK: DW_AT_name [DW_FORM_strp] {{.*}} "CU1"
#DWARF-CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000001130)
-#DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000030)
+#DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000060)
#DWARF-CHECK: DW_TAG_subprogram
#DWARF-CHECK: DW_AT_name [DW_FORM_strp] {{.*}} "foo1"
#DWARF-CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000001130)
@@ -34,12 +34,24 @@
#DWARF-CHECK: DW_AT_name [DW_FORM_strp] {{.*}} "foo3"
#DWARF-CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000001150)
#DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
+#DWARF-CHECK: DW_TAG_subprogram
+#DWARF-CHECK: DW_AT_name [DW_FORM_strp] {{.*}} "foo4"
+#DWARF-CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000001160)
+#DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
+#DWARF-CHECK: DW_TAG_subprogram
+#DWARF-CHECK: DW_AT_name [DW_FORM_strp] {{.*}} "foo5"
+#DWARF-CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000001170)
+#DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
+#DWARF-CHECK: DW_TAG_subprogram
+#DWARF-CHECK: DW_AT_name [DW_FORM_strp] {{.*}} "foo6"
+#DWARF-CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000001180)
+#DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
#DWARF-CHECK=NOT: .debug_addr contents:
#UPD-DWARF-CHECK: DW_TAG_compile_unit
#UPD-DWARF-CHECK: DW_AT_name {{.*}}"CU1"
#UPD-DWARF-CHECK: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) address = 0x0000000000001130)
-#UPD-DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000030)
+#UPD-DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000060)
#UPD-DWARF-CHECK: DW_TAG_subprogram
#UPD-DWARF-CHECK: DW_AT_name {{.*}}"foo1"
#UPD-DWARF-CHECK: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) address = 0x0000000000001130)
@@ -52,12 +64,27 @@
#UPD-DWARF-CHECK: DW_AT_name {{.*}}"foo3"
#UPD-DWARF-CHECK: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000002) address = 0x0000000000001150)
#UPD-DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
+#UPD-DWARF-CHECK: DW_TAG_subprogram
+#UPD-DWARF-CHECK: DW_AT_name {{.*}}"foo4"
+#UPD-DWARF-CHECK: DW_AT_low_pc [DW_FORM_addrx1] (indexed (00000003) address = 0x0000000000001160)
+#UPD-DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
+#UPD-DWARF-CHECK: DW_TAG_subprogram
+#UPD-DWARF-CHECK: DW_AT_name {{.*}}"foo5"
+#UPD-DWARF-CHECK: DW_AT_low_pc [DW_FORM_addrx2] (indexed (00000004) address = 0x0000000000001170)
+#UPD-DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
+#UPD-DWARF-CHECK: DW_TAG_subprogram
+#UPD-DWARF-CHECK: DW_AT_name {{.*}}"foo6"
+#UPD-DWARF-CHECK: DW_AT_low_pc [DW_FORM_addrx4] (indexed (00000005) address = 0x0000000000001180)
+#UPD-DWARF-CHECK: DW_AT_high_pc [DW_FORM_data8] (0x0000000000000010)
#UPD-DWARF-CHECK: .debug_addr contents:
-#UPD-DWARF-CHECK: 0x00000000: Address table header: length = 0x0000001c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+#UPD-DWARF-CHECK: 0x00000000: Address table header: length = 0x00000034, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
#UPD-DWARF-CHECK: Addrs: [
#UPD-DWARF-CHECK: 0x0000000000001130
#UPD-DWARF-CHECK: 0x0000000000001140
#UPD-DWARF-CHECK: 0x0000000000001150
+#UPD-DWARF-CHECK: 0x0000000000001160
+#UPD-DWARF-CHECK: 0x0000000000001170
+#UPD-DWARF-CHECK: 0x0000000000001180
#UPD-DWARF-CHECK: ]
--- !ELF
@@ -71,7 +98,7 @@ Sections:
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Address: 0x1130
- Size: 0x30
+ Size: 0x60
DWARF:
debug_abbrev:
- Table:
@@ -101,6 +128,39 @@ DWARF:
Form: DW_FORM_data8
- Attribute: DW_AT_type
Form: DW_FORM_ref4
+ - Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addrx1
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data8
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addrx2
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data8
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addrx4
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data8
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
- Tag: DW_TAG_base_type
Children: DW_CHILDREN_no
Attributes:
@@ -116,30 +176,51 @@ DWARF:
- Value: 0x04
- CStr: CU1
- Value: 0x0
- - Value: 0x30
+ - Value: 0x60
- Value: 0x8
- AbbrCode: 2
Values:
- CStr: foo1
- Value: 0x0
- Value: 0x10
- - Value: 0x64
+ - Value: 0xa4
- AbbrCode: 0
- AbbrCode: 2
Values:
- CStr: foo2
- Value: 0x01
- Value: 0x10
- - Value: 0x64
+ - Value: 0xa4
- AbbrCode: 0
- AbbrCode: 2
Values:
- CStr: foo3
- Value: 0x02
- Value: 0x10
- - Value: 0x64
+ - Value: 0xa4
- AbbrCode: 0
- AbbrCode: 3
+ Values:
+ - CStr: foo4
+ - Value: 0x03
+ - Value: 0x10
+ - Value: 0xa4
+ - AbbrCode: 0
+ - AbbrCode: 4
+ Values:
+ - CStr: foo5
+ - Value: 0x04
+ - Value: 0x10
+ - Value: 0xa4
+ - AbbrCode: 0
+ - AbbrCode: 5
+ Values:
+ - CStr: foo6
+ - Value: 0x05
+ - Value: 0x10
+ - Value: 0xa4
+ - AbbrCode: 0
+ - AbbrCode: 6
Values:
- CStr: int
- AbbrCode: 0
@@ -150,4 +231,7 @@ DWARF:
- Address: 0x1130
- Address: 0x1140
- Address: 0x1150
+ - Address: 0x1160
+ - Address: 0x1170
+ - Address: 0x1180
...
diff --git a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
index 413cbec5c51db..c5e1bf1eb91ac 100644
--- a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
+++ b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
@@ -1004,7 +1004,8 @@ bool DwarfLinkerForBinary::AddressManager::isLiveSubprogram(
dwarf::Form Form = Abbrev->getFormByIndex(*LowPcIdx);
- if (Form == dwarf::DW_FORM_addr) {
+ switch (Form) {
+ case dwarf::DW_FORM_addr: {
uint64_t Offset = DIE.getOffset() + getULEB128Size(Abbrev->getCode());
uint64_t LowPcOffset, LowPcEndOffset;
std::tie(LowPcOffset, LowPcEndOffset) =
@@ -1012,8 +1013,11 @@ bool DwarfLinkerForBinary::AddressManager::isLiveSubprogram(
return hasValidRelocationAt(ValidDebugInfoRelocs, LowPcOffset,
LowPcEndOffset, MyInfo);
}
-
- if (Form == dwarf::DW_FORM_addrx) {
+ case dwarf::DW_FORM_addrx:
+ case dwarf::DW_FORM_addrx1:
+ case dwarf::DW_FORM_addrx2:
+ case dwarf::DW_FORM_addrx3:
+ case dwarf::DW_FORM_addrx4: {
std::optional<DWARFFormValue> AddrValue = DIE.find(dwarf::DW_AT_low_pc);
if (std::optional<uint64_t> AddrOffsetSectionBase =
DIE.getDwarfUnit()->getAddrOffsetSectionBase()) {
@@ -1022,11 +1026,14 @@ bool DwarfLinkerForBinary::AddressManager::isLiveSubprogram(
StartOffset + DIE.getDwarfUnit()->getAddressByteSize();
return hasValidRelocationAt(ValidDebugAddrRelocs, StartOffset, EndOffset,
MyInfo);
- } else
- Linker.reportWarning("no base offset for address table", SrcFileName);
- }
+ }
- return false;
+ Linker.reportWarning("no base offset for address table", SrcFileName);
+ return false;
+ }
+ default:
+ return false;
+ }
}
uint64_t
More information about the llvm-commits
mailing list