Skip to content

Commit 4871a9c

Browse files
Tom WeaverTom Weaver
Tom Weaver
authored and
Tom Weaver
committed
Revert "[jitlink/rtdydl][checker] Add TargetFlag dependent disassembler switching support"
This reverts commit 4b17c81. 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
1 parent feb7bea commit 4871a9c

File tree

15 files changed

+63
-253
lines changed

15 files changed

+63
-253
lines changed

llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,8 +623,10 @@ class Symbol {
623623
this->S = static_cast<uint8_t>(S);
624624
}
625625

626-
/// Get the target flags of this Symbol.
627-
TargetFlagsType getTargetFlags() const { return TargetFlags; }
626+
/// Check whether the given target flags are set for this Symbol.
627+
bool hasTargetFlags(TargetFlagsType Flags) const {
628+
return static_cast<TargetFlagsType>(TargetFlags) & Flags;
629+
}
628630

629631
/// Set the target flags for this Symbol.
630632
void setTargetFlags(TargetFlagsType Flags) {

llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ namespace llvm {
2323
namespace jitlink {
2424
namespace aarch32 {
2525

26-
/// Check whether the given target flags are set for this Symbol.
27-
bool hasTargetFlags(Symbol &Sym, TargetFlagsType Flags);
28-
2926
/// JITLink-internal AArch32 fixup kinds
3027
enum EdgeKind_aarch32 : Edge::Kind {
3128

llvm/include/llvm/ExecutionEngine/RuntimeDyldChecker.h

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
#include "llvm/ADT/DenseMap.h"
1313
#include "llvm/ExecutionEngine/JITSymbol.h"
1414
#include "llvm/Support/Endian.h"
15-
#include "llvm/TargetParser/SubtargetFeature.h"
16-
#include "llvm/TargetParser/Triple.h"
1715
#include <optional>
1816

1917
#include <cstdint>
@@ -31,9 +29,6 @@ class RuntimeDyld;
3129
class RuntimeDyldCheckerImpl;
3230
class raw_ostream;
3331

34-
/// Holds target-specific properties for a symbol.
35-
using TargetFlagsType = uint8_t;
36-
3732
/// RuntimeDyld invariant checker for verifying that RuntimeDyld has
3833
/// correctly applied relocations.
3934
///
@@ -83,11 +78,10 @@ class RuntimeDyldChecker {
8378
public:
8479
MemoryRegionInfo() = default;
8580

86-
/// Constructor for symbols/sections with content and TargetFlag.
87-
MemoryRegionInfo(ArrayRef<char> Content, JITTargetAddress TargetAddress,
88-
TargetFlagsType TargetFlags)
81+
/// Constructor for symbols/sections with content.
82+
MemoryRegionInfo(ArrayRef<char> Content, JITTargetAddress TargetAddress)
8983
: ContentPtr(Content.data()), Size(Content.size()),
90-
TargetAddress(TargetAddress), TargetFlags(TargetFlags) {}
84+
TargetAddress(TargetAddress) {}
9185

9286
/// Constructor for zero-fill symbols/sections.
9387
MemoryRegionInfo(uint64_t Size, JITTargetAddress TargetAddress)
@@ -133,20 +127,10 @@ class RuntimeDyldChecker {
133127
/// Return the target address for this region.
134128
JITTargetAddress getTargetAddress() const { return TargetAddress; }
135129

136-
/// Get the target flags for this Symbol.
137-
TargetFlagsType getTargetFlags() const { return TargetFlags; }
138-
139-
/// Set the target flags for this Symbol.
140-
void setTargetFlags(TargetFlagsType Flags) {
141-
assert(Flags <= 1 && "Add more bits to store more than one flag");
142-
TargetFlags = Flags;
143-
}
144-
145130
private:
146131
const char *ContentPtr = nullptr;
147132
uint64_t Size = 0;
148133
JITTargetAddress TargetAddress = 0;
149-
TargetFlagsType TargetFlags = 0;
150134
};
151135

152136
using IsSymbolValidFunction = std::function<bool(StringRef Symbol)>;
@@ -164,8 +148,9 @@ class RuntimeDyldChecker {
164148
GetSectionInfoFunction GetSectionInfo,
165149
GetStubInfoFunction GetStubInfo,
166150
GetGOTInfoFunction GetGOTInfo,
167-
support::endianness Endianness, Triple TT,
168-
SubtargetFeatures TF, raw_ostream &ErrStream);
151+
support::endianness Endianness,
152+
MCDisassembler *Disassembler, MCInstPrinter *InstPrinter,
153+
raw_ostream &ErrStream);
169154
~RuntimeDyldChecker();
170155

171156
/// Check a single expression against the attached RuntimeDyld

llvm/lib/ExecutionEngine/JITLink/aarch32.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ namespace llvm {
2525
namespace jitlink {
2626
namespace aarch32 {
2727

28-
/// Check whether the given target flags are set for this Symbol.
29-
bool hasTargetFlags(Symbol &Sym, TargetFlagsType Flags) {
30-
return static_cast<TargetFlagsType>(Sym.getTargetFlags()) & Flags;
31-
}
32-
3328
/// Encode 22-bit immediate value for branch instructions without J1J2 range
3429
/// extension (formats B T4, BL T1 and BLX T2).
3530
///
@@ -292,7 +287,7 @@ Error applyFixupData(LinkGraph &G, Block &B, const Edge &E) {
292287
int64_t Addend = E.getAddend();
293288
Symbol &TargetSymbol = E.getTarget();
294289
uint64_t TargetAddress = TargetSymbol.getAddress().getValue();
295-
assert(!hasTargetFlags(TargetSymbol, ThumbSymbol));
290+
assert(!TargetSymbol.hasTargetFlags(ThumbSymbol));
296291

297292
// Regular data relocations have size 4, alignment 1 and write the full 32-bit
298293
// 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,
346341
int64_t Addend = E.getAddend();
347342
Symbol &TargetSymbol = E.getTarget();
348343
uint64_t TargetAddress = TargetSymbol.getAddress().getValue();
349-
if (hasTargetFlags(TargetSymbol, ThumbSymbol))
344+
if (TargetSymbol.hasTargetFlags(ThumbSymbol))
350345
TargetAddress |= 0x01;
351346

352347
switch (Kind) {
353348
case Thumb_Jump24: {
354349
if (!checkOpcode<Thumb_Jump24>(R))
355350
return makeUnexpectedOpcodeError(G, R, Kind);
356-
if (!hasTargetFlags(TargetSymbol, ThumbSymbol))
351+
if (!(TargetSymbol.hasTargetFlags(ThumbSymbol)))
357352
return make_error<JITLinkError>("Branch relocation needs interworking "
358353
"stub when bridging to ARM: " +
359354
StringRef(G.getEdgeKindName(Kind)));
@@ -380,7 +375,7 @@ Error applyFixupThumb(LinkGraph &G, Block &B, const Edge &E,
380375

381376
// The call instruction itself is Thumb. The call destination can either be
382377
// Thumb or Arm. We use BL to stay in Thumb and BLX to change to Arm.
383-
bool TargetIsArm = !hasTargetFlags(TargetSymbol, ThumbSymbol);
378+
bool TargetIsArm = !TargetSymbol.hasTargetFlags(ThumbSymbol);
384379
bool InstrIsBlx = (R.Lo & FixupInfo<Thumb_Call>::LoBitNoBlx) == 0;
385380
if (TargetIsArm != InstrIsBlx) {
386381
if (LLVM_LIKELY(TargetIsArm)) {

llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ ExecutorAddr getJITSymbolPtrForSymbol(Symbol &Sym, const Triple &TT) {
4646
case Triple::armeb:
4747
case Triple::thumb:
4848
case Triple::thumbeb:
49-
if (hasTargetFlags(Sym, aarch32::ThumbSymbol)) {
49+
if (Sym.hasTargetFlags(aarch32::ThumbSymbol)) {
5050
// Set LSB to indicate thumb target
5151
assert(Sym.isCallable() && "Only callable symbols can have thumb flag");
5252
assert((Sym.getAddress().getValue() & 0x01) == 0 && "LSB is clear");

llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp

Lines changed: 15 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,9 @@
1010
#include "RuntimeDyldCheckerImpl.h"
1111
#include "llvm/ADT/STLExtras.h"
1212
#include "llvm/ADT/StringExtras.h"
13-
#include "llvm/MC/MCAsmInfo.h"
1413
#include "llvm/MC/MCContext.h"
1514
#include "llvm/MC/MCDisassembler/MCDisassembler.h"
1615
#include "llvm/MC/MCInst.h"
17-
#include "llvm/MC/MCInstPrinter.h"
18-
#include "llvm/MC/MCInstrInfo.h"
19-
#include "llvm/MC/MCRegisterInfo.h"
20-
#include "llvm/MC/MCSubtargetInfo.h"
21-
#include "llvm/MC/MCTargetOptions.h"
22-
#include "llvm/MC/TargetRegistry.h"
2316
#include "llvm/Support/Endian.h"
2417
#include "llvm/Support/MSVCErrorWorkarounds.h"
2518
#include "llvm/Support/MemoryBuffer.h"
@@ -32,19 +25,6 @@
3225

3326
using namespace llvm;
3427

35-
namespace {
36-
struct TargetInfo {
37-
const Target *TheTarget;
38-
std::unique_ptr<MCSubtargetInfo> STI;
39-
std::unique_ptr<MCRegisterInfo> MRI;
40-
std::unique_ptr<MCAsmInfo> MAI;
41-
std::unique_ptr<MCContext> Ctx;
42-
std::unique_ptr<MCDisassembler> Disassembler;
43-
std::unique_ptr<MCInstrInfo> MII;
44-
std::unique_ptr<MCInstPrinter> InstPrinter;
45-
};
46-
} // anonymous namespace
47-
4828
namespace llvm {
4929

5030
// Helper class that implements the language evaluated by RuntimeDyldChecker.
@@ -296,20 +276,6 @@ class RuntimeDyldCheckerExprEval {
296276
"");
297277

298278
unsigned OpIdx = OpIdxExpr.getValue();
299-
300-
auto printInst = [this](StringRef Symbol, MCInst Inst,
301-
raw_string_ostream &ErrMsgStream) {
302-
auto TI = getTargetInfo(
303-
Checker.getTripleFromTargetFlag(Checker.getTargetFlag(Symbol)));
304-
if (auto E = TI.takeError()) {
305-
errs() << "Error obtaining instruction printer: "
306-
<< toString(std::move(E)) << "\n";
307-
return std::make_pair(EvalResult(ErrMsgStream.str()), "");
308-
}
309-
Inst.dump_pretty(ErrMsgStream, TI->InstPrinter.get());
310-
return std::make_pair(EvalResult(ErrMsgStream.str()), "");
311-
};
312-
313279
if (OpIdx >= Inst.getNumOperands()) {
314280
std::string ErrMsg;
315281
raw_string_ostream ErrMsgStream(ErrMsg);
@@ -318,8 +284,8 @@ class RuntimeDyldCheckerExprEval {
318284
<< "'. Instruction has only "
319285
<< format("%i", Inst.getNumOperands())
320286
<< " operands.\nInstruction is:\n ";
321-
322-
return printInst(Symbol, Inst, ErrMsgStream);
287+
Inst.dump_pretty(ErrMsgStream, Checker.InstPrinter);
288+
return std::make_pair(EvalResult(ErrMsgStream.str()), "");
323289
}
324290

325291
const MCOperand &Op = Inst.getOperand(OpIdx);
@@ -328,8 +294,9 @@ class RuntimeDyldCheckerExprEval {
328294
raw_string_ostream ErrMsgStream(ErrMsg);
329295
ErrMsgStream << "Operand '" << format("%i", OpIdx) << "' of instruction '"
330296
<< Symbol << "' is not an immediate.\nInstruction is:\n ";
297+
Inst.dump_pretty(ErrMsgStream, Checker.InstPrinter);
331298

332-
return printInst(Symbol, Inst, ErrMsgStream);
299+
return std::make_pair(EvalResult(ErrMsgStream.str()), "");
333300
}
334301

335302
return std::make_pair(EvalResult(Op.getImm()), RemainingExpr);
@@ -720,101 +687,31 @@ class RuntimeDyldCheckerExprEval {
720687

721688
bool decodeInst(StringRef Symbol, MCInst &Inst, uint64_t &Size,
722689
int64_t Offset) const {
723-
auto TI = getTargetInfo(
724-
Checker.getTripleFromTargetFlag(Checker.getTargetFlag(Symbol)));
725-
726-
if (auto E = TI.takeError()) {
727-
errs() << "Error obtaining disassembler: " << toString(std::move(E))
728-
<< "\n";
729-
return false;
730-
}
731-
690+
MCDisassembler *Dis = Checker.Disassembler;
732691
StringRef SymbolMem = Checker.getSymbolContent(Symbol);
733692
ArrayRef<uint8_t> SymbolBytes(SymbolMem.bytes_begin() + Offset,
734693
SymbolMem.size() - Offset);
735694

736695
MCDisassembler::DecodeStatus S =
737-
TI->Disassembler->getInstruction(Inst, Size, SymbolBytes, 0, nulls());
696+
Dis->getInstruction(Inst, Size, SymbolBytes, 0, nulls());
738697

739698
return (S == MCDisassembler::Success);
740699
}
741-
742-
Expected<TargetInfo>
743-
getTargetInfo(const Triple &TT,
744-
const SubtargetFeatures &TF = SubtargetFeatures()) const {
745-
746-
auto TripleName = TT.str();
747-
std::string ErrorStr;
748-
const Target *TheTarget =
749-
TargetRegistry::lookupTarget(TripleName, ErrorStr);
750-
if (!TheTarget)
751-
return make_error<StringError>("Error accessing target '" + TripleName +
752-
"': " + ErrorStr,
753-
inconvertibleErrorCode());
754-
755-
std::unique_ptr<MCSubtargetInfo> STI(
756-
TheTarget->createMCSubtargetInfo(TripleName, "", TF.getString()));
757-
if (!STI)
758-
return make_error<StringError>("Unable to create subtarget for " +
759-
TripleName,
760-
inconvertibleErrorCode());
761-
762-
std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName));
763-
if (!MRI)
764-
return make_error<StringError>("Unable to create target register info "
765-
"for " +
766-
TripleName,
767-
inconvertibleErrorCode());
768-
769-
MCTargetOptions MCOptions;
770-
std::unique_ptr<MCAsmInfo> MAI(
771-
TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions));
772-
if (!MAI)
773-
return make_error<StringError>("Unable to create target asm info " +
774-
TripleName,
775-
inconvertibleErrorCode());
776-
777-
auto Ctx = std::make_unique<MCContext>(Triple(TripleName), MAI.get(),
778-
MRI.get(), STI.get());
779-
780-
std::unique_ptr<MCDisassembler> Disassembler(
781-
TheTarget->createMCDisassembler(*STI, *Ctx));
782-
if (!Disassembler)
783-
return make_error<StringError>("Unable to create disassembler for " +
784-
TripleName,
785-
inconvertibleErrorCode());
786-
787-
std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo());
788-
if (!MII)
789-
return make_error<StringError>("Unable to create instruction info for" +
790-
TripleName,
791-
inconvertibleErrorCode());
792-
793-
std::unique_ptr<MCInstPrinter> InstPrinter(TheTarget->createMCInstPrinter(
794-
Triple(TripleName), 0, *MAI, *MII, *MRI));
795-
if (!InstPrinter)
796-
return make_error<StringError>(
797-
"Unable to create instruction printer for" + TripleName,
798-
inconvertibleErrorCode());
799-
800-
return TargetInfo({TheTarget, std::move(STI), std::move(MRI),
801-
std::move(MAI), std::move(Ctx), std::move(Disassembler),
802-
std::move(MII), std::move(InstPrinter)});
803-
}
804700
};
805701
} // namespace llvm
806702

807703
RuntimeDyldCheckerImpl::RuntimeDyldCheckerImpl(
808704
IsSymbolValidFunction IsSymbolValid, GetSymbolInfoFunction GetSymbolInfo,
809705
GetSectionInfoFunction GetSectionInfo, GetStubInfoFunction GetStubInfo,
810-
GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, Triple TT,
811-
SubtargetFeatures TF, raw_ostream &ErrStream)
706+
GetGOTInfoFunction GetGOTInfo, support::endianness Endianness,
707+
MCDisassembler *Disassembler, MCInstPrinter *InstPrinter,
708+
raw_ostream &ErrStream)
812709
: IsSymbolValid(std::move(IsSymbolValid)),
813710
GetSymbolInfo(std::move(GetSymbolInfo)),
814711
GetSectionInfo(std::move(GetSectionInfo)),
815712
GetStubInfo(std::move(GetStubInfo)), GetGOTInfo(std::move(GetGOTInfo)),
816-
Endianness(Endianness), TT(std::move(TT)), TF(std::move(TF)),
817-
ErrStream(ErrStream) {}
713+
Endianness(Endianness), Disassembler(Disassembler),
714+
InstPrinter(InstPrinter), ErrStream(ErrStream) {}
818715

819716
bool RuntimeDyldCheckerImpl::check(StringRef CheckExpr) const {
820717
CheckExpr = CheckExpr.trim();
@@ -925,36 +822,6 @@ StringRef RuntimeDyldCheckerImpl::getSymbolContent(StringRef Symbol) const {
925822
return {SymInfo->getContent().data(), SymInfo->getContent().size()};
926823
}
927824

928-
TargetFlagsType RuntimeDyldCheckerImpl::getTargetFlag(StringRef Symbol) const {
929-
auto SymInfo = GetSymbolInfo(Symbol);
930-
if (!SymInfo) {
931-
logAllUnhandledErrors(SymInfo.takeError(), errs(), "RTDyldChecker: ");
932-
return TargetFlagsType{};
933-
}
934-
return SymInfo->getTargetFlags();
935-
}
936-
937-
Triple
938-
RuntimeDyldCheckerImpl::getTripleFromTargetFlag(TargetFlagsType Flag) const {
939-
Triple TheTriple = TT;
940-
941-
switch (TT.getArch()) {
942-
case Triple::ArchType::arm:
943-
if (~Flag & 0x1)
944-
return TT;
945-
TheTriple.setArchName((Twine("thumb") + TT.getArchName().substr(3)).str());
946-
return TheTriple;
947-
case Triple::ArchType::thumb:
948-
if (Flag & 0x1)
949-
return TT;
950-
TheTriple.setArchName((Twine("arm") + TT.getArchName().substr(5)).str());
951-
return TheTriple;
952-
953-
default:
954-
return TT;
955-
}
956-
}
957-
958825
std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getSectionAddr(
959826
StringRef FileName, StringRef SectionName, bool IsInsideLoad) const {
960827

@@ -1017,12 +884,13 @@ std::pair<uint64_t, std::string> RuntimeDyldCheckerImpl::getStubOrGOTAddrFor(
1017884
RuntimeDyldChecker::RuntimeDyldChecker(
1018885
IsSymbolValidFunction IsSymbolValid, GetSymbolInfoFunction GetSymbolInfo,
1019886
GetSectionInfoFunction GetSectionInfo, GetStubInfoFunction GetStubInfo,
1020-
GetGOTInfoFunction GetGOTInfo, support::endianness Endianness, Triple TT,
1021-
SubtargetFeatures TF, raw_ostream &ErrStream)
887+
GetGOTInfoFunction GetGOTInfo, support::endianness Endianness,
888+
MCDisassembler *Disassembler, MCInstPrinter *InstPrinter,
889+
raw_ostream &ErrStream)
1022890
: Impl(::std::make_unique<RuntimeDyldCheckerImpl>(
1023891
std::move(IsSymbolValid), std::move(GetSymbolInfo),
1024892
std::move(GetSectionInfo), std::move(GetStubInfo),
1025-
std::move(GetGOTInfo), Endianness, std::move(TT), std::move(TF),
893+
std::move(GetGOTInfo), Endianness, Disassembler, InstPrinter,
1026894
ErrStream)) {}
1027895

1028896
RuntimeDyldChecker::~RuntimeDyldChecker() = default;

0 commit comments

Comments
 (0)