diff options
| author | Pavel Labath <pavel@labath.sk> | 2019-11-19 09:55:17 +0100 |
|---|---|---|
| committer | Pavel Labath <pavel@labath.sk> | 2019-11-19 10:34:30 +0100 |
| commit | 39285a0f02c7bc5e4bad8a684a900123b097511d (patch) | |
| tree | 6b14401600399599c216ead35018b2bd1c20d1dc | |
| parent | c0fc29c4684a997d282bfed71eb4d903ad16ee25 (diff) | |
| download | bcm5719-llvm-39285a0f02c7bc5e4bad8a684a900123b097511d.tar.gz bcm5719-llvm-39285a0f02c7bc5e4bad8a684a900123b097511d.zip | |
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.
6 files changed, 72 insertions, 2 deletions
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFAddressRange.h index e171477310a..7a728c2508c 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 7bde33d394f..1522658ead7 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<uint8_t, 4> 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 b4770e561f7..fcfb00e8e5f 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 00000000000..1cf73a66677 --- /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 d97e573ea38..2181e0543d0 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 00000000000..fb1dc3bd280 --- /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}})); +} |

