diff --git a/llvm/include/llvm/CodeGen/FaultMaps.h b/llvm/include/llvm/CodeGen/FaultMaps.h --- a/llvm/include/llvm/CodeGen/FaultMaps.h +++ b/llvm/include/llvm/CodeGen/FaultMaps.h @@ -76,143 +76,6 @@ 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 static T read(const uint8_t *P, const uint8_t *E) { - assert(P + sizeof(T) <= E && "out of bounds read!"); - return support::endian::read(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(P + FaultKindOffset, E); - } - - FaultingPCOffsetType getFaultingPCOffset() const { - return read(P + FaultingPCOffsetOffset, E); - } - - HandlerPCOffsetType getHandlerPCOffset() const { - return read(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(P + FunctionAddrOffset, E); - } - - NumFaultingPCsType getNumFaultingPCs() const { - return read(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(P + FaultMapVersionOffset, E); - assert(Version == 1 && "only version 1 supported!"); - return Version; - } - - NumFunctionsType getNumFunctions() const { - return read(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/CodeGen/FaultMaps.h b/llvm/include/llvm/Object/FaultMapParser.h copy from llvm/include/llvm/CodeGen/FaultMaps.h copy to llvm/include/llvm/Object/FaultMapParser.h --- a/llvm/include/llvm/CodeGen/FaultMaps.h +++ b/llvm/include/llvm/Object/FaultMapParser.h @@ -1,4 +1,4 @@ -//===- FaultMaps.h - The "FaultMaps" section --------------------*- C++ -*-===// +//===-- 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. @@ -6,80 +6,19 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CODEGEN_FAULTMAPS_H -#define LLVM_CODEGEN_FAULTMAPS_H +#ifndef LLVM_OBJECT_FAULTMAPPARSER_H +#define LLVM_OBJECT_FAULTMAPPARSER_H -#include "llvm/MC/MCSymbol.h" #include "llvm/Support/Endian.h" -#include -#include -#include -#include -#include +#include "llvm/Support/raw_ostream.h" namespace llvm { -class AsmPrinter; -class MCExpr; -class raw_ostream; - -class FaultMaps { -public: - enum FaultKind { - FaultingLoad = 1, - FaultingLoadStore, - FaultingStore, - FaultKindMax - }; - - explicit FaultMaps(AsmPrinter &AP); - - static const char *faultTypeToString(FaultKind); - - void recordFaultingOp(FaultKind FaultTy, const MCSymbol *FaultingLabel, - const MCSymbol *HandlerLabel); - void serializeToFaultMapSection(); - void reset() { - FunctionInfos.clear(); - } - -private: - static const char *WFMP; - - struct FaultInfo { - FaultKind Kind = FaultKindMax; - const MCExpr *FaultingOffsetExpr = nullptr; - const MCExpr *HandlerOffsetExpr = nullptr; - - FaultInfo() = default; - - explicit FaultInfo(FaultMaps::FaultKind Kind, const MCExpr *FaultingOffset, - const MCExpr *HandlerOffset) - : Kind(Kind), FaultingOffsetExpr(FaultingOffset), - HandlerOffsetExpr(HandlerOffset) {} - }; - - using FunctionFaultInfos = std::vector; - - // We'd like to keep a stable iteration order for FunctionInfos to help - // FileCheck based testing. - struct MCSymbolComparator { - bool operator()(const MCSymbol *LHS, const MCSymbol *RHS) const { - return LHS->getName() < RHS->getName(); - } - }; - - std::map - FunctionInfos; - AsmPrinter &AP; - - 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. +/// 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; @@ -104,6 +43,13 @@ } public: + enum FaultKind { + FaultingLoad = 1, + FaultingLoadStore, + FaultingStore, + FaultKindMax + }; + class FunctionFaultInfoAccessor { using FaultKindType = uint32_t; using FaultingPCOffsetType = uint32_t; @@ -205,14 +151,14 @@ } }; -raw_ostream & -operator<<(raw_ostream &OS, const FaultMapParser::FunctionFaultInfoAccessor &); +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 +} // namespace llvm -#endif // LLVM_CODEGEN_FAULTMAPS_H +#endif diff --git a/llvm/lib/CodeGen/FaultMaps.cpp b/llvm/lib/CodeGen/FaultMaps.cpp --- a/llvm/lib/CodeGen/FaultMaps.cpp +++ b/llvm/lib/CodeGen/FaultMaps.cpp @@ -114,39 +114,3 @@ 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 --- a/llvm/lib/Object/CMakeLists.txt +++ b/llvm/lib/Object/CMakeLists.txt @@ -9,6 +9,7 @@ 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 --- /dev/null +++ b/llvm/lib/Object/FaultMapParser.cpp @@ -0,0 +1,65 @@ +//===----------------------- 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" + +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 --- a/llvm/tools/llvm-objdump/CMakeLists.txt +++ b/llvm/tools/llvm-objdump/CMakeLists.txt @@ -3,7 +3,6 @@ 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 --- 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"