diff options
15 files changed, 63 insertions, 253 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h index ab4441f..48268aa9 100644 --- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h @@ -623,8 +623,10 @@ public: this->S = static_cast<uint8_t>(S); } - /// Get the target flags of this Symbol. - TargetFlagsType getTargetFlags() const { return TargetFlags; } + /// Check whether the given target flags are set for this Symbol. + bool hasTargetFlags(TargetFlagsType Flags) const { + return static_cast<TargetFlagsType>(TargetFlags) & Flags; + } /// Set the target flags for this Symbol. void setTargetFlags(TargetFlagsType Flags) { diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h index d1d54c0..b21c9e2 100644 --- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h @@ -23,9 +23,6 @@ namespace llvm { namespace jitlink { namespace aarch32 { -/// Check whether the given target flags are set for this Symbol. -bool hasTargetFlags(Symbol &Sym, TargetFlagsType Flags); - /// JITLink-internal AArch32 fixup kinds enum EdgeKind_aarch32 : Edge::Kind { diff --git a/llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h b/llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h index ae6764c1..5904250 100644 --- a/llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h +++ b/llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h @@ -12,8 +12,6 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/Support/Endian.h" -#include "llvm/TargetParser/SubtargetFeature.h" -#include "llvm/TargetParser/Triple.h" #include <optional> #include <cstdint> @@ -31,9 +29,6 @@ class RuntimeDyld; class RuntimeDyldCheckerImpl; class raw_ostream; -/// Holds target-specific properties for a symbol. -using TargetFlagsType = uint8_t; - /// RuntimeDyld invariant checker for verifying that RuntimeDyld has /// correctly applied relocations. /// @@ -83,11 +78,10 @@ public: public: MemoryRegionInfo() = default; - /// Constructor for symbols/sections with content and TargetFlag. - MemoryRegionInfo(ArrayRef<char> Content, JITTargetAddress TargetAddress, - TargetFlagsType TargetFlags) + /// Constructor for symbols/sections with content. + MemoryRegionInfo(ArrayRef<char> Content, JITTargetAddress TargetAddress) : ContentPtr(Content.data()), Size(Content.size()), - TargetAddress(TargetAddress), TargetFlags(TargetFlags) {} + TargetAddress(TargetAddress) {} /// Constructor for zero-fill symbols/sections. MemoryRegionInfo(uint64_t Size, JITTargetAddress TargetAddress) @@ -133,20 +127,10 @@ public: /// Return the target address for this region. JITTargetAddress getTargetAddress() const { return TargetAddress; } - /// Get the target flags for this Symbol. - TargetFlagsType getTargetFlags() const { return TargetFlags; } - - /// Set the target flags for this Symbol. - void setTargetFlags(TargetFlagsType Flags) { - assert(Flags <= 1 && "Add more bits to store more than one flag"); - TargetFlags = Flags; - } - private: const char *ContentPtr = nullptr; uint64_t Size = 0; JITTargetAddress TargetAddress = 0; - TargetFlagsType TargetFlags = 0; }; using IsSymbolValidFunction = std::function<bool(StringRef Symbol)>; @@ -164,8 +148,9 @@ public: GetSectionInfoFunction GetSectionInfo, GetStubInfoFunction GetStubInfo, GetGOTInfoFunction GetGOTInfo, - support::endianness Endianness, Triple TT, - SubtargetFeatures TF, raw_ostream &ErrStream); + support::endianness Endianness, + MCDisassembler *Disassembler, MCInstPrinter *InstPrinter, + raw_ostream &ErrStream); ~RuntimeDyldChecker(); /// Check a single expression against the attached RuntimeDyld diff --git a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp index 01c9e8b..e9221a8 100644 --- a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp @@ -25,11 +25,6 @@ namespace llvm { namespace jitlink { namespace aarch32 { -/// Check whether the given target flags are set for this Symbol. -bool hasTargetFlags(Symbol &Sym, TargetFlagsType Flags) { - return static_cast<TargetFlagsType>(Sym.getTargetFlags()) & Flags; -} - /// Encode 22-bit immediate value for branch instructions without J1J2 range /// extension (formats B T4, BL T1 and BLX T2). /// @@ -292,7 +287,7 @@ Error applyFixupData(LinkGraph &G, Block &B, const Edge &E) { int64_t Addend = E.getAddend(); Symbol &TargetSymbol = E.getTarget(); uint64_t TargetAddress = TargetSymbol.getAddress().getValue(); - assert(!hasTargetFlags(TargetSymbol, ThumbSymbol)); + assert(!TargetSymbol.hasTargetFlags(ThumbSymbol)); // Regular data relocations have size 4, alignment 1 and write the full 32-bit // result to the place; no need for overflow checking. There are three @@ -346,14 +341,14 @@ Error applyFixupThumb(LinkGraph &G, Block &B, const Edge &E, int64_t Addend = E.getAddend(); Symbol &TargetSymbol = E.getTarget(); uint64_t TargetAddress = TargetSymbol.getAddress().getValue(); - if (hasTargetFlags(TargetSymbol, ThumbSymbol)) + if (TargetSymbol.hasTargetFlags(ThumbSymbol)) TargetAddress |= 0x01; switch (Kind) { case Thumb_Jump24: { if (!checkOpcode<Thumb_Jump24>(R)) return makeUnexpectedOpcodeError(G, R, Kind); - if (!hasTargetFlags(TargetSymbol, ThumbSymbol)) + if (!(TargetSymbol.hasTargetFlags(ThumbSymbol))) return make_error<JITLinkError>("Branch relocation needs interworking " "stub when bridging to ARM: " + StringRef(G.getEdgeKindName(Kind))); @@ -380,7 +375,7 @@ Error applyFixupThumb(LinkGraph &G, Block &B, const Edge &E, // The call instruction itself is Thumb. The call destination can either be // Thumb or Arm. We use BL to stay in Thumb and BLX to change to Arm. - bool TargetIsArm = !hasTargetFlags(TargetSymbol, ThumbSymbol); + bool TargetIsArm = !TargetSymbol.hasTargetFlags(ThumbSymbol); bool InstrIsBlx = (R.Lo & FixupInfo<Thumb_Call>::LoBitNoBlx) == 0; if (TargetIsArm != InstrIsBlx) { if (LLVM_LIKELY(TargetIsArm)) { diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp index 3d77f82..a29f3d1 100644 --- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp @@ -46,7 +46,7 @@ ExecutorAddr getJITSymbolPtrForSymbol(Symbol &Sym, const Triple &TT) { case Triple::armeb: case Triple::thumb: case Triple::thumbeb: - if (hasTargetFlags(Sym, aarch32::ThumbSymbol)) { + if (Sym.hasTargetFlags(aarch32::ThumbSymbol)) { // Set LSB to indicate thumb target assert(Sym.isCallable() && "Only callable symbols can have thumb flag"); assert((Sym.getAddress().getValue() & 0x01) == 0 && "LSB is clear"); diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp index b4f0a71..ab561ec 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp @@ -10,16 +10,9 @@ #include "RuntimeDyldCheckerImpl.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCDisassembler/MCDisassembler.h" #include "llvm/MC/MCInst.h" -#include "llvm/MC/MCInstPrinter.h" -#include "llvm/MC/MCInstrInfo.h" -#include "llvm/MC/MCRegisterInfo.h" -#include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/MC/MCTargetOptions.h" -#include "llvm/MC/TargetRegistry.h" #include "llvm/Support/Endian.h" #include "llvm/Support/MSVCErrorWorkarounds.h" #include "llvm/Support/MemoryBuffer.h" @@ -32,19 +25,6 @@ using namespace llvm; -namespace { -struct TargetInfo { - const Target *TheTarget; - std::unique_ptr<MCSubtargetInfo> STI; - std::unique_ptr<MCRegisterInfo> MRI; - std::unique_ptr<MCAsmInfo> MAI; - std::unique_ptr<MCContext> Ctx; - std::unique_ptr<MCDisassembler> Disassembler; - std::unique_ptr<MCInstrInfo> MII; - std::unique_ptr<MCInstPrinter> InstPrinter; -}; -} // anonymous namespace - namespace llvm { // Helper class that implements the language evaluated by RuntimeDyldChecker. @@ -296,20 +276,6 @@ private: ""); unsigned OpIdx = OpIdxExpr.getValue(); - - auto printInst = [this](StringRef Symbol, MCInst Inst, - raw_string_ostream &ErrMsgStream) { - auto TI = getTargetInfo( - Checker.getTripleFromTargetFlag(Checker.getTargetFlag(Symbol))); - if (auto E = TI.takeError()) { - errs() << "Error obtaining instruction printer: " - << toString(std::move(E)) << "\n"; - return std::make_pair(EvalResult(ErrMsgStream.str()), ""); - } - Inst.dump_pretty(ErrMsgStream, TI->InstPrinter.get()); - return std::make_pair(EvalResult(ErrMsgStream.str()), ""); - }; - if (OpIdx >= Inst.getNumOperands()) { std::string ErrMsg; raw_string_ostream ErrMsgStream(ErrMsg); @@ -318,8 +284,8 @@ private: << "'. Instruction has only " << format("%i", Inst.getNumOperands()) << " operands.\nInstruction is:\n "; - - return printInst(Symbol, Inst, ErrMsgStream); + Inst.dump_pretty(ErrMsgStream, Checker.InstPrinter); + return std::make_pair(EvalResult(ErrMsgStream.str()), ""); } const MCOperand &Op = Inst.getOperand(OpIdx); @@ -328,8 +294,9 @@ private: raw_string_ostream ErrMsgStream(ErrMsg); ErrMsgStream << "Operand '" << format("%i", OpIdx) << "' of instruction '" << Symbol << "' is not an immediate.\nInstruction is:\n "; + Inst.dump_pretty(ErrMsgStream, Checker.InstPrinter); - return printInst(Symbol, Inst, ErrMsgStream); + return std::make_pair(EvalResult(ErrMsgStream.str()), ""); } return std::make_pair(EvalResult(Op.getImm()), RemainingExpr); @@ -720,101 +687,31 @@ private: bool decodeInst(StringRef Symbol, MCInst &Inst, uint64_t &Size, int64_t Offset) const { - auto TI = getTargetInfo( - Checker.getTripleFromTargetFlag(Checker.getTargetFlag(Symbol))); - - if (auto E = TI.takeError()) { - errs() << "Error obtaining disassembler: " << toString(std::move(E)) - << "\n"; - return false; - } - + MCDisassembler *Dis = Checker.Disassembler; StringRef SymbolMem = Checker.getSymbolContent(Symbol); ArrayRef<uint8_t> SymbolBytes(SymbolMem.bytes_begin() + Offset, SymbolMem.size() - Offset); MCDisassembler::DecodeStatus S = - TI->Disassembler->getInstruction(Inst, Size, SymbolBytes, 0, nulls()); + Dis->getInstruction(Inst, Size, SymbolBytes, 0, nulls()); return (S == MCDisassembler::Success); } - - Expected<TargetInfo> - getTargetInfo(const Triple &TT, - const SubtargetFeatures &TF = SubtargetFeatures()) const { - - auto TripleName = TT.str(); - std::string ErrorStr; - const Target *TheTarget = - TargetRegistry::lookupTarget(TripleName, ErrorStr); - if (!TheTarget) - return make_error<StringError>("Error accessing target '" + TripleName + - "': " + ErrorStr, - inconvertibleErrorCode()); - - std::unique_ptr<MCSubtargetInfo> STI( - TheTarget->createMCSubtargetInfo(TripleName, "", TF.getString())); - if (!STI) - return make_error<StringError>("Unable to create subtarget for " + - TripleName, - inconvertibleErrorCode()); - - std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName)); - if (!MRI) - return make_error<StringError>("Unable to create target register info " - "for " + - TripleName, - inconvertibleErrorCode()); - - MCTargetOptions MCOptions; - std::unique_ptr<MCAsmInfo> MAI( - TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); - if (!MAI) - return make_error<StringError>("Unable to create target asm info " + - TripleName, - inconvertibleErrorCode()); - - auto Ctx = std::make_unique<MCContext>(Triple(TripleName), MAI.get(), - MRI.get(), STI.get()); - - std::unique_ptr<MCDisassembler> Disassembler( - TheTarget->createMCDisassembler(*STI, *Ctx)); - if (!Disassembler) - return make_error<StringError>("Unable to create disassembler for " + - TripleName, - inconvertibleErrorCode()); - - std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo()); - if (!MII) - return make_error<StringError>("Unable to create instruction info for" + - TripleName, - inconvertibleErrorCode()); - - std::unique_ptr<MCInstPrinter> InstPrinter(TheTarget->createMCInstPrinter( - Triple(TripleName), 0, *MAI, *MII, *MRI)); - if (!InstPrinter) - return make_error<StringError>( - "Unable to create instruction printer for" + TripleName, - inconvertibleErrorCode()); - - return TargetInfo({TheTarget, std::move(STI), std::move(MRI), - std::move(MAI), std::move(Ctx), std::move(Disassembler), - std::move(MII), std::move(InstPrinter)}); - } }; } // namespace llvm RuntimeDyldCheckerImpl::RuntimeDyldCheckerImpl( IsSymbolValidFunction IsSymbolValid, GetSymbolInfoFunction GetSymbolInfo, GetSectionInfoFunction GetSectionInfo, GetStubInfoFunction GetStubInfo, - GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, Triple TT, - SubtargetFeatures TF, raw_ostream &ErrStream) + GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, + MCDisassembler *Disassembler, MCInstPrinter *InstPrinter, + raw_ostream &ErrStream) : IsSymbolValid(std::move(IsSymbolValid)), GetSymbolInfo(std::move(GetSymbolInfo)), GetSectionInfo(std::move(GetSectionInfo)), GetStubInfo(std::move(GetStubInfo)), GetGOTInfo(std::move(GetGOTInfo)), - Endianness(Endianness), TT(std::move(TT)), TF(std::move(TF)), - ErrStream(ErrStream) {} + Endianness(Endianness), Disassembler(Disassembler), + InstPrinter(InstPrinter), ErrStream(ErrStream) {} bool RuntimeDyldCheckerImpl::check(StringRef CheckExpr) const { CheckExpr = CheckExpr.trim(); @@ -925,36 +822,6 @@ StringRef RuntimeDyldCheckerImpl::getSymbolContent(StringRef Symbol) const { return {SymInfo->getContent().data(), SymInfo->getContent().size()}; } -TargetFlagsType RuntimeDyldCheckerImpl::getTargetFlag(StringRef Symbol) const { - auto SymInfo = GetSymbolInfo(Symbol); - if (!SymInfo) { - logAllUnhandledErrors(SymInfo.takeError(), errs(), "RTDyldChecker: "); - return TargetFlagsType{}; - } - return SymInfo->getTargetFlags(); -} - -Triple -RuntimeDyldCheckerImpl::getTripleFromTargetFlag(TargetFlagsType Flag) const { - Triple TheTriple = TT; - - switch (TT.getArch()) { - case Triple::ArchType::arm: - if (~Flag & 0x1) - return TT; - TheTriple.setArchName((Twine("thumb") + TT.getArchName().substr(3)).str()); - return TheTriple; - case Triple::ArchType::thumb: - if (Flag & 0x1) - return TT; - TheTriple.setArchName((Twine("arm") + TT.getArchName().substr(5)).str()); - return TheTriple; - - default: - return TT; - } -} - std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getSectionAddr( StringRef FileName, StringRef SectionName, bool IsInsideLoad) const { @@ -1017,12 +884,13 @@ std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getStubOrGOTAddrFor( RuntimeDyldChecker::RuntimeDyldChecker( IsSymbolValidFunction IsSymbolValid, GetSymbolInfoFunction GetSymbolInfo, GetSectionInfoFunction GetSectionInfo, GetStubInfoFunction GetStubInfo, - GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, Triple TT, - SubtargetFeatures TF, raw_ostream &ErrStream) + GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, + MCDisassembler *Disassembler, MCInstPrinter *InstPrinter, + raw_ostream &ErrStream) : Impl(::std::make_unique<RuntimeDyldCheckerImpl>( std::move(IsSymbolValid), std::move(GetSymbolInfo), std::move(GetSectionInfo), std::move(GetStubInfo), - std::move(GetGOTInfo), Endianness, std::move(TT), std::move(TF), + std::move(GetGOTInfo), Endianness, Disassembler, InstPrinter, ErrStream)) {} RuntimeDyldChecker::~RuntimeDyldChecker() = default; diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h index 8596b33..f564b00 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h @@ -13,9 +13,6 @@ namespace llvm { -/// Holds target-specific properties for a symbol. -using TargetFlagsType = uint8_t; - class RuntimeDyldCheckerImpl { friend class RuntimeDyldChecker; friend class RuntimeDyldCheckerExprEval; @@ -28,13 +25,12 @@ class RuntimeDyldCheckerImpl { using GetGOTInfoFunction = RuntimeDyldChecker::GetGOTInfoFunction; public: - RuntimeDyldCheckerImpl(IsSymbolValidFunction IsSymbolValid, - GetSymbolInfoFunction GetSymbolInfo, - GetSectionInfoFunction GetSectionInfo, - GetStubInfoFunction GetStubInfo, - GetGOTInfoFunction GetGOTInfo, - support::endianness Endianness, Triple TT, - SubtargetFeatures TF, llvm::raw_ostream &ErrStream); + RuntimeDyldCheckerImpl( + IsSymbolValidFunction IsSymbolValid, GetSymbolInfoFunction GetSymbolInfo, + GetSectionInfoFunction GetSectionInfo, GetStubInfoFunction GetStubInfo, + GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, + MCDisassembler *Disassembler, MCInstPrinter *InstPrinter, + llvm::raw_ostream &ErrStream); bool check(StringRef CheckExpr) const; bool checkAllRulesInBuffer(StringRef RulePrefix, MemoryBuffer *MemBuf) const; @@ -53,9 +49,6 @@ private: StringRef getSymbolContent(StringRef Symbol) const; - TargetFlagsType getTargetFlag(StringRef Symbol) const; - Triple getTripleFromTargetFlag(TargetFlagsType Flag) const; - std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName, StringRef SectionName, bool IsInsideLoad) const; @@ -72,8 +65,8 @@ private: GetStubInfoFunction GetStubInfo; GetGOTInfoFunction GetGOTInfo; support::endianness Endianness; - Triple TT; - SubtargetFeatures TF; + MCDisassembler *Disassembler; + MCInstPrinter *InstPrinter; llvm::raw_ostream &ErrStream; }; } diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h index a3e66c6..22f1cf3 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h @@ -54,28 +54,6 @@ public: return 16; // 8-byte load instructions, 4-byte jump, 4-byte padding } - Expected<JITSymbolFlags> getJITSymbolFlags(const SymbolRef &SR) override { - - auto Flags = RuntimeDyldImpl::getJITSymbolFlags(SR); - - if (!Flags) { - return Flags.takeError(); - } - auto SectionIterOrErr = SR.getSection(); - if (!SectionIterOrErr) { - return SectionIterOrErr.takeError(); - } - SectionRef Sec = *SectionIterOrErr.get(); - const object::COFFObjectFile *COFFObjPtr = - cast<object::COFFObjectFile>(Sec.getObject()); - const coff_section *CoffSec = COFFObjPtr->getCOFFSection(Sec); - bool isThumb = CoffSec->Characteristics & COFF::IMAGE_SCN_MEM_16BIT; - - Flags->getTargetFlags() = isThumb; - - return Flags; - } - Align getStubAlignment() override { return Align(1); } Expected<object::relocation_iterator> diff --git a/llvm/test/ExecutionEngine/JITLink/AArch32/ELF_static_thumb_reloc.s b/llvm/test/ExecutionEngine/JITLink/AArch32/ELF_static_thumb_reloc.s index b0d6db0..76c5f58 100644 --- a/llvm/test/ExecutionEngine/JITLink/AArch32/ELF_static_thumb_reloc.s +++ b/llvm/test/ExecutionEngine/JITLink/AArch32/ELF_static_thumb_reloc.s @@ -4,6 +4,8 @@ # RUN: llvm-jitlink -noexec -slab-address 0x76ff0000 -slab-allocate 10Kb \ # RUN: -slab-page-size 4096 -show-entry-es -check %s %t.o +# This test requires the RuntimeDyldChecker fix from review D158280 +# XFAIL: * .text .syntax unified diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/ARM/COFF_Thumb.s b/llvm/test/ExecutionEngine/RuntimeDyld/ARM/COFF_Thumb.s index b494688..aec4fda 100644 --- a/llvm/test/ExecutionEngine/RuntimeDyld/ARM/COFF_Thumb.s +++ b/llvm/test/ExecutionEngine/RuntimeDyld/ARM/COFF_Thumb.s @@ -101,7 +101,7 @@ rel11: bx r0 trap - .text + .data .p2align 2 diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp index 283e655..415aee7 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp @@ -118,8 +118,7 @@ Error registerCOFFGraphInfo(Session &S, LinkGraph &G) { if (Sym->getSize() != 0) { if (auto TS = getCOFFGOTTarget(G, Sym->getBlock())) FileInfo.GOTEntryInfos[TS->getName()] = { - Sym->getSymbolContent(), Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getSymbolContent(), Sym->getAddress().getValue()}; else return TS.takeError(); } @@ -131,8 +130,7 @@ Error registerCOFFGraphInfo(Session &S, LinkGraph &G) { if (auto TS = getCOFFStubTarget(G, Sym->getBlock())) FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; @@ -145,8 +143,7 @@ Error registerCOFFGraphInfo(Session &S, LinkGraph &G) { SectionContainsZeroFill = true; } else { S.SymbolInfos[Sym->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getAddress().getValue()}; SectionContainsContent = true; } } @@ -167,7 +164,7 @@ Error registerCOFFGraphInfo(Session &S, LinkGraph &G) { else FileInfo.SectionInfos[Sec.getName()] = { ArrayRef<char>(FirstSym->getBlock().getContent().data(), SecSize), - SecAddr.getValue(), FirstSym->getTargetFlags()}; + SecAddr.getValue()}; } return Error::success(); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp index 7881660..5200dbc 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp @@ -120,8 +120,7 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) { if (Sym->getSize() != 0) { if (auto TS = getELFGOTTarget(G, Sym->getBlock())) FileInfo.GOTEntryInfos[TS->getName()] = { - Sym->getSymbolContent(), Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getSymbolContent(), Sym->getAddress().getValue()}; else return TS.takeError(); } @@ -133,8 +132,7 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) { if (auto TS = getELFStubTarget(G, Sym->getBlock())) FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; @@ -147,8 +145,7 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) { SectionContainsZeroFill = true; } else { S.SymbolInfos[Sym->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getAddress().getValue()}; SectionContainsContent = true; } } @@ -173,7 +170,7 @@ Error registerELFGraphInfo(Session &S, LinkGraph &G) { else FileInfo.SectionInfos[Sec.getName()] = { ArrayRef<char>(FirstSym->getBlock().getContent().data(), SecSize), - SecAddr.getValue(), FirstSym->getTargetFlags()}; + SecAddr.getValue()}; } return Error::success(); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp index 7dcadd9..bcb2f25 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp @@ -117,9 +117,8 @@ Error registerMachOGraphInfo(Session &S, LinkGraph &G) { inconvertibleErrorCode()); if (auto TS = getMachOGOTTarget(G, Sym->getBlock())) - FileInfo.GOTEntryInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + FileInfo.GOTEntryInfos[TS->getName()] = { + Sym->getSymbolContent(), Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; @@ -130,8 +129,7 @@ Error registerMachOGraphInfo(Session &S, LinkGraph &G) { if (auto TS = getMachOStubTarget(G, Sym->getBlock())) FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; @@ -142,8 +140,7 @@ Error registerMachOGraphInfo(Session &S, LinkGraph &G) { SectionContainsZeroFill = true; } else { S.SymbolInfos[Sym->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue(), - Sym->getTargetFlags()}; + Sym->getAddress().getValue()}; SectionContainsContent = true; } } @@ -163,7 +160,7 @@ Error registerMachOGraphInfo(Session &S, LinkGraph &G) { else FileInfo.SectionInfos[Sec.getName()] = { ArrayRef<char>(FirstSym->getBlock().getContent().data(), SecSize), - SecAddr.getValue(), FirstSym->getTargetFlags()}; + SecAddr.getValue()}; } return Error::success(); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp index a8f056e..00dd520 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -1388,8 +1388,7 @@ static Error addAbsoluteSymbols(Session &S, return Err; // Register the absolute symbol with the session symbol infos. - S.SymbolInfos[Name] = {ArrayRef<char>(), Addr, - AbsDef.getFlags().getTargetFlags()}; + S.SymbolInfos[Name] = {ArrayRef<char>(), Addr}; } return Error::success(); @@ -1857,12 +1856,15 @@ getTargetInfo(const Triple &TT, std::move(MAI), std::move(Ctx), std::move(Disassembler), std::move(MII), std::move(MIA), std::move(InstPrinter)}; } -static Error runChecks(Session &S, Triple TT, SubtargetFeatures Features) { + +static Error runChecks(Session &S) { if (CheckFiles.empty()) return Error::success(); LLVM_DEBUG(dbgs() << "Running checks...\n"); + auto TI = getTargetInfo(S.ES.getTargetTriple(), S.Features); + auto IsSymbolValid = [&S](StringRef Symbol) { return S.isSymbolRegistered(Symbol); }; @@ -1886,7 +1888,7 @@ static Error runChecks(Session &S, Triple TT, SubtargetFeatures Features) { RuntimeDyldChecker Checker( IsSymbolValid, GetSymbolInfo, GetSectionInfo, GetStubInfo, GetGOTInfo, S.ES.getTargetTriple().isLittleEndian() ? support::little : support::big, - TT, Features, dbgs()); + TI.Disassembler.get(), TI.InstPrinter.get(), dbgs()); std::string CheckLineStart = "# " + CheckName + ":"; for (auto &CheckFile : CheckFiles) { @@ -1998,7 +2000,7 @@ int main(int argc, char *argv[]) { auto [TT, Features] = getFirstFileTripleAndFeatures(); ExitOnErr(sanitizeArguments(TT, argv[0])); - auto S = ExitOnErr(Session::Create(TT, Features)); + auto S = ExitOnErr(Session::Create(std::move(TT), std::move(Features))); enableStatistics(*S, !OrcRuntime.empty()); @@ -2034,7 +2036,7 @@ int main(int argc, char *argv[]) { exit(1); } - ExitOnErr(runChecks(*S, std::move(TT), std::move(Features))); + ExitOnErr(runChecks(*S)); int Result = 0; if (!NoExec) { diff --git a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp index 7e621cb..df82fb0 100644 --- a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -892,8 +892,6 @@ static int linkAndVerify() { StringRef SecContent = Dyld.getSectionContent(SectionID); uint64_t SymSize = SecContent.size() - (CSymAddr - SecContent.data()); SymInfo.setContent(ArrayRef<char>(CSymAddr, SymSize)); - SymInfo.setTargetFlags( - Dyld.getSymbol(Symbol).getFlags().getTargetFlags()); } } return SymInfo; @@ -975,12 +973,11 @@ static int linkAndVerify() { ObjectFile &Obj = **MaybeObj; - SubtargetFeatures Features = SubtargetFeatures(); if (!Checker) Checker = std::make_unique<RuntimeDyldChecker>( IsSymbolValid, GetSymbolInfo, GetSectionInfo, GetStubInfo, GetStubInfo, Obj.isLittleEndian() ? support::little : support::big, - TheTriple, Features, dbgs()); + Disassembler.get(), InstPrinter.get(), dbgs()); auto FileName = sys::path::filename(InputFile); MemMgr.setSectionIDsMap(&FileToSecIDMap[FileName]); |