From 39285a0f02c7bc5e4bad8a684a900123b097511d Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 19 Nov 2019 09:55:17 +0100 Subject: [PATCH] Add streaming/equality operators to DWARFAddressRange/DWARFLocationExpression The main motivation for this is being able to write simpler assertions and get better error messages in unit tests. Split off from D70394. --- .../llvm/DebugInfo/DWARF/DWARFAddressRange.h | 9 +++++-- .../llvm/DebugInfo/DWARF/DWARFLocationExpression.h | 14 ++++++++++ llvm/lib/DebugInfo/DWARF/CMakeLists.txt | 1 + .../DebugInfo/DWARF/DWARFLocationExpression.cpp | 19 ++++++++++++++ llvm/unittests/DebugInfo/DWARF/CMakeLists.txt | 1 + .../DWARF/DWARFLocationExpressionTest.cpp | 30 ++++++++++++++++++++++ 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 llvm/lib/DebugInfo/DWARF/DWARFLocationExpression.cpp create mode 100644 llvm/unittests/DebugInfo/DWARF/DWARFLocationExpressionTest.cpp diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h index e171477..7a728c2 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h @@ -49,11 +49,16 @@ struct DWARFAddressRange { const DWARFObject *Obj = nullptr) const; }; -static inline bool operator<(const DWARFAddressRange &LHS, - const DWARFAddressRange &RHS) { +inline bool operator<(const DWARFAddressRange &LHS, + const DWARFAddressRange &RHS) { return std::tie(LHS.LowPC, LHS.HighPC) < std::tie(RHS.LowPC, RHS.HighPC); } +inline bool operator==(const DWARFAddressRange &LHS, + const DWARFAddressRange &RHS) { + return std::tie(LHS.LowPC, LHS.HighPC) == std::tie(RHS.LowPC, RHS.HighPC); +} + raw_ostream &operator<<(raw_ostream &OS, const DWARFAddressRange &R); /// DWARFAddressRangesVector - represents a set of absolute address ranges. diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h index 7bde33d..1522658 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFLocationExpression.h @@ -14,6 +14,8 @@ namespace llvm { +class raw_ostream; + /// Represents a single DWARF expression, whose value is location-dependent. /// Typically used in DW_AT_location attributes to describe the location of /// objects. @@ -27,6 +29,18 @@ struct DWARFLocationExpression { SmallVector Expr; }; +inline bool operator==(const DWARFLocationExpression &L, + const DWARFLocationExpression &R) { + return L.Range == R.Range && L.Expr == R.Expr; +} + +inline bool operator!=(const DWARFLocationExpression &L, + const DWARFLocationExpression &R) { + return !(L == R); +} + +raw_ostream &operator<<(raw_ostream &OS, const DWARFLocationExpression &Loc); + } // end namespace llvm #endif // LLVM_DEBUGINFO_DWARF_DWARFLOCATIONEXPRESSION_H diff --git a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt index b4770e5..fcfb00e 100644 --- a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt +++ b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt @@ -22,6 +22,7 @@ add_llvm_library(LLVMDebugInfoDWARF DWARFFormValue.cpp DWARFGdbIndex.cpp DWARFListTable.cpp + DWARFLocationExpression.cpp DWARFTypeUnit.cpp DWARFUnitIndex.cpp DWARFUnit.cpp diff --git a/llvm/lib/DebugInfo/DWARF/DWARFLocationExpression.cpp b/llvm/lib/DebugInfo/DWARF/DWARFLocationExpression.cpp new file mode 100644 index 0000000..1cf73a6 --- /dev/null +++ b/llvm/lib/DebugInfo/DWARF/DWARFLocationExpression.cpp @@ -0,0 +1,19 @@ +//===- DWARFLocationExpression.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/DebugInfo/DWARF/DWARFLocationExpression.h" +#include "llvm/ADT/iterator_range.h" +#include "llvm/Support/FormatVariadic.h" + +using namespace llvm; + +raw_ostream &llvm::operator<<(raw_ostream &OS, + const DWARFLocationExpression &Loc) { + return OS << Loc.Range << ": " + << formatv("{0}", make_range(Loc.Expr.begin(), Loc.Expr.end())); +} diff --git a/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt b/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt index d97e573..2181e05 100644 --- a/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt +++ b/llvm/unittests/DebugInfo/DWARF/CMakeLists.txt @@ -14,6 +14,7 @@ add_llvm_unittest(DebugInfoDWARFTests DWARFDebugInfoTest.cpp DWARFDebugLineTest.cpp DWARFFormValueTest.cpp + DWARFLocationExpressionTest.cpp ) target_link_libraries(DebugInfoDWARFTests PRIVATE LLVMTestingSupport) diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFLocationExpressionTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFLocationExpressionTest.cpp new file mode 100644 index 0000000..fb1dc3b --- /dev/null +++ b/llvm/unittests/DebugInfo/DWARF/DWARFLocationExpressionTest.cpp @@ -0,0 +1,30 @@ +//===- llvm/unittest/DebugInfo/DWARFLocationExpressionTest.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/DebugInfo/DWARF/DWARFLocationExpression.h" +#include "llvm/Support/ScopedPrinter.h" +#include "gtest/gtest.h" + +using namespace llvm; +using object::SectionedAddress; + +TEST(DWARFLocationExpression, Equality) { + EXPECT_EQ((DWARFLocationExpression{None, {}}), + (DWARFLocationExpression{None, {}})); + EXPECT_NE((DWARFLocationExpression{DWARFAddressRange{1, 47}, {}}), + (DWARFLocationExpression{DWARFAddressRange{1, 48}, {}})); + EXPECT_NE((DWARFLocationExpression{DWARFAddressRange{1, 47}, {}}), + (DWARFLocationExpression{DWARFAddressRange{1, 47}, {42}})); +} + +TEST(DWARFLocationExpression, StreamingOperator) { + EXPECT_EQ("None: 1, 2", to_string(DWARFLocationExpression{None, {1, 2}})); + EXPECT_EQ( + "[0x0000000000000042, 0x0000000000000047): 1", + to_string(DWARFLocationExpression{DWARFAddressRange{0x42, 0x47}, {1}})); +} -- 2.7.4