diff options
author | Craig Topper <craig.topper@sifive.com> | 2021-01-27 10:21:47 -0800 |
---|---|---|
committer | Craig Topper <craig.topper@sifive.com> | 2021-01-27 10:39:59 -0800 |
commit | 0b50fa99452f7f3077e62348b6cf6850a65930af (patch) | |
tree | 0888dcdee3534cc0daf3f553644da8fd3151415a | |
parent | 74c87a363fd0e8586e46c04e113c49c6dc2a0bc8 (diff) | |
download | llvm-0b50fa99452f7f3077e62348b6cf6850a65930af.zip llvm-0b50fa99452f7f3077e62348b6cf6850a65930af.tar.gz llvm-0b50fa99452f7f3077e62348b6cf6850a65930af.tar.bz2 |
[FaultsMaps][llvm-objdump] Move FaultMapParser to Object/. Remove CodeGen dependency from llvm-objdump
FaultsMapParser lived in CodeGen and was forcing llvm-objdump to
link CodeGen and everything CodeGen depends on.
This was previously attempted in r240364 to fix a link failure.
The CodeGen dependency was independently added to fix the same
link failure, and that ended up being kept.
Removing the dependency seems like the correct layering for
llvm-objdump.
Reviewed By: MaskRay, jhenderson
Differential Revision: https://reviews.llvm.org/D95414
-rw-r--r-- | llvm/include/llvm/CodeGen/FaultMaps.h | 140 | ||||
-rw-r--r-- | llvm/include/llvm/Object/FaultMapParser.h | 167 | ||||
-rw-r--r-- | llvm/lib/CodeGen/FaultMaps.cpp | 38 | ||||
-rw-r--r-- | llvm/lib/Object/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Object/FaultMapParser.cpp | 66 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 2 |
7 files changed, 235 insertions, 180 deletions
diff --git a/llvm/include/llvm/CodeGen/FaultMaps.h b/llvm/include/llvm/CodeGen/FaultMaps.h index da56c4d..12d2872 100644 --- a/llvm/include/llvm/CodeGen/FaultMaps.h +++ b/llvm/include/llvm/CodeGen/FaultMaps.h @@ -11,9 +11,6 @@ #include "llvm/MC/MCSymbol.h" #include "llvm/Support/Endian.h" -#include <cassert> -#include <cstddef> -#include <cstdint> #include <map> #include <vector> @@ -76,143 +73,6 @@ private: void emitFunctionInfo(const MCSymbol *FnLabel, const FunctionFaultInfos &FFI); }; -/// A parser for the __llvm_faultmaps section generated by the FaultMaps class -/// above. This parser is version locked with with the __llvm_faultmaps section -/// generated by the version of LLVM that includes it. No guarantees are made -/// with respect to forward or backward compatibility. -class FaultMapParser { - using FaultMapVersionType = uint8_t; - using Reserved0Type = uint8_t; - using Reserved1Type = uint16_t; - using NumFunctionsType = uint32_t; - - static const size_t FaultMapVersionOffset = 0; - static const size_t Reserved0Offset = - FaultMapVersionOffset + sizeof(FaultMapVersionType); - static const size_t Reserved1Offset = Reserved0Offset + sizeof(Reserved0Type); - static const size_t NumFunctionsOffset = - Reserved1Offset + sizeof(Reserved1Type); - static const size_t FunctionInfosOffset = - NumFunctionsOffset + sizeof(NumFunctionsType); - - const uint8_t *P; - const uint8_t *E; - - template <typename T> static T read(const uint8_t *P, const uint8_t *E) { - assert(P + sizeof(T) <= E && "out of bounds read!"); - return support::endian::read<T, support::little, 1>(P); - } - -public: - class FunctionFaultInfoAccessor { - using FaultKindType = uint32_t; - using FaultingPCOffsetType = uint32_t; - using HandlerPCOffsetType = uint32_t; - - static const size_t FaultKindOffset = 0; - static const size_t FaultingPCOffsetOffset = - FaultKindOffset + sizeof(FaultKindType); - static const size_t HandlerPCOffsetOffset = - FaultingPCOffsetOffset + sizeof(FaultingPCOffsetType); - - const uint8_t *P; - const uint8_t *E; - - public: - static const size_t Size = - HandlerPCOffsetOffset + sizeof(HandlerPCOffsetType); - - explicit FunctionFaultInfoAccessor(const uint8_t *P, const uint8_t *E) - : P(P), E(E) {} - - FaultKindType getFaultKind() const { - return read<FaultKindType>(P + FaultKindOffset, E); - } - - FaultingPCOffsetType getFaultingPCOffset() const { - return read<FaultingPCOffsetType>(P + FaultingPCOffsetOffset, E); - } - - HandlerPCOffsetType getHandlerPCOffset() const { - return read<HandlerPCOffsetType>(P + HandlerPCOffsetOffset, E); - } - }; - - class FunctionInfoAccessor { - using FunctionAddrType = uint64_t; - using NumFaultingPCsType = uint32_t; - using ReservedType = uint32_t; - - static const size_t FunctionAddrOffset = 0; - static const size_t NumFaultingPCsOffset = - FunctionAddrOffset + sizeof(FunctionAddrType); - static const size_t ReservedOffset = - NumFaultingPCsOffset + sizeof(NumFaultingPCsType); - static const size_t FunctionFaultInfosOffset = - ReservedOffset + sizeof(ReservedType); - static const size_t FunctionInfoHeaderSize = FunctionFaultInfosOffset; - - const uint8_t *P = nullptr; - const uint8_t *E = nullptr; - - public: - FunctionInfoAccessor() = default; - - explicit FunctionInfoAccessor(const uint8_t *P, const uint8_t *E) - : P(P), E(E) {} - - FunctionAddrType getFunctionAddr() const { - return read<FunctionAddrType>(P + FunctionAddrOffset, E); - } - - NumFaultingPCsType getNumFaultingPCs() const { - return read<NumFaultingPCsType>(P + NumFaultingPCsOffset, E); - } - - FunctionFaultInfoAccessor getFunctionFaultInfoAt(uint32_t Index) const { - assert(Index < getNumFaultingPCs() && "index out of bounds!"); - const uint8_t *Begin = P + FunctionFaultInfosOffset + - FunctionFaultInfoAccessor::Size * Index; - return FunctionFaultInfoAccessor(Begin, E); - } - - FunctionInfoAccessor getNextFunctionInfo() const { - size_t MySize = FunctionInfoHeaderSize + - getNumFaultingPCs() * FunctionFaultInfoAccessor::Size; - - const uint8_t *Begin = P + MySize; - assert(Begin < E && "out of bounds!"); - return FunctionInfoAccessor(Begin, E); - } - }; - - explicit FaultMapParser(const uint8_t *Begin, const uint8_t *End) - : P(Begin), E(End) {} - - FaultMapVersionType getFaultMapVersion() const { - auto Version = read<FaultMapVersionType>(P + FaultMapVersionOffset, E); - assert(Version == 1 && "only version 1 supported!"); - return Version; - } - - NumFunctionsType getNumFunctions() const { - return read<NumFunctionsType>(P + NumFunctionsOffset, E); - } - - FunctionInfoAccessor getFirstFunctionInfo() const { - const uint8_t *Begin = P + FunctionInfosOffset; - return FunctionInfoAccessor(Begin, E); - } -}; - -raw_ostream & -operator<<(raw_ostream &OS, const FaultMapParser::FunctionFaultInfoAccessor &); - -raw_ostream &operator<<(raw_ostream &OS, - const FaultMapParser::FunctionInfoAccessor &); - -raw_ostream &operator<<(raw_ostream &OS, const FaultMapParser &); - } // end namespace llvm #endif // LLVM_CODEGEN_FAULTMAPS_H diff --git a/llvm/include/llvm/Object/FaultMapParser.h b/llvm/include/llvm/Object/FaultMapParser.h new file mode 100644 index 0000000..4d1f039 --- /dev/null +++ b/llvm/include/llvm/Object/FaultMapParser.h @@ -0,0 +1,167 @@ +//===-- FaultMapParser.h - Parser for the "FaultMaps" section --*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_OBJECT_FAULTMAPPARSER_H +#define LLVM_OBJECT_FAULTMAPPARSER_H + +#include "llvm/Support/Endian.h" +#include <cassert> +#include <cstdint> + +namespace llvm { + +class raw_ostream; + +/// A parser for the __llvm_faultmaps section generated by the FaultMaps class +/// declared in llvm/CodeGen/FaultMaps.h. This parser is version locked with +/// with the __llvm_faultmaps section generated by the version of LLVM that +/// includes it. No guarantees are made with respect to forward or backward +/// compatibility. +class FaultMapParser { + using FaultMapVersionType = uint8_t; + using Reserved0Type = uint8_t; + using Reserved1Type = uint16_t; + using NumFunctionsType = uint32_t; + + static const size_t FaultMapVersionOffset = 0; + static const size_t Reserved0Offset = + FaultMapVersionOffset + sizeof(FaultMapVersionType); + static const size_t Reserved1Offset = Reserved0Offset + sizeof(Reserved0Type); + static const size_t NumFunctionsOffset = + Reserved1Offset + sizeof(Reserved1Type); + static const size_t FunctionInfosOffset = + NumFunctionsOffset + sizeof(NumFunctionsType); + + const uint8_t *P; + const uint8_t *E; + + template <typename T> static T read(const uint8_t *P, const uint8_t *E) { + assert(P + sizeof(T) <= E && "out of bounds read!"); + return support::endian::read<T, support::little, 1>(P); + } + +public: + enum FaultKind { + FaultingLoad = 1, + FaultingLoadStore, + FaultingStore, + FaultKindMax + }; + + class FunctionFaultInfoAccessor { + using FaultKindType = uint32_t; + using FaultingPCOffsetType = uint32_t; + using HandlerPCOffsetType = uint32_t; + + static const size_t FaultKindOffset = 0; + static const size_t FaultingPCOffsetOffset = + FaultKindOffset + sizeof(FaultKindType); + static const size_t HandlerPCOffsetOffset = + FaultingPCOffsetOffset + sizeof(FaultingPCOffsetType); + + const uint8_t *P; + const uint8_t *E; + + public: + static const size_t Size = + HandlerPCOffsetOffset + sizeof(HandlerPCOffsetType); + + explicit FunctionFaultInfoAccessor(const uint8_t *P, const uint8_t *E) + : P(P), E(E) {} + + FaultKindType getFaultKind() const { + return read<FaultKindType>(P + FaultKindOffset, E); + } + + FaultingPCOffsetType getFaultingPCOffset() const { + return read<FaultingPCOffsetType>(P + FaultingPCOffsetOffset, E); + } + + HandlerPCOffsetType getHandlerPCOffset() const { + return read<HandlerPCOffsetType>(P + HandlerPCOffsetOffset, E); + } + }; + + class FunctionInfoAccessor { + using FunctionAddrType = uint64_t; + using NumFaultingPCsType = uint32_t; + using ReservedType = uint32_t; + + static const size_t FunctionAddrOffset = 0; + static const size_t NumFaultingPCsOffset = + FunctionAddrOffset + sizeof(FunctionAddrType); + static const size_t ReservedOffset = + NumFaultingPCsOffset + sizeof(NumFaultingPCsType); + static const size_t FunctionFaultInfosOffset = + ReservedOffset + sizeof(ReservedType); + static const size_t FunctionInfoHeaderSize = FunctionFaultInfosOffset; + + const uint8_t *P = nullptr; + const uint8_t *E = nullptr; + + public: + FunctionInfoAccessor() = default; + + explicit FunctionInfoAccessor(const uint8_t *P, const uint8_t *E) + : P(P), E(E) {} + + FunctionAddrType getFunctionAddr() const { + return read<FunctionAddrType>(P + FunctionAddrOffset, E); + } + + NumFaultingPCsType getNumFaultingPCs() const { + return read<NumFaultingPCsType>(P + NumFaultingPCsOffset, E); + } + + FunctionFaultInfoAccessor getFunctionFaultInfoAt(uint32_t Index) const { + assert(Index < getNumFaultingPCs() && "index out of bounds!"); + const uint8_t *Begin = P + FunctionFaultInfosOffset + + FunctionFaultInfoAccessor::Size * Index; + return FunctionFaultInfoAccessor(Begin, E); + } + + FunctionInfoAccessor getNextFunctionInfo() const { + size_t MySize = FunctionInfoHeaderSize + + getNumFaultingPCs() * FunctionFaultInfoAccessor::Size; + + const uint8_t *Begin = P + MySize; + assert(Begin < E && "out of bounds!"); + return FunctionInfoAccessor(Begin, E); + } + }; + + explicit FaultMapParser(const uint8_t *Begin, const uint8_t *End) + : P(Begin), E(End) {} + + FaultMapVersionType getFaultMapVersion() const { + auto Version = read<FaultMapVersionType>(P + FaultMapVersionOffset, E); + assert(Version == 1 && "only version 1 supported!"); + return Version; + } + + NumFunctionsType getNumFunctions() const { + return read<NumFunctionsType>(P + NumFunctionsOffset, E); + } + + FunctionInfoAccessor getFirstFunctionInfo() const { + const uint8_t *Begin = P + FunctionInfosOffset; + return FunctionInfoAccessor(Begin, E); + } +}; + +raw_ostream &operator<<(raw_ostream &OS, + const FaultMapParser::FunctionFaultInfoAccessor &); + +raw_ostream &operator<<(raw_ostream &OS, + const FaultMapParser::FunctionInfoAccessor &); + +raw_ostream &operator<<(raw_ostream &OS, const FaultMapParser &); + +} // namespace llvm + +#endif diff --git a/llvm/lib/CodeGen/FaultMaps.cpp b/llvm/lib/CodeGen/FaultMaps.cpp index 23560b4..1d35b19 100644 --- a/llvm/lib/CodeGen/FaultMaps.cpp +++ b/llvm/lib/CodeGen/FaultMaps.cpp @@ -15,8 +15,6 @@ #include "llvm/MC/MCStreamer.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/Format.h" -#include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -114,39 +112,3 @@ const char *FaultMaps::faultTypeToString(FaultMaps::FaultKind FT) { return "FaultingStore"; } } - -raw_ostream &llvm:: -operator<<(raw_ostream &OS, - const FaultMapParser::FunctionFaultInfoAccessor &FFI) { - OS << "Fault kind: " - << FaultMaps::faultTypeToString((FaultMaps::FaultKind)FFI.getFaultKind()) - << ", faulting PC offset: " << FFI.getFaultingPCOffset() - << ", handling PC offset: " << FFI.getHandlerPCOffset(); - return OS; -} - -raw_ostream &llvm:: -operator<<(raw_ostream &OS, const FaultMapParser::FunctionInfoAccessor &FI) { - OS << "FunctionAddress: " << format_hex(FI.getFunctionAddr(), 8) - << ", NumFaultingPCs: " << FI.getNumFaultingPCs() << "\n"; - for (unsigned i = 0, e = FI.getNumFaultingPCs(); i != e; ++i) - OS << FI.getFunctionFaultInfoAt(i) << "\n"; - return OS; -} - -raw_ostream &llvm::operator<<(raw_ostream &OS, const FaultMapParser &FMP) { - OS << "Version: " << format_hex(FMP.getFaultMapVersion(), 2) << "\n"; - OS << "NumFunctions: " << FMP.getNumFunctions() << "\n"; - - if (FMP.getNumFunctions() == 0) - return OS; - - FaultMapParser::FunctionInfoAccessor FI; - - for (unsigned i = 0, e = FMP.getNumFunctions(); i != e; ++i) { - FI = (i == 0) ? FMP.getFirstFunctionInfo() : FI.getNextFunctionInfo(); - OS << FI; - } - - return OS; -} diff --git a/llvm/lib/Object/CMakeLists.txt b/llvm/lib/Object/CMakeLists.txt index 5b98ee4..d5f1235 100644 --- a/llvm/lib/Object/CMakeLists.txt +++ b/llvm/lib/Object/CMakeLists.txt @@ -9,6 +9,7 @@ add_llvm_component_library(LLVMObject ELF.cpp ELFObjectFile.cpp Error.cpp + FaultMapParser.cpp IRObjectFile.cpp IRSymtab.cpp MachOObjectFile.cpp diff --git a/llvm/lib/Object/FaultMapParser.cpp b/llvm/lib/Object/FaultMapParser.cpp new file mode 100644 index 0000000..9e83bc1 --- /dev/null +++ b/llvm/lib/Object/FaultMapParser.cpp @@ -0,0 +1,66 @@ +//===----------------------- FaultMapParser.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/FaultMapParser.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/Format.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +void printFaultType(FaultMapParser::FaultKind FT, raw_ostream &OS) { + switch (FT) { + default: + llvm_unreachable("unhandled fault type!"); + case FaultMapParser::FaultingLoad: + OS << "FaultingLoad"; + break; + case FaultMapParser::FaultingLoadStore: + OS << "FaultingLoadStore"; + break; + case FaultMapParser::FaultingStore: + OS << "FaultingStore"; + break; + } +} + +raw_ostream & +llvm::operator<<(raw_ostream &OS, + const FaultMapParser::FunctionFaultInfoAccessor &FFI) { + OS << "Fault kind: "; + printFaultType((FaultMapParser::FaultKind)FFI.getFaultKind(), OS); + OS << ", faulting PC offset: " << FFI.getFaultingPCOffset() + << ", handling PC offset: " << FFI.getHandlerPCOffset(); + return OS; +} + +raw_ostream &llvm::operator<<(raw_ostream &OS, + const FaultMapParser::FunctionInfoAccessor &FI) { + OS << "FunctionAddress: " << format_hex(FI.getFunctionAddr(), 8) + << ", NumFaultingPCs: " << FI.getNumFaultingPCs() << "\n"; + for (unsigned I = 0, E = FI.getNumFaultingPCs(); I != E; ++I) + OS << FI.getFunctionFaultInfoAt(I) << "\n"; + return OS; +} + +raw_ostream &llvm::operator<<(raw_ostream &OS, const FaultMapParser &FMP) { + OS << "Version: " << format_hex(FMP.getFaultMapVersion(), 2) << "\n"; + OS << "NumFunctions: " << FMP.getNumFunctions() << "\n"; + + if (FMP.getNumFunctions() == 0) + return OS; + + FaultMapParser::FunctionInfoAccessor FI; + + for (unsigned I = 0, E = FMP.getNumFunctions(); I != E; ++I) { + FI = (I == 0) ? FMP.getFirstFunctionInfo() : FI.getNextFunctionInfo(); + OS << FI; + } + + return OS; +} diff --git a/llvm/tools/llvm-objdump/CMakeLists.txt b/llvm/tools/llvm-objdump/CMakeLists.txt index 91c28dd..a8546fd 100644 --- a/llvm/tools/llvm-objdump/CMakeLists.txt +++ b/llvm/tools/llvm-objdump/CMakeLists.txt @@ -3,7 +3,6 @@ set(LLVM_LINK_COMPONENTS AllTargetsDisassemblers AllTargetsInfos BinaryFormat - CodeGen DebugInfoDWARF DebugInfoPDB Demangle diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 4b2a159..329c869 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -30,7 +30,6 @@ #include "llvm/ADT/StringSet.h" #include "llvm/ADT/Triple.h" #include "llvm/ADT/Twine.h" -#include "llvm/CodeGen/FaultMaps.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/Symbolize/Symbolize.h" #include "llvm/Demangle/Demangle.h" @@ -50,6 +49,7 @@ #include "llvm/Object/COFF.h" #include "llvm/Object/COFFImportFile.h" #include "llvm/Object/ELFObjectFile.h" +#include "llvm/Object/FaultMapParser.h" #include "llvm/Object/MachO.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" |