Skip to content

Commit f879d20

Browse files
authored
Merge pull request #44276 from JuliaLang/vc/newpm3
Make another wave of passes NewPM compatible
2 parents f45b6ad + b0a3130 commit f879d20

File tree

7 files changed

+197
-89
lines changed

7 files changed

+197
-89
lines changed

src/aotcompile.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,15 @@ static void registerCallbacks(PassBuilder &PB) {
899899
PM.addPass(PropagateJuliaAddrspacesPass());
900900
return true;
901901
}
902+
if (Name == "LowerExcHandlers") {
903+
PM.addPass(LowerExcHandlers());
904+
return true;
905+
}
906+
if (Name == "GCInvariantVerifier") {
907+
// TODO: Parse option and allow users to set `Strong`
908+
PM.addPass(GCInvariantVerifierPass());
909+
return true;
910+
}
902911
return false;
903912
});
904913

@@ -925,6 +934,14 @@ static void registerCallbacks(PassBuilder &PB) {
925934
PM.addPass(RemoveJuliaAddrspacesPass());
926935
return true;
927936
}
937+
if (Name == "MultiVersioning") {
938+
PM.addPass(MultiVersioning());
939+
return true;
940+
}
941+
if (Name == "LowerPTLS") {
942+
PM.addPass(LowerPTLSPass());
943+
return true;
944+
}
928945
return false;
929946
});
930947

src/llvm-gc-invariant-verifier.cpp

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// See the devdocs for a description of these invariants.
55

66
#include "llvm-version.h"
7+
#include "passes.h"
78

89
#include <llvm-c/Core.h>
910
#include <llvm-c/Types.h>
@@ -33,11 +34,10 @@
3334

3435
using namespace llvm;
3536

