diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h index b36505760e466..97903a96b3fc4 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h @@ -362,6 +362,10 @@ class DWARFContext : public DIContext { 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 f902041670507..a6d44f04e4680 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 d5b016728c71d..a6dadd7f80212 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 0000000000000..9777911b726a4 Binary files /dev/null and b/llvm/test/DebugInfo/Inputs/dwarfdump-16bit-addr.o differ diff --git a/llvm/test/DebugInfo/dwarfdump-16bit-addr.test b/llvm/test/DebugInfo/dwarfdump-16bit-addr.test new file mode 100644 index 0000000000000..9c4dbca5215d1 --- /dev/null +++ b/llvm/test/DebugInfo/dwarfdump-16bit-addr.test @@ -0,0 +1,34 @@ +; Test that llvm-dwarfdump can handle DWARF32 v3 with addr_size = 0x02 +; Input object file was produced from source containing just "int x;" with +; clang -target avr -gdwarf-3 -c dwarfdump-16bit-addr.c + +; REQUIRES: avr-registered-target +; RUN: llvm-dwarfdump --debug-info %S/Inputs/dwarfdump-16bit-addr.o | FileCheck %s +; RUN: llvm-dwarfdump --verify %S/Inputs/dwarfdump-16bit-addr.o + +; CHECK: Inputs/dwarfdump-16bit-addr.o: file format elf32-avr + +; CHECK: .debug_info contents: +; CHECK: 0x00000000: Compile Unit: length = 0x00000032, format = DWARF32, version = 0x0003, abbr_offset = 0x0000, addr_size = 0x02 (next unit at 0x00000036) + +; CHECK: 0x0000000b: DW_TAG_compile_unit +; CHECK: DW_AT_producer ("clang version 10.0.0-4ubuntu1 ") +; CHECK: DW_AT_language (DW_LANG_C99) +; CHECK: DW_AT_name ("dwarfdump-16bit-addr.c") +; CHECK: DW_AT_stmt_list (0x00000000) +; CHECK: DW_AT_comp_dir ("/tmp") + +; CHECK: 0x0000001e: DW_TAG_variable +; CHECK: DW_AT_name ("x") +; CHECK: DW_AT_type (0x0000002e "int") +; CHECK: DW_AT_external (0x01) +; CHECK: DW_AT_decl_file ("/tmp{{[/\\]}}dwarfdump-16bit-addr.c") +; CHECK: DW_AT_decl_line (1) +; CHECK: DW_AT_location (DW_OP_addr 0x0) + +; CHECK: 0x0000002e: DW_TAG_base_type +; CHECK: DW_AT_name ("int") +; CHECK: DW_AT_encoding (DW_ATE_signed) +; CHECK: DW_AT_byte_size (0x02) + +; CHECK: 0x00000035: NULL