From 72d2929c52a9b691a2ed10c28a0a27fec8282519 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Wed, 20 Nov 2019 15:13:34 +0100 Subject: [PATCH] Revert "[DWARF] Add an api to get "interpreted" location lists" The test fails on big endian machines. This reverts commit 089c0f581492cd6e2a3d2927be3fbf60ea2d7e62 and the subsequent attempt to fix in 82dc32e2d456c75d08bc9ffe97def409ee5a03cd. --- .../llvm/DebugInfo/DWARF/DWARFDebugLoc.h | 5 - llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h | 4 - .../DebugInfo/DWARF/DWARFLocationExpression.h | 3 - llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h | 3 - llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp | 15 --- llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 21 ---- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 24 ---- llvm/lib/ObjectYAML/DWARFEmitter.cpp | 5 +- llvm/unittests/DebugInfo/DWARF/CMakeLists.txt | 1 - .../DebugInfo/DWARF/DWARFDieTest.cpp | 118 ------------------ 10 files changed, 1 insertion(+), 198 deletions(-) delete mode 100644 llvm/unittests/DebugInfo/DWARF/DWARFDieTest.cpp diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h index 8ac3e2add882..2ca98cfcfff7 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h @@ -63,11 +63,6 @@ public: const MCRegisterInfo *MRI, DWARFUnit *U, DIDumpOptions DumpOpts, unsigned Indent) const; - Error visitAbsoluteLocationList( - uint64_t Offset, Optional BaseAddr, - std::function(uint32_t)> LookupAddr, - function_ref)> Callback) const; - protected: DWARFDataExtractor Data; diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h index 158bd82edee0..52a0247b3e42 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h @@ -18,7 +18,6 @@ #include "llvm/DebugInfo/DWARF/DWARFAddressRange.h" #include "llvm/DebugInfo/DWARF/DWARFAttribute.h" #include "llvm/DebugInfo/DWARF/DWARFDebugInfoEntry.h" -#include "llvm/DebugInfo/DWARF/DWARFDebugLoc.h" #include #include #include @@ -232,9 +231,6 @@ public: bool addressRangeContainsAddress(const uint64_t Address) const; - Expected - getLocations(dwarf::Attribute Attr) const; - /// If a DIE represents a subprogram (or inlined subroutine), returns its /// mangled name (or short name, if mangled is missing). This name may be /// fetched from specification or abstract origin for this subprogram. diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h index 35aa1a78e129..1522658ead75 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h @@ -41,9 +41,6 @@ inline bool operator!=(const DWARFLocationExpression &L, raw_ostream &operator<<(raw_ostream &OS, const DWARFLocationExpression &Loc); -/// Represents a set of absolute location expressions. -using DWARFLocationExpressionsVector = std::vector; - } // end namespace llvm #endif // LLVM_DEBUGINFO_DWARF_DWARFLOCATIONEXPRESSION_H diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h index 98d7a7ee3cae..d0a8533d1e34 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -439,9 +439,6 @@ public: } Expected collectAddressRanges(); - Expected - findLoclistFromOffset(uint64_t Offset); - /// Returns subprogram DIE with address range encompassing the provided /// address. The pointer is alive as long as parsed compile unit DIEs are not /// cleared. diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp index 8b84822914d3..1af51a85d18d 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp @@ -151,21 +151,6 @@ bool DWARFLocationTable::dumpLocationList(uint64_t *Offset, raw_ostream &OS, return true; } -Error DWARFLocationTable::visitAbsoluteLocationList( - uint64_t Offset, Optional BaseAddr, - std::function(uint32_t)> LookupAddr, - function_ref)> Callback) const { - DWARFLocationInterpreter Interp(BaseAddr, std::move(LookupAddr)); - return visitLocationList(&Offset, [&](const DWARFLocationEntry &E) { - Expected> Loc = Interp.Interpret(E); - if (!Loc) - return Callback(Loc.takeError()); - if (*Loc) - return Callback(**Loc); - return true; - }); -} - DWARFDebugLoc::LocationList const * DWARFDebugLoc::getLocationListAtOffset(uint64_t Offset) const { auto It = partition_point( diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index 6cf30270539b..a11865e048c5 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -486,27 +486,6 @@ bool DWARFDie::addressRangeContainsAddress(const uint64_t Address) const { return false; } -Expected -DWARFDie::getLocations(dwarf::Attribute Attr) const { - Optional Location = find(Attr); - if (!Location) - return createStringError(inconvertibleErrorCode(), "No %s", - dwarf::AttributeString(Attr).data()); - - if (Optional Off = Location->getAsSectionOffset()) - return U->findLoclistFromOffset(*Off); - - if (Optional> Expr = Location->getAsBlock()) { - return DWARFLocationExpressionsVector{ - DWARFLocationExpression{None, to_vector<4>(*Expr)}}; - } - - return createStringError( - inconvertibleErrorCode(), "Unsupported %s encoding: %s", - dwarf::AttributeString(Attr).data(), - dwarf::FormEncodingString(Location->getForm()).data()); -} - const char *DWARFDie::getSubroutineName(DINameKind Kind) const { if (!isSubroutineDIE()) return nullptr; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index e5d33e136445..2eb7d2f945a3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -637,30 +637,6 @@ Expected DWARFUnit::collectAddressRanges() { return *CUDIERangesOrError; } -Expected -DWARFUnit::findLoclistFromOffset(uint64_t Offset) { - DWARFLocationExpressionsVector Result; - - Error InterpretationError = Error::success(); - - Error ParseError = getLocationTable().visitAbsoluteLocationList( - Offset, getBaseAddress(), - [this](uint32_t Index) { return getAddrOffsetSectionItem(Index); }, - [&](Expected L) { - if (L) - Result.push_back(std::move(*L)); - else - InterpretationError = - joinErrors(L.takeError(), std::move(InterpretationError)); - return !InterpretationError; - }); - - if (ParseError || InterpretationError) - return joinErrors(std::move(ParseError), std::move(InterpretationError)); - - return Result; -} - void DWARFUnit::updateAddressDieMap(DWARFDie Die) { if (Die.isSubroutineDIE()) { auto DIERangesOrError = Die.getAddressRanges(); diff --git a/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/llvm/lib/ObjectYAML/DWARFEmitter.cpp index b410fed16f09..2ae66997cf59 100644 --- a/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ b/llvm/lib/ObjectYAML/DWARFEmitter.cpp @@ -314,10 +314,7 @@ public: DIEFixupVisitor(DWARFYAML::Data &DI) : DWARFYAML::Visitor(DI){}; private: - virtual void onStartCompileUnit(DWARFYAML::Unit &CU) { - // Size of the unit header, excluding the length field itself. - Length = CU.Version >= 5 ? 8 : 7; - } + virtual void onStartCompileUnit(DWARFYAML::Unit &CU) { Length = 7; } virtual void onEndCompileUnit(DWARFYAML::Unit &CU) { CU.Length.setLength(Length); diff --git a/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt b/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt index 4fb79b2a96e9..2181e0543d04 100644 --- a/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt +++ b/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt @@ -13,7 +13,6 @@ add_llvm_unittest(DebugInfoDWARFTests DwarfUtils.cpp DWARFDebugInfoTest.cpp DWARFDebugLineTest.cpp - DWARFDieTest.cpp DWARFFormValueTest.cpp DWARFLocationExpressionTest.cpp ) diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDieTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDieTest.cpp deleted file mode 100644 index 6296f872433e..000000000000 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDieTest.cpp +++ /dev/null @@ -1,118 +0,0 @@ -//===- llvm/unittest/DebugInfo/DWARFDieTest.cpp ---------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "llvm/BinaryFormat/Dwarf.h" -#include "llvm/DebugInfo/DWARF/DWARFContext.h" -#include "llvm/ObjectYAML/DWARFEmitter.h" -#include "llvm/Testing/Support/Error.h" -#include "gtest/gtest.h" - -using namespace llvm; -using namespace llvm::dwarf; -using object::SectionedAddress; - -namespace { - -TEST(DWARFLocationTable, getLocations) { - const char *yamldata = R"( - debug_abbrev: - - Code: 0x00000001 - Tag: DW_TAG_compile_unit - Children: DW_CHILDREN_no - Attributes: - - Attribute: DW_AT_location - Form: DW_FORM_sec_offset - - Attribute: DW_AT_data_member_location - Form: DW_FORM_exprloc - - Attribute: DW_AT_vtable_elem_location - Form: DW_FORM_sec_offset - - Attribute: DW_AT_call_data_location - Form: DW_FORM_sec_offset - debug_info: - - Length: - TotalLength: 0 - Version: 5 - UnitType: DW_UT_compile - AbbrOffset: 0 - AddrSize: 4 - Entries: - - AbbrCode: 0x00000001 - Values: - - Value: 12 - - Value: 0x0000000000000001 - BlockData: [ 0x47 ] - - Value: 20 - - Value: 25 - )"; - Expected>> Sections = - DWARFYAML::EmitDebugSections(StringRef(yamldata), - /*IsLittleEndian=*/true); - ASSERT_THAT_EXPECTED(Sections, Succeeded()); - std::vector Loclists{ - // Header - 0, 0, 0, 0, // Length - 5, 0, // Version - 4, // Address size - 0, // Segment selector size - 0, 0, 0, 0, // Offset entry count - // First location list. - DW_LLE_start_length, // First entry - 1, 0, 0, 0, // Start offset - 2, // Length - 0, // Expression length - DW_LLE_end_of_list, - // Second location list. - DW_LLE_startx_length, // First entry - 1, // Start index - 2, // Length - 0, // Expression length - DW_LLE_end_of_list, - // Third location list. - DW_LLE_start_length, // First entry - 1, 0, 0, 0, // Start offset - 2, // Length - 0, // Expression length - // end_of_list intentionally missing - }; - Loclists[0] = Loclists.size() - 4; - Sections->try_emplace( - "debug_loclists", - MemoryBuffer::getMemBuffer(toStringRef(Loclists), "debug_loclists", - /*RequiresNullTerminator=*/false)); - std::unique_ptr Ctx = - DWARFContext::create(*Sections, 4, /*isLittleEndian=*/true); - DWARFCompileUnit *CU = Ctx->getCompileUnitForOffset(0); - ASSERT_NE(nullptr, CU); - DWARFDie Die = CU->getUnitDIE(); - ASSERT_TRUE(Die.isValid()); - - EXPECT_THAT_EXPECTED(Die.getLocations(DW_AT_location), - HasValue(testing::ElementsAre(DWARFLocationExpression{ - DWARFAddressRange{1, 3}, {}}))); - - EXPECT_THAT_EXPECTED( - Die.getLocations(DW_AT_data_member_location), - HasValue(testing::ElementsAre(DWARFLocationExpression{None, {0x47}}))); - - EXPECT_THAT_EXPECTED( - Die.getLocations(DW_AT_vtable_elem_location), - Failed(testing::Property( - &ErrorInfoBase::message, - "Unable to resolve indirect address 1 for: DW_LLE_startx_length"))); - - EXPECT_THAT_EXPECTED(Die.getLocations(DW_AT_call_data_location), - Failed(testing::Property( - &ErrorInfoBase::message, "unexpected end of data"))); - - EXPECT_THAT_EXPECTED( - Die.getLocations(DW_AT_call_data_value), - Failed(testing::Property(&ErrorInfoBase::message, - "No DW_AT_call_data_value"))); -} - -} // end anonymous namespace