xo-jit: setup analsysis pipeline (most of kaleidoscope4)

This commit is contained in:
Roland Conybeare 2024-06-15 16:02:56 -04:00
commit f7db84972f
2 changed files with 48 additions and 3 deletions

View file

@ -79,7 +79,10 @@ namespace xo {
/** target triple = string describing target host for codegen **/ /** target triple = string describing target host for codegen **/
const std::string & target_triple() const; const std::string & target_triple() const;
/** append function names defined in attached module to *p_v **/ /** append function names defined in attached module to *p_v
*
* (RC 15jun2024 - this part is working)
**/
std::vector<std::string> get_function_name_v(); std::vector<std::string> get_function_name_v();
/** write state of execution session (all the associated dynamic libraries) **/ /** write state of execution session (all the associated dynamic libraries) **/
@ -148,8 +151,27 @@ namespace xo {
std::map<std::string, xo::ref::rp<Expression>> global_env_; std::map<std::string, xo::ref::rp<Expression>> global_env_;
/** map variable names (formal parameters) to /** map variable names (formal parameters) to
* corresponding llvm interactor * corresponding llvm interactor
*
* only supports one level atm (i.e. only top-level functions)
**/ **/
std::map<std::string, llvm::Value*> nested_env_; std::map<std::string, llvm::Value*> nested_env_;
// ----- transforms (also adapted from kaleidescope.cpp) ------
/** manages all the passes+analaysis (?) **/
std::unique_ptr<llvm::FunctionPassManager> llvm_fpmgr_;
/** loop analysis (?) **/
std::unique_ptr<llvm::LoopAnalysisManager> llvm_lamgr_;
/** function-level analysis (?) **/
std::unique_ptr<llvm::FunctionAnalysisManager> llvm_famgr_;
/** cgscc (?) analysis **/
std::unique_ptr<llvm::CGSCCAnalysisManager> llvm_cgamgr_;
/** module analsyis (?) **/
std::unique_ptr<llvm::ModuleAnalysisManager> llvm_mamgr_;
/** pass instrumentation **/
std::unique_ptr<llvm::PassInstrumentationCallbacks> llvm_pic_;
/** standard instrumentation **/
std::unique_ptr<llvm::StandardInstrumentations> llvm_si_;
}; /*Jit*/ }; /*Jit*/
inline std::ostream & inline std::ostream &

View file

@ -67,6 +67,7 @@ namespace xo {
} }
#endif #endif
static llvm::ExitOnError llvm_exit_on_err; static llvm::ExitOnError llvm_exit_on_err;
std::unique_ptr<KaleidoscopeJIT> kal_jit = llvm_exit_on_err(KaleidoscopeJIT::Create()); std::unique_ptr<KaleidoscopeJIT> kal_jit = llvm_exit_on_err(KaleidoscopeJIT::Create());
@ -139,6 +140,28 @@ namespace xo {
if (!llvm_module_.get()) { if (!llvm_module_.get()) {
throw std::runtime_error("Jit::ctor: expected non-empty llvm module"); throw std::runtime_error("Jit::ctor: expected non-empty llvm module");
} }
this->llvm_fpmgr_ = std::make_unique<llvm::FunctionPassManager>();
this->llvm_lamgr_ = std::make_unique<llvm::LoopAnalysisManager>();
this->llvm_famgr_ = std::make_unique<llvm::FunctionAnalysisManager>();
this->llvm_cgamgr_ = std::make_unique<llvm::CGSCCAnalysisManager>();
this->llvm_mamgr_ = std::make_unique<llvm::ModuleAnalysisManager>();
this->llvm_pic_ = std::make_unique<llvm::PassInstrumentationCallbacks>();
this->llvm_si_ = std::make_unique<llvm::StandardInstrumentations>(*llvm_cx_,
/*DebugLogging*/ true);
this->llvm_si_->registerCallbacks(*llvm_pic_, llvm_mamgr_.get());
// TODO: llvm_fpmgr_->addPass(InstCombinePass()) etc.
// TODO: llvm_fpmgr_->addPass(ReassociatePass()) etc.
// TODO: llvm_fpmgr_->addPass(GVNPasss()) etc.
// TODO: llvm_fpmgr_->addPass(SimplifyCFGPass()) etc.
/** tracking for analysis passes that share info? **/
llvm::PassBuilder llvm_pass_builder;
llvm_pass_builder.registerModuleAnalyses(*llvm_mamgr_);
llvm_pass_builder.registerFunctionAnalyses(*llvm_famgr_);
llvm_pass_builder.crossRegisterProxies(*llvm_lamgr_, *llvm_famgr_, *llvm_cgamgr_, *llvm_mamgr_);
} }
const std::string & const std::string &
@ -389,8 +412,8 @@ namespace xo {
/* validate! always validate! */ /* validate! always validate! */
llvm::verifyFunction(*fn); llvm::verifyFunction(*fn);
/* optimize! */ /* optimize! does this generate code? */
// thefpm->run(*fn, *thefam); llvm_fpmgr_->run(*fn, *llvm_famgr_);
return fn; return fn;
} }