From 359fae6eb094e8eacc466b9ce5802563771a3cb9 Mon Sep 17 00:00:00 2001 From: Anatoly Trosinenko Date: Mon, 22 Jun 2020 13:08:20 +0300 Subject: [PATCH] [DebugInfo] Explicitly permit addr_size = 0x02 when parsing DWARF data Current LLVM implementation uses `MCAsmInfo::CodePointerSize` as addr_size when emitting the DWARF data. llvm-dwarfdump, on the other hand, handles `addr_size`s of 4 and 8 properly and considers all other sizes as an error. This works for most of mainline targets except for MSP430 and AVR. msp430-gcc v8.3.1 emits DWARF32 with addr_size = 4 (DWARF32 does not imply addr_size = 4, 32 refers to internal offset width of 4 bytes) that is handled by llvm-dwarfdump already. Still, emitting 2-byte target pointers on MSP430 seems correct as well (but not for MSP430X that is supported by msp430-gcc but not by LLVM and has 20-bit address space). This patch make it possible for MSP430 debug info support to be tested with llvm-dwarfdump. Differential Revision: https://reviews.llvm.org/D82055 --- llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h | 4 +++ llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 2 +- llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 2 +- llvm/test/DebugInfo/Inputs/dwarfdump-16bit-addr.o | Bin 0 -> 1044 bytes llvm/test/DebugInfo/dwarfdump-16bit-addr.test | 34 ++++++++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 llvm/test/DebugInfo/Inputs/dwarfdump-16bit-addr.o create mode 100644 llvm/test/DebugInfo/dwarfdump-16bit-addr.test diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h index b36505760e4..97903a96b3f 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h @@ -362,6 +362,10 @@ public: return version == 2 || version == 3 || version == 4 || version == 5; } + static bool isAddressSizeSupported(unsigned AddressSize) { + return AddressSize == 2 || AddressSize == 4 || AddressSize == 8; + } + std::shared_ptr getDWOContext(StringRef AbsolutePath); const MCRegisterInfo *getRegisterInfo() const { return RegInfo.get(); } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index f9020416705..a6d44f04e46 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -300,7 +300,7 @@ bool DWARFUnitHeader::extract(DWARFContext &Context, TypeOffset < getLength() + getUnitLengthFieldByteSize(); bool LengthOK = debug_info.isValidOffset(getNextUnitOffset() - 1); bool VersionOK = DWARFContext::isSupportedVersion(getVersion()); - bool AddrSizeOK = getAddressByteSize() == 4 || getAddressByteSize() == 8; + bool AddrSizeOK = DWARFContext::isAddressSizeSupported(getAddressByteSize()); if (!LengthOK || !VersionOK || !AddrSizeOK || !TypeOffsetOK) return false; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index d5b016728c7..a6dadd7f802 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -133,7 +133,7 @@ bool DWARFVerifier::verifyUnitHeader(const DWARFDataExtractor DebugInfoData, ValidLength = DebugInfoData.isValidOffset(OffsetStart + Length + 3); ValidVersion = DWARFContext::isSupportedVersion(Version); - ValidAddrSize = AddrSize == 4 || AddrSize == 8; + ValidAddrSize = DWARFContext::isAddressSizeSupported(AddrSize); if (!ValidLength || !ValidVersion || !ValidAddrSize || !ValidAbbrevOffset || !ValidType) { Success = false; diff --git a/llvm/test/DebugInfo/Inputs/dwarfdump-16bit-addr.o b/llvm/test/DebugInfo/Inputs/dwarfdump-16bit-addr.o new file mode 100644 index 0000000000000000000000000000000000000000..9777911b726a49e32f43948d827069f1eaba61c2 GIT binary patch literal 1044 zcma)4O^ee|6uqynoxw>Btpf_WunQFzHZ#>Sf`f{Jf-nogtq_wYQvzvH@=-g?Vg~dF zi2uM}<=;@ZF6uc+o(6Hi)82Q_z31lL_jUH-=%rFh43xZ)Kat4CjtKrTtqShS4%Auf zCG*iL%O-VmgC8R9~EOS2r_3Td&OcYYl)IV)KJ~F zcYE3%Y~8Ri|5UX7YWHdXk#%Twc0}|oB%WB7g{Jpmx@z80Tu8rK4q0U!92oYXQKlL9 zI`RNc%eWGL+LtMFS1@(a`XK)UZ(F&peBZP}G^iJ5a$35ER$j}tTx(?p;2-{qn^jet z8Oo2%7If82+b8FSfGaTaoA6i3n^xDG`~f^Q)*Qm$gLStt0DCazA2V2s6NG*_cRki5zw96aR+8``r4LXGsiUN6NF=t@32@+-v)ILFY2Y(6HgHhw%zlND_K;