@@ -26,6 +26,103 @@ void ReOptimizeLayer::ReOptMaterializationUnitState::reoptimizeFailed() {
2626 Reoptimizing = false ;
2727}
2828
29+ static void orc_rt_lite_reoptimize_helper (
30+ shared::CWrapperFunctionBuffer (*JITDispatch)(void *Ctx, void *Tag,
31+ void *Data, size_t Size),
32+ void *JITDispatchCtx, void *Tag, uint64_t MUID, uint32_t CurVersion) {
33+ // Serialize the arguments into a WrapperFunctionBuffer and call dispatch.
34+ using SPSArgs = shared::SPSArgList<uint64_t , uint32_t >;
35+ auto ArgBytes =
36+ shared::WrapperFunctionBuffer::allocate (SPSArgs::size (MUID, CurVersion));
37+ shared::SPSOutputBuffer OB (ArgBytes.data (), ArgBytes.size ());
38+ if (!SPSArgs::serialize (OB, MUID, CurVersion)) {
39+ errs ()
40+ << " Reoptimization error: could not serialize reoptimization arguments" ;
41+ abort ();
42+ }
43+ shared::WrapperFunctionBuffer Buf{
44+ JITDispatch (JITDispatchCtx, Tag, ArgBytes.data (), ArgBytes.size ())};
45+
46+ if (const char *ErrMsg = Buf.getOutOfBandError ()) {
47+ errs () << " Reoptimization error: " << ErrMsg << " \n aborting.\n " ;
48+ abort ();
49+ }
50+ }
51+
52+ Error ReOptimizeLayer::addOrcRTLiteSupport (JITDylib &PlatformJD,
53+ const DataLayout &DL) {
54+ auto Ctx = std::make_unique<LLVMContext>();
55+ auto Mod = std::make_unique<Module>(" orc-rt-lite-reoptimize.ll" , *Ctx);
56+ Mod->setDataLayout (DL);
57+
58+ IRBuilder<> Builder (*Ctx);
59+
60+ // Create basic types portably
61+ Type *VoidTy = Type::getVoidTy (*Ctx);
62+ Type *Int8Ty = Type::getInt8Ty (*Ctx);
63+ Type *Int32Ty = Type::getInt32Ty (*Ctx);
64+ Type *Int64Ty = Type::getInt64Ty (*Ctx);
65+ Type *VoidPtrTy = PointerType::getUnqual (*Ctx);
66+
67+ // Helper function type: void (void*, void*, void*, uint64_t, uint32_t)
68+ FunctionType *HelperFnTy = FunctionType::get (
69+ VoidTy, {VoidPtrTy, VoidPtrTy, VoidPtrTy, Int64Ty, Int32Ty}, false );
70+
71+ // Define ReoptimizeTag with initializer = 0
72+ GlobalVariable *ReoptimizeTag = new GlobalVariable (
73+ *Mod, Int8Ty, false , GlobalValue::ExternalLinkage,
74+ ConstantInt::get (Int8Ty, 0 ), " __orc_rt_reoptimize_tag" );
75+
76+ // Define orc_rt_lite_reoptimize function: void (uint64_t, uint32_t)
77+ FunctionType *ReOptimizeFnTy =
78+ FunctionType::get (VoidTy, {Int64Ty, Int32Ty}, false );
79+
80+ Function *ReOptimizeFn =
81+ Function::Create (ReOptimizeFnTy, Function::ExternalLinkage,
82+ " __orc_rt_reoptimize" , Mod.get ());
83+
84+ // Set parameter names
85+ auto ArgIt = ReOptimizeFn->arg_begin ();
86+ Value *MUID = &*ArgIt++;
87+ MUID->setName (" MUID" );
88+ Value *CurVersion = &*ArgIt;
89+ CurVersion->setName (" CurVersion" );
90+
91+ // Build function body
92+ BasicBlock *Entry = BasicBlock::Create (*Ctx, " entry" , ReOptimizeFn);
93+ Builder.SetInsertPoint (Entry);
94+
95+ // Create absolute address constants
96+ auto &JDI = PlatformJD.getExecutionSession ()
97+ .getExecutorProcessControl ()
98+ .getJITDispatchInfo ();
99+
100+ Type *IntPtrTy = DL.getIntPtrType (*Ctx);
101+ Constant *JITDispatchPtr = ConstantExpr::getIntToPtr (
102+ ConstantInt::get (IntPtrTy, JDI.JITDispatchFunction .getValue ()),
103+ VoidPtrTy);
104+ Constant *JITDispatchCtxPtr = ConstantExpr::getIntToPtr (
105+ ConstantInt::get (IntPtrTy, JDI.JITDispatchContext .getValue ()), VoidPtrTy);
106+ Constant *HelperFnAddr = ConstantExpr::getIntToPtr (
107+ ConstantInt::get (IntPtrTy, reinterpret_cast <uintptr_t >(
108+ &orc_rt_lite_reoptimize_helper)),
109+ PointerType::getUnqual (*Ctx));
110+
111+ // Cast ReoptimizeTag to void*
112+ Value *ReoptimizeTagPtr = Builder.CreatePointerCast (ReoptimizeTag, VoidPtrTy);
113+
114+ // Call the helper function
115+ Builder.CreateCall (
116+ HelperFnTy, HelperFnAddr,
117+ {JITDispatchPtr, JITDispatchCtxPtr, ReoptimizeTagPtr, MUID, CurVersion});
118+
119+ // Return void
120+ Builder.CreateRetVoid ();
121+
122+ return BaseLayer.add (PlatformJD,
123+ ThreadSafeModule (std::move (Mod), std::move (Ctx)));
124+ }
125+
29126Error ReOptimizeLayer::registerRuntimeFunctions (JITDylib &PlatformJD) {
30127 ExecutionSession::JITDispatchHandlerAssociationMap WFs;
31128 using ReoptimizeSPSSig = shared::SPSError (uint64_t , uint32_t );
@@ -88,12 +185,6 @@ Error ReOptimizeLayer::reoptimizeIfCallFrequent(ReOptimizeLayer &Parent,
88185 GlobalVariable *Counter = new GlobalVariable (
89186 M, I64Ty, false , GlobalValue::InternalLinkage,
90187 Constant::getNullValue (I64Ty), " __orc_reopt_counter" );
91- auto ArgBufferConst = createReoptimizeArgBuffer (M, MUID, CurVersion);
92- if (auto Err = ArgBufferConst.takeError ())
93- return Err;
94- GlobalVariable *ArgBuffer =
95- new GlobalVariable (M, (*ArgBufferConst)->getType (), true ,
96- GlobalValue::InternalLinkage, (*ArgBufferConst));
97188 for (auto &F : M) {
98189 if (F.isDeclaration ())
99190 continue ;
@@ -107,7 +198,7 @@ Error ReOptimizeLayer::reoptimizeIfCallFrequent(ReOptimizeLayer &Parent,
107198 Value *Added = IRB.CreateAdd (Cnt, ConstantInt::get (I64Ty, 1 ));
108199 (void )IRB.CreateStore (Added, Counter);
109200 Instruction *SplitTerminator = SplitBlockAndInsertIfThen (Cmp, IP, false );
110- createReoptimizeCall (M, *SplitTerminator, ArgBuffer );
201+ createReoptimizeCall (M, *SplitTerminator, MUID, CurVersion );
111202 }
112203 return Error::success ();
113204 });
@@ -195,49 +286,23 @@ void ReOptimizeLayer::rt_reoptimize(SendErrorFn SendResult,
195286 SendResult (Error::success ());
196287}
197288
198- Expected<Constant *> ReOptimizeLayer::createReoptimizeArgBuffer (
199- Module &M, ReOptMaterializationUnitID MUID, uint32_t CurVersion) {
200- size_t ArgBufferSize = SPSReoptimizeArgList::size (MUID, CurVersion);
201- std::vector<char > ArgBuffer (ArgBufferSize);
202- shared::SPSOutputBuffer OB (ArgBuffer.data (), ArgBuffer.size ());
203- if (!SPSReoptimizeArgList::serialize (OB, MUID, CurVersion))
204- return make_error<StringError>(" Could not serealize args list" ,
205- inconvertibleErrorCode ());
206- return ConstantDataArray::get (M.getContext (), ArrayRef (ArgBuffer));
207- }
208-
209289void ReOptimizeLayer::createReoptimizeCall (Module &M, Instruction &IP,
210- GlobalVariable *ArgBuffer) {
211- GlobalVariable *DispatchCtx =
212- M.getGlobalVariable (" __orc_rt_jit_dispatch_ctx" );
213- if (!DispatchCtx)
214- DispatchCtx = new GlobalVariable (M, PointerType::get (M.getContext (), 0 ),
215- false , GlobalValue::ExternalLinkage,
216- nullptr , " __orc_rt_jit_dispatch_ctx" );
217- GlobalVariable *ReoptimizeTag =
218- M.getGlobalVariable (" __orc_rt_reoptimize_tag" );
219- if (!ReoptimizeTag)
220- ReoptimizeTag = new GlobalVariable (M, PointerType::get (M.getContext (), 0 ),
221- false , GlobalValue::ExternalLinkage,
222- nullptr , " __orc_rt_reoptimize_tag" );
223- Function *DispatchFunc = M.getFunction (" __orc_rt_jit_dispatch" );
224- if (!DispatchFunc) {
225- std::vector<Type *> Args = {PointerType::get (M.getContext (), 0 ),
226- PointerType::get (M.getContext (), 0 ),
227- PointerType::get (M.getContext (), 0 ),
228- IntegerType::get (M.getContext (), 64 )};
290+ ReOptMaterializationUnitID MUID,
291+ uint32_t CurVersion) {
292+ Type *MUIDTy = IntegerType::get (M.getContext (), 64 );
293+ Type *VersionTy = IntegerType::get (M.getContext (), 32 );
294+ Function *ReoptimizeFunc = M.getFunction (" __orc_rt_reoptimize" );
295+ if (!ReoptimizeFunc) {
296+ std::vector<Type *> ArgTys = {MUIDTy, VersionTy};
229297 FunctionType *FuncTy =
230- FunctionType::get (Type::getVoidTy (M.getContext ()), Args , false );
231- DispatchFunc = Function::Create (FuncTy, GlobalValue::ExternalLinkage,
232- " __orc_rt_jit_dispatch " , &M);
298+ FunctionType::get (Type::getVoidTy (M.getContext ()), ArgTys , false );
299+ ReoptimizeFunc = Function::Create (FuncTy, GlobalValue::ExternalLinkage,
300+ " __orc_rt_reoptimize " , &M);
233301 }
234- size_t ArgBufferSizeConst =
235- SPSReoptimizeArgList::size (ReOptMaterializationUnitID{}, uint32_t {});
236- Constant *ArgBufferSize = ConstantInt::get (
237- IntegerType::get (M.getContext (), 64 ), ArgBufferSizeConst, false );
302+ Constant *MUIDArg = ConstantInt::get (MUIDTy, MUID, false );
303+ Constant *CurVersionArg = ConstantInt::get (VersionTy, CurVersion, false );
238304 IRBuilder<> IRB (&IP);
239- (void )IRB.CreateCall (DispatchFunc,
240- {DispatchCtx, ReoptimizeTag, ArgBuffer, ArgBufferSize});
305+ (void )IRB.CreateCall (ReoptimizeFunc, {MUIDArg, CurVersionArg});
241306}
242307
243308ReOptimizeLayer::ReOptMaterializationUnitState &
0 commit comments