36-
struct GCInvariantVerifier : public FunctionPass, public InstVisitor<GCInvariantVerifier> {
37-
static char ID;
37+
struct GCInvariantVerifier : public InstVisitor<GCInvariantVerifier> {
3838
bool Broken = false;
3939
bool Strong;
40-
GCInvariantVerifier(bool Strong = false) : FunctionPass(ID), Strong(Strong) {}
40+
GCInvariantVerifier(bool Strong = false) : Strong(Strong) {}
4141

4242
private:
4343
void Check(bool Cond, const char *message, Value *Val) {
@@ -48,12 +48,6 @@ struct GCInvariantVerifier : public FunctionPass, public InstVisitor<GCInvariant
4848
}
4949

5050
public:
51-
void getAnalysisUsage(AnalysisUsage &AU) const override {
52-
FunctionPass::getAnalysisUsage(AU);
53-
AU.setPreservesAll();
54-
}
55-
56-
bool runOnFunction(Function &F) override;
5751
void visitAddrSpaceCastInst(AddrSpaceCastInst &I);
5852
void visitLoadInst(LoadInst &LI);
5953
void visitStoreInst(StoreInst &SI);
@@ -188,19 +182,41 @@ void GCInvariantVerifier::visitPtrToIntInst(PtrToIntInst &PII) {
188182
"Illegal inttoptr", &PII);
189183
}
190184

191-
bool GCInvariantVerifier::runOnFunction(Function &F) {
192-
visit(F);
193-
if (Broken) {
185+
PreservedAnalyses GCInvariantVerifierPass::run(Function &F, FunctionAnalysisManager &AM) {
186+
GCInvariantVerifier GIV(Strong);
187+
GIV.visit(F);
188+
if (GIV.Broken) {
194189
abort();
195190
}
196-
return false;
191+
return PreservedAnalyses::all();
197192
}
198193

199-
char GCInvariantVerifier::ID = 0;
200-
static RegisterPass<GCInvariantVerifier> X("GCInvariantVerifier", "GC Invariant Verification Pass", false, false);
194+
struct GCInvariantVerifierLegacy : public FunctionPass {
195+
static char ID;
196+
bool Strong;
197+
GCInvariantVerifierLegacy(bool Strong=false) : FunctionPass(ID), Strong(Strong) {}
198+
199+
public:
200+
void getAnalysisUsage(AnalysisUsage &AU) const override {
201+
FunctionPass::getAnalysisUsage(AU);
202+
AU.setPreservesAll();
203+
}
204+
205+
bool runOnFunction(Function &F) override {
206+
GCInvariantVerifier GIV(Strong);
207+
GIV.visit(F);
208+
if (GIV.Broken) {
209+
abort();
210+
}
211+
return false;
212+
}
213+
};
214+
215+
char GCInvariantVerifierLegacy::ID = 0;
216+
static RegisterPass<GCInvariantVerifierLegacy> X("GCInvariantVerifier", "GC Invariant Verification Pass", false, false);
201217

202218
Pass *createGCInvariantVerifierPass(bool Strong) {
203-
return new GCInvariantVerifier(Strong);
219+
return new GCInvariantVerifierLegacy(Strong);
204220
}
205221

206222
extern "C" JL_DLLEXPORT void LLVMExtraAddGCInvariantVerifierPass_impl(LLVMPassManagerRef PM, LLVMBool Strong)

src/llvm-lower-handlers.cpp

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// This file is a part of Julia. License is MIT: https://julialang.org/license
22

33
#include "llvm-version.h"
4+
#include "passes.h"
45

56
#include <llvm-c/Core.h>
67
#include <llvm-c/Types.h>
@@ -70,23 +71,8 @@ using namespace llvm;
7071
* handler structures to tell LLVM that it is free to re-use the stack slot
7172
* while the handler is not being used.
7273
*/
73-
struct LowerExcHandlers : public FunctionPass {
74-
static char ID;
75-
LowerExcHandlers() : FunctionPass(ID)
76-
{}
77-
78-
private:
79-
Function *except_enter_func;
80-
Function *leave_func;
81-
Function *jlenter_func;
82-
Function *setjmp_func;
83-
Function *lifetime_start;
84-
Function *lifetime_end;
85-
86-
bool doInitialization(Module &M) override;
87-
bool runOnFunction(Function &F) override;
88-
};
8974

75+
namespace {
9076
/*
9177
* If the module doesn't have declarations for the jl_enter_handler and setjmp
9278
* functions, insert them.
@@ -115,24 +101,19 @@ static void ensure_enter_function(Module &M)
115101
}
116102
}
117103

118-
bool LowerExcHandlers::doInitialization(Module &M) {
119-
except_enter_func = M.getFunction("julia.except_enter");
104+
static bool lowerExcHandlers(Function &F) {
105+
Module &M = *F.getParent();
106+
Function *except_enter_func = M.getFunction("julia.except_enter");
120107
if (!except_enter_func)
121-
return false;
108+
return false; // No EH frames in this module
122109
ensure_enter_function(M);
123-
leave_func = M.getFunction(XSTR(jl_pop_handler));
124-
jlenter_func = M.getFunction(XSTR(jl_enter_handler));
125-
setjmp_func = M.getFunction(jl_setjmp_name);
110+
Function *leave_func = M.getFunction(XSTR(jl_pop_handler));
111+
Function *jlenter_func = M.getFunction(XSTR(jl_enter_handler));
112+
Function *setjmp_func = M.getFunction(jl_setjmp_name);
126113

127114
auto T_pint8 = Type::getInt8PtrTy(M.getContext(), 0);
128-
lifetime_start = Intrinsic::getDeclaration(&M, Intrinsic::lifetime_start, { T_pint8 });
129-
lifetime_end = Intrinsic::getDeclaration(&M, Intrinsic::lifetime_end, { T_pint8 });
130-
return true;
131-
}
132-
133-
bool LowerExcHandlers::runOnFunction(Function &F) {
134-
if (!except_enter_func)
135-
return false; // No EH frames in this module
115+
Function *lifetime_start = Intrinsic::getDeclaration(&M, Intrinsic::lifetime_start, { T_pint8 });
116+
Function *lifetime_end = Intrinsic::getDeclaration(&M, Intrinsic::lifetime_end, { T_pint8 });
136117

137118
/* Step 1: EH Depth Numbering */
138119
std::map<llvm::CallInst *, int> EnterDepth;
@@ -237,14 +218,32 @@ bool LowerExcHandlers::runOnFunction(Function &F) {
237218
return true;
238219
}
239220

240-
char LowerExcHandlers::ID = 0;
241-
static RegisterPass<LowerExcHandlers> X("LowerExcHandlers", "Lower Julia Exception Handlers",
221+
} // anonymous namespace
222+
223+
PreservedAnalyses LowerExcHandlers::run(Function &F, FunctionAnalysisManager &AM)
224+
{
225+
lowerExcHandlers(F);
226+
return PreservedAnalyses::all();
227+
}
228+
229+
230+
struct LowerExcHandlersLegacy : public FunctionPass {
231+
static char ID;
232+
LowerExcHandlersLegacy() : FunctionPass(ID)
233+
{}
234+
bool runOnFunction(Function &F) {
235+
return lowerExcHandlers(F);
236+
}
237+
};
238+
239+
char LowerExcHandlersLegacy::ID = 0;
240+
static RegisterPass<LowerExcHandlersLegacy> X("LowerExcHandlers", "Lower Julia Exception Handlers",
242241
false /* Only looks at CFG */,
243242
false /* Analysis Pass */);
244243

245244
Pass *createLowerExcHandlersPass()
246245
{
247-
return new LowerExcHandlers();
246+
return new LowerExcHandlersLegacy();
248247
}
249248

250249
extern "C" JL_DLLEXPORT void LLVMExtraAddLowerExcHandlersPass_impl(LLVMPassManagerRef PM)

0 commit comments

Comments
 (0)