[llvm] 4171d5c - [obj2yaml] Add support for dumping the .debug_addr(v5) section.
Xing GUO via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 15 23:48:30 PDT 2020
Author: Xing GUO
Date: 2020-09-16T14:48:03+08:00
New Revision: 4171d5c30ad32282e6ca9027aeff01ef5ff2461b
URL: https://github.com/llvm/llvm-project/commit/4171d5c30ad32282e6ca9027aeff01ef5ff2461b
DIFF: https://github.com/llvm/llvm-project/commit/4171d5c30ad32282e6ca9027aeff01ef5ff2461b.diff
LOG: [obj2yaml] Add support for dumping the .debug_addr(v5) section.
This patch adds support for dumping the .debug_addr(v5) section to
obj2yaml.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D87601
Added:
llvm/test/tools/obj2yaml/ELF/DWARF/debug-addr.yaml
Modified:
llvm/include/llvm/DebugInfo/DWARF/DWARFDebugAddr.h
llvm/tools/obj2yaml/dwarf2yaml.cpp
llvm/tools/obj2yaml/elf2yaml.cpp
llvm/tools/obj2yaml/obj2yaml.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugAddr.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugAddr.h
index 32844ffd570f..69e67866946c 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugAddr.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugAddr.h
@@ -74,6 +74,24 @@ class DWARFDebugAddrTable {
/// Return the full length of this table, including the length field.
/// Return None if the length cannot be identified reliably.
Optional<uint64_t> getFullLength() const;
+
+ /// Return the DWARF format of this table.
+ dwarf::DwarfFormat getFormat() const { return Format; }
+
+ /// Return the length of this table.
+ uint64_t getLength() const { return Length; }
+
+ /// Return the version of this table.
+ uint16_t getVersion() const { return Version; }
+
+ /// Return the address size of this table.
+ uint8_t getAddressSize() const { return AddrSize; }
+
+ /// Return the segment selector size of this table.
+ uint8_t getSegmentSelectorSize() const { return SegSize; }
+
+ /// Return the parsed addresses of this table.
+ ArrayRef<uint64_t> getAddressEntries() const { return Addrs; }
};
} // end namespace llvm
diff --git a/llvm/test/tools/obj2yaml/ELF/DWARF/debug-addr.yaml b/llvm/test/tools/obj2yaml/ELF/DWARF/debug-addr.yaml
new file mode 100644
index 000000000000..b294adff5cbd
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/ELF/DWARF/debug-addr.yaml
@@ -0,0 +1,215 @@
+## Test how we dump the .debug_addr section.
+
+## a) Dumping address tables from various object files.
+
+## Dumping address tables from a little endian 64-bit object file.
+# RUN: yaml2obj --docnum=1 %s -DADDRESS=0xFFFFFFFFFFFFFFFF \
+# RUN: -DADDRSIZE=4 | obj2yaml | \
+# RUN: FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
+# RUN: -DLENGTH1=0x0000000000000014 \
+# RUN: -DADDRSIZE1=0x08 \
+# RUN: -DADDR=0xFFFFFFFFFFFFFFFF \
+# RUN: -DLENGTH2=0x000000000000000C \
+# RUN: -DADDRSIZE2=0x04
+
+## Dumping address tables from a big endian 64-bit object file.
+# RUN: yaml2obj --docnum=1 %s -DENDIAN=MSB -DADDRESS=0xFFFFFFFFFFFFFFFF \
+# RUN: -DADDRSIZE=4 | obj2yaml | \
+# RUN: FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
+# RUN: -DLENGTH1=0x0000000000000014 \
+# RUN: -DADDRSIZE1=0x08 \
+# RUN: -DADDR=0xFFFFFFFFFFFFFFFF \
+# RUN: -DLENGTH2=0x000000000000000C \
+# RUN: -DADDRSIZE2=0x04
+
+## Dumping address tables from a little endian 32-bit object file.
+# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DADDRESS=0xFFFFFFFF \
+# RUN: -DADDRSIZE=8 | obj2yaml | \
+# RUN: FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
+# RUN: -DLENGTH1=0x000000000000000C \
+# RUN: -DADDRSIZE1=0x04 \
+# RUN: -DADDR=0x00000000FFFFFFFF \
+# RUN: -DLENGTH2=0x0000000000000014 \
+# RUN: -DADDRSIZE2=0x08
+
+## Dumping address tables from a big endian 32-bit object file.
+# RUN: yaml2obj --docnum=1 %s -DBITS=32 -DENDIAN=MSB -DADDRESS=0xFFFFFFFF \
+# RUN: -DADDRSIZE=8 | obj2yaml | \
+# RUN: FileCheck %s --check-prefix=BASIC --implicit-check-not=Sections: \
+# RUN: -DLENGTH1=0x000000000000000C \
+# RUN: -DADDRSIZE1=0x04 \
+# RUN: -DADDR=0x00000000FFFFFFFF \
+# RUN: -DLENGTH2=0x0000000000000014 \
+# RUN: -DADDRSIZE2=0x08
+
+# BASIC: DWARF:
+# BASIC-NEXT: debug_addr:
+# BASIC-NEXT: - Length: [[LENGTH1]]
+# BASIC-NEXT: Version: 0x0005
+# BASIC-NEXT: AddressSize: [[ADDRSIZE1]]
+# BASIC-NEXT: Entries:
+# BASIC-NEXT: - Address: 0x0000000000001234
+# BASIC-NEXT: - Address: 0x0000000000005678
+# BASIC-NEXT: - Format: DWARF64
+# BASIC-NEXT: Length: [[LENGTH1]]
+# BASIC-NEXT: Version: 0x0005
+# BASIC-NEXT: AddressSize: [[ADDRSIZE1]]
+# BASIC-NEXT: Entries:
+# BASIC-NEXT: - Address: 0x0000000000001234
+# BASIC-NEXT: - Address: [[ADDR]]
+# BASIC-NEXT: - Length: [[LENGTH2]]
+# BASIC-NEXT: Version: 0x0005
+# BASIC-NEXT: AddressSize: [[ADDRSIZE2]]
+# BASIC-NEXT: Entries:
+# BASIC-NEXT: - Address: 0x0000000000001234
+# BASIC-NEXT: - Address: 0x0000000000005678
+# BASIC-NEXT: - Format: DWARF64
+# BASIC-NEXT: Length: [[LENGTH2]]
+# BASIC-NEXT: Version: 0x0005
+# BASIC-NEXT: AddressSize: [[ADDRSIZE2]]
+# BASIC-NEXT: Entries:
+# BASIC-NEXT: - Address: 0x0000000000001234
+# BASIC-NEXT: - Address: 0x0000000000005678
+# BASIC-NEXT: ...
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS[[BITS=64]]
+ Data: ELFDATA2[[ENDIAN=LSB]]
+ Type: ET_EXEC
+DWARF:
+ debug_addr:
+ ## A DWARF32 address table.
+ - Version: 5
+ Entries:
+ - Address: 0x1234
+ - Address: 0x5678
+ ## A DWARF64 address table.
+ - Format: DWARF64
+ Version: 5
+ Entries:
+ - Address: 0x1234
+ - Address: [[ADDRESS]]
+ ## A DWARF32 address table with a mutable address size.
+ - Version: 5
+ AddressSize: [[ADDRSIZE]]
+ Entries:
+ - Address: 0x1234
+ - Address: 0x5678
+ ## A DWARF64 address table with a mutable address size.
+ - Format: DWARF64
+ Version: 5
+ AddressSize: [[ADDRSIZE]]
+ Entries:
+ - Address: 0x1234
+ - Address: 0x5678
+
+## b) Test dumping a .debug_addr section whose section header properties are
+## overridden.
+
+## Override the sh_type field.
+# RUN: yaml2obj --docnum=2 %s -DTYPE=SHT_STRTAB | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_STRTAB --check-prefix=COMMON
+
+## Override the sh_flags field.
+# RUN: yaml2obj --docnum=2 %s -DFLAGS='[ SHF_ALLOC ]' | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,FLAGS
+
+## Override the sh_link field.
+# RUN: yaml2obj --docnum=2 %s -DLINK=.sec | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,LINK
+
+## Override the sh_addr field.
+# RUN: yaml2obj --docnum=2 %s -DADDRESS=0x2020 | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,ADDR
+
+## Override the sh_addralign field.
+# RUN: yaml2obj --docnum=2 %s -DADDRALIGN=3 | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,ADDRALIGN
+
+## Override the sh_entsize field.
+# RUN: yaml2obj --docnum=2 %s -DENTSIZE=3 | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,ENTSIZE
+
+## Override the sh_info field.
+# RUN: yaml2obj --docnum=2 %s -DINFO=3 | obj2yaml | \
+# RUN: FileCheck %s -DTYPE=SHT_PROGBITS --check-prefixes=COMMON,INFO
+
+# COMMON: Sections:
+# COMMON-NEXT: - Name: .debug_addr
+# COMMON-NEXT: Type: [[TYPE]]
+# FLAGS-NEXT: Flags: [ SHF_ALLOC ]
+# LINK-NEXT: Link: .sec
+# ADDR-NEXT: Address: 0x0000000000002020
+# ADDRALIGN-NEXT: AddressAlign: 0x0000000000000003
+# ENTSIZE-NEXT: EntSize: 0x0000000000000003
+# INFO-NEXT: Info: 0x0000000000000003
+# COMMON-NEXT: - Name: .sec
+# COMMON-NEXT: Type: SHT_PROGBITS
+# COMMON-NEXT: DWARF:
+# COMMON-NEXT: debug_addr:
+# COMMON-NEXT: - Length: 0x0000000000000014
+# COMMON-NEXT: Version: 0x0005
+# COMMON-NEXT: AddressSize: 0x08
+# COMMON-NEXT: Entries:
+# COMMON-NEXT: - Address: 0x0000000000001234
+# COMMON-NEXT: - Address: 0x0000000000005678
+# COMMON-NEXT: ...
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Name: .debug_addr
+ Type: [[TYPE=SHT_PROGBITS]]
+ Flags: [[FLAGS=<none>]]
+ Link: [[LINK='']]
+ EntSize: [[ENTSIZE=<none>]]
+ Info: [[INFO=<none>]]
+ AddressAlign: [[ADDRALIGN=0]]
+ Address: [[ADDRESS=<none>]]
+ - Name: .sec
+ Type: SHT_PROGBITS
+DWARF:
+ debug_addr:
+ - Version: 5
+ Entries:
+ - Address: 0x1234
+ - Address: 0x5678
+
+## c) Test dumping an address table whose version isn't 5.
+## This causes the DWARF parser to fail to parse it and we will dump it as a raw
+## content section.
+
+# RUN: yaml2obj --docnum=3 %s -DCONTENT="AABBCC" | obj2yaml | \
+# RUN: FileCheck %s --check-prefix=RAW --implicit-check-not=DWARF:
+
+# RAW: Sections:
+# RAW-NEXT: - Name: .debug_addr
+# RAW-NEXT: Type: SHT_PROGBITS
+# RAW-NEXT: AddressAlign: 0x0000000000000001
+# RAW-NEXT: Content: AABBCC
+# RAW-NEXT: ...
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+Sections:
+ - Name: .debug_addr
+ Type: SHT_PROGBITS
+ AddressAlign: 1
+ Size: [[SIZE=<none>]]
+ Content: [[CONTENT=<none>]]
+
+## d) Test dumping an empty .debug_addr section.
+
+# RUN: yaml2obj --docnum=3 %s -DSIZE=0 | obj2yaml | \
+# RUN: FileCheck %s --check-prefix=EMPTY --implicit-check-not=Sections:
+
+# EMPTY: DWARF:
+# EMPTY-NEXT: debug_addr: []
+# EMPTY-NEXT: ...
diff --git a/llvm/tools/obj2yaml/dwarf2yaml.cpp b/llvm/tools/obj2yaml/dwarf2yaml.cpp
index 1dcf6d42d6ad..10e8ecaeec08 100644
--- a/llvm/tools/obj2yaml/dwarf2yaml.cpp
+++ b/llvm/tools/obj2yaml/dwarf2yaml.cpp
@@ -8,6 +8,7 @@
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
+#include "llvm/DebugInfo/DWARF/DWARFDebugAddr.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
@@ -46,6 +47,38 @@ void dumpDebugAbbrev(DWARFContext &DCtx, DWARFYAML::Data &Y) {
}
}
+Error dumpDebugAddr(DWARFContext &DCtx, DWARFYAML::Data &Y) {
+ DWARFDebugAddrTable AddrTable;
+ DWARFDataExtractor AddrData(DCtx.getDWARFObj(),
+ DCtx.getDWARFObj().getAddrSection(),
+ DCtx.isLittleEndian(), /*AddrSize=*/0);
+ std::vector<DWARFYAML::AddrTableEntry> AddrTables;
+ uint64_t Offset = 0;
+ while (AddrData.isValidOffset(Offset)) {
+ // We ignore any errors that don't prevent parsing the section, since we can
+ // still represent such sections.
+ if (Error Err = AddrTable.extractV5(AddrData, &Offset, /*CUAddrSize=*/0,
+ consumeError))
+ return Err;
+ AddrTables.emplace_back();
+ for (uint64_t Addr : AddrTable.getAddressEntries()) {
+ // Currently, the parser doesn't support parsing an address table with non
+ // linear addresses (segment_selector_size != 0). The segment selectors
+ // are specified to be zero.
+ AddrTables.back().SegAddrPairs.push_back(
+ {/*SegmentSelector=*/0, /*Address=*/Addr});
+ }
+
+ AddrTables.back().Format = AddrTable.getFormat();
+ AddrTables.back().Length = AddrTable.getLength();
+ AddrTables.back().Version = AddrTable.getVersion();
+ AddrTables.back().AddrSize = AddrTable.getAddressSize();
+ AddrTables.back().SegSelectorSize = AddrTable.getSegmentSelectorSize();
+ }
+ Y.DebugAddr = std::move(AddrTables);
+ return Error::success();
+}
+
Error dumpDebugStrings(DWARFContext &DCtx, DWARFYAML::Data &Y) {
DataExtractor StrData = DCtx.getStringExtractor();
uint64_t Offset = 0;
diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index a2c78b81a700..3c3bef2dfbf4 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -418,6 +418,8 @@ Optional<DWARFYAML::Data> ELFDumper<ELFT>::dumpDWARFSections(
Err = dumpDebugStrings(*DWARFCtx.get(), DWARF);
else if (RawSec->Name == ".debug_ranges")
Err = dumpDebugRanges(*DWARFCtx.get(), DWARF);
+ else if (RawSec->Name == ".debug_addr")
+ Err = dumpDebugAddr(*DWARFCtx.get(), DWARF);
else
continue;
diff --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h
index 66a2d2753622..c41010f111b6 100644
--- a/llvm/tools/obj2yaml/obj2yaml.h
+++ b/llvm/tools/obj2yaml/obj2yaml.h
@@ -41,6 +41,7 @@ struct Data;
}
void dumpDebugAbbrev(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
+llvm::Error dumpDebugAddr(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
llvm::Error dumpDebugARanges(llvm::DWARFContext &DCtx,
llvm::DWARFYAML::Data &Y);
void dumpDebugPubSections(llvm::DWARFContext &DCtx, llvm::DWARFYAML::Data &Y);
More information about the llvm-commits
mailing list