From c0fc29c4684a997d282bfed71eb4d903ad16ee25 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 19 Nov 2019 09:54:24 +0100 Subject: [PATCH] Add operator<< for object::SectionedAddress The main motivation for this is better failure messages in unit tests. Split off from D70394. --- llvm/include/llvm/Object/ObjectFile.h | 2 ++ llvm/lib/Object/ObjectFile.cpp | 7 +++++++ llvm/unittests/Object/CMakeLists.txt | 1 + llvm/unittests/Object/ObjectFileTest.cpp | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 llvm/unittests/Object/ObjectFileTest.cpp diff --git a/llvm/include/llvm/Object/ObjectFile.h b/llvm/include/llvm/Object/ObjectFile.h index adc9dbc189af7..2f14934576059 100644 --- a/llvm/include/llvm/Object/ObjectFile.h +++ b/llvm/include/llvm/Object/ObjectFile.h @@ -155,6 +155,8 @@ inline bool operator==(const SectionedAddress &LHS, std::tie(RHS.SectionIndex, RHS.Address); } +raw_ostream &operator<<(raw_ostream &OS, const SectionedAddress &Addr); + /// This is a value type class that represents a single symbol in the list of /// symbols in the object file. class SymbolRef : public BasicSymbolRef { diff --git a/llvm/lib/Object/ObjectFile.cpp b/llvm/lib/Object/ObjectFile.cpp index e0e63a5a7d766..098b3d8f8dd05 100644 --- a/llvm/lib/Object/ObjectFile.cpp +++ b/llvm/lib/Object/ObjectFile.cpp @@ -32,6 +32,13 @@ using namespace llvm; using namespace object; +raw_ostream &object::operator<<(raw_ostream &OS, const SectionedAddress &Addr) { + OS << "SectionedAddress{" << format_hex(Addr.Address, 10); + if (Addr.SectionIndex != SectionedAddress::UndefSection) + OS << ", " << Addr.SectionIndex; + return OS << "}"; +} + void ObjectFile::anchor() {} ObjectFile::ObjectFile(unsigned int Type, MemoryBufferRef Source) diff --git a/llvm/unittests/Object/CMakeLists.txt b/llvm/unittests/Object/CMakeLists.txt index e0be1ba2b2fd1..809515a2e78ad 100644 --- a/llvm/unittests/Object/CMakeLists.txt +++ b/llvm/unittests/Object/CMakeLists.txt @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS add_llvm_unittest(ObjectTests MinidumpTest.cpp + ObjectFileTest.cpp SymbolSizeTest.cpp SymbolicFileTest.cpp ) diff --git a/llvm/unittests/Object/ObjectFileTest.cpp b/llvm/unittests/Object/ObjectFileTest.cpp new file mode 100644 index 0000000000000..7309c2c25287c --- /dev/null +++ b/llvm/unittests/Object/ObjectFileTest.cpp @@ -0,0 +1,20 @@ +//===- ObjectFileTest.cpp - Tests for ObjectFile.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/Object/ObjectFile.h" +#include "llvm/Support/ScopedPrinter.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace llvm::object; + +TEST(SectionedAddress, StreamingOperator) { + EXPECT_EQ("SectionedAddress{0x00000047}", to_string(SectionedAddress{0x47})); + EXPECT_EQ("SectionedAddress{0x00000047, 42}", + to_string(SectionedAddress{0x47, 42})); +}