[llvm] 946e7aa - [llvm-jitlink] Pass object features when creating MCSubtargetInfo
Job Noorman via llvm-commits
llvm-commits at lists.llvm.org
Sat May 13 02:40:15 PDT 2023
Author: Job Noorman
Date: 2023-05-13T11:36:47+02:00
New Revision: 946e7aa6dce96fd9538e8866a9adb8024b53d8f4
URL: https://github.com/llvm/llvm-project/commit/946e7aa6dce96fd9538e8866a9adb8024b53d8f4
DIFF: https://github.com/llvm/llvm-project/commit/946e7aa6dce96fd9538e8866a9adb8024b53d8f4.diff
LOG: [llvm-jitlink] Pass object features when creating MCSubtargetInfo
The reason for this patch is to allow the MCDisassembler used in tests
to disassemble instructions that are only available when a specific
feature is enabled.
For example, on RISC-V it's currently not possible to use
decode_operand() on a compressed instruction. This patch fixes this.
Reviewed By: lhames
Differential Revision: https://reviews.llvm.org/D149523
Added:
Modified:
llvm/tools/llvm-jitlink/llvm-jitlink.cpp
llvm/tools/llvm-jitlink/llvm-jitlink.h
Removed:
################################################################################
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 4aa08f7c7f88..28dba2942cca 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -893,7 +893,8 @@ class PhonyExternalsGenerator : public DefinitionGenerator {
}
};
-Expected<std::unique_ptr<Session>> Session::Create(Triple TT) {
+Expected<std::unique_ptr<Session>> Session::Create(Triple TT,
+ SubtargetFeatures Features) {
std::unique_ptr<ExecutorProcessControl> EPC;
if (OutOfProcessExecutor.getNumOccurrences()) {
@@ -923,6 +924,7 @@ Expected<std::unique_ptr<Session>> Session::Create(Triple TT) {
std::unique_ptr<Session> S(new Session(std::move(EPC), Err));
if (Err)
return std::move(Err);
+ S->Features = std::move(Features);
return std::move(S);
}
@@ -1223,8 +1225,8 @@ Session::findSymbolInfo(StringRef SymbolName, Twine ErrorMsgStem) {
} // end namespace llvm
-static Triple getFirstFileTriple() {
- static Triple FirstTT = []() {
+static std::pair<Triple, SubtargetFeatures> getFirstFileTripleAndFeatures() {
+ static std::pair<Triple, SubtargetFeatures> FirstTTAndFeatures = []() {
assert(!InputFiles.empty() && "InputFiles can not be empty");
for (auto InputFile : InputFiles) {
auto ObjBuffer = ExitOnErr(getFile(InputFile));
@@ -1241,16 +1243,19 @@ static Triple getFirstFileTriple() {
TT.setObjectFormat(Triple::COFF);
TT.setOS(Triple::OSType::Win32);
}
- return TT;
+ SubtargetFeatures Features;
+ if (auto ObjFeatures = Obj->getFeatures())
+ Features = std::move(*ObjFeatures);
+ return std::make_pair(TT, Features);
}
default:
break;
}
}
- return Triple();
+ return std::make_pair(Triple(), SubtargetFeatures());
}();
- return FirstTT;
+ return FirstTTAndFeatures;
}
static Error sanitizeArguments(const Triple &TT, const char *ArgV0) {
@@ -1808,7 +1813,9 @@ struct TargetInfo {
};
} // anonymous namespace
-static TargetInfo getTargetInfo(const Triple &TT) {
+static TargetInfo
+getTargetInfo(const Triple &TT,
+ const SubtargetFeatures &TF = SubtargetFeatures()) {
auto TripleName = TT.str();
std::string ErrorStr;
const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, ErrorStr);
@@ -1818,7 +1825,7 @@ static TargetInfo getTargetInfo(const Triple &TT) {
inconvertibleErrorCode()));
std::unique_ptr<MCSubtargetInfo> STI(
- TheTarget->createMCSubtargetInfo(TripleName, "", ""));
+ TheTarget->createMCSubtargetInfo(TripleName, "", TF.getString()));
if (!STI)
ExitOnErr(
make_error<StringError>("Unable to create subtarget for " + TripleName,
@@ -1879,7 +1886,7 @@ static Error runChecks(Session &S) {
LLVM_DEBUG(dbgs() << "Running checks...\n");
- auto TI = getTargetInfo(S.ES.getTargetTriple());
+ auto TI = getTargetInfo(S.ES.getTargetTriple(), S.Features);
auto IsSymbolValid = [&S](StringRef Symbol) {
return S.isSymbolRegistered(Symbol);
@@ -2026,9 +2033,10 @@ int main(int argc, char *argv[]) {
std::unique_ptr<JITLinkTimers> Timers =
ShowTimes ? std::make_unique<JITLinkTimers>() : nullptr;
- ExitOnErr(sanitizeArguments(getFirstFileTriple(), argv[0]));
+ auto [TT, Features] = getFirstFileTripleAndFeatures();
+ ExitOnErr(sanitizeArguments(TT, argv[0]));
- auto S = ExitOnErr(Session::Create(getFirstFileTriple()));
+ auto S = ExitOnErr(Session::Create(std::move(TT), std::move(Features)));
{
TimeRegion TR(Timers ? &Timers->LoadObjectsTimer : nullptr);
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.h b/llvm/tools/llvm-jitlink/llvm-jitlink.h
index 8ec668ab86b9..c89d829f5c14 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.h
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.h
@@ -19,6 +19,7 @@
#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/Orc/SimpleRemoteEPC.h"
#include "llvm/ExecutionEngine/RuntimeDyldChecker.h"
+#include "llvm/MC/SubtargetFeature.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/Regex.h"
#include "llvm/Support/raw_ostream.h"
@@ -36,10 +37,12 @@ struct Session {
orc::JITDylib *MainJD = nullptr;
orc::ObjectLinkingLayer ObjLayer;
orc::JITDylibSearchOrder JDSearchOrder;
+ SubtargetFeatures Features;
~Session();
- static Expected<std::unique_ptr<Session>> Create(Triple TT);
+ static Expected<std::unique_ptr<Session>> Create(Triple TT,
+ SubtargetFeatures Features);
void dumpSessionInfo(raw_ostream &OS);
void modifyPassConfig(const Triple &FTT,
jitlink::PassConfiguration &PassConfig);
More information about the llvm-commits
mailing list