[llvm] 4871a9c - Revert "[jitlink/rtdydl][checker] Add TargetFlag dependent disassembler switching support"

Tom Weaver via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 8 05:41:54 PDT 2023


Author: Tom Weaver
Date: 2023-09-08T13:41:11+01:00
New Revision: 4871a9ca54674be336a800f207652b8737a76d71

URL: https://github.com/llvm/llvm-project/commit/4871a9ca54674be336a800f207652b8737a76d71
DIFF: https://github.com/llvm/llvm-project/commit/4871a9ca54674be336a800f207652b8737a76d71.diff

LOG: Revert "[jitlink/rtdydl][checker] Add TargetFlag dependent disassembler switching support"

This reverts commit 4b17c81d5a5d3e0f514026c2b7f9b623d901cc04.

Caused buildbot failures:
https://lab.llvm.org/buildbot/#/builders/230/builds/18341
https://lab.llvm.org/buildbot/#/builders/109/builds/73169
https://lab.llvm.org/buildbot/#/builders/67/builds/12597

Added: 
    

Modified: 
    llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
    llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h
    llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h
    llvm/lib/ExecutionEngine/JITLink/aarch32.cpp
    llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
    llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp
    llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
    llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h
    llvm/test/ExecutionEngine/JITLink/AArch32/ELF_static_thumb_reloc.s
    llvm/test/ExecutionEngine/RuntimeDyld/ARM/COFF_Thumb.s
    llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp
    llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp
    llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
    llvm/tools/llvm-jitlink/llvm-jitlink.cpp
    llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
index ab4441fbec4606d..48268aa9f6899b9 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
@@ -623,8 +623,10 @@ class Symbol {
     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 d1d54c0ca633362..b21c9e2a1cd8260 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 ae6764c1a3ac3b3..5904250c9a72208 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 @@ class RuntimeDyldChecker {
   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 @@ class RuntimeDyldChecker {
     /// 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 @@ class RuntimeDyldChecker {
                      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 01c9e8b4fd9d18e..e9221a898ff63da 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 3d77f82e65696a8..a29f3d1c3aec8da 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 b4f0a718fda6d26..ab561ecd0057984 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 @@ class RuntimeDyldCheckerExprEval {
           "");
 
     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 @@ class RuntimeDyldCheckerExprEval {
                    << "'. 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 @@ class RuntimeDyldCheckerExprEval {
       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 @@ class RuntimeDyldCheckerExprEval {
 
   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 8596b3372b69358..f564b0035bffdec 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 @@ class RuntimeDyldCheckerImpl {
 
   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 @@ class RuntimeDyldCheckerImpl {
   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 a3e66c6bc0ecdf8..22f1cf33158c8be 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldCOFFThumb.h
@@ -54,28 +54,6 @@ class RuntimeDyldCOFFThumb : public RuntimeDyldCOFF {
     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 b0d6db045efd216..76c5f5807f7b86c 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 b4946880ff15523..aec4fdad4c58868 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 283e655205d7809..415aee76b186345 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 7881660d1a73851..5200dbcf9036619 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 7dcadd94c2365a4..bcb2f251ece1c0c 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 a8f056eab674ec0..00dd5206d75a756 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 7e621cba1871b32..df82fb04e8e680c 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]);


        


More information about the llvm-commits mailing list