[llvm-dev] Segmentation faults running the new llvm ModulePassManager with default pipeline

Sanket Diwale via llvm-dev llvm-dev at lists.llvm.org
Sat Oct 16 17:36:49 PDT 2021


I am currently writing a frontend language compiling to LLVM IR using the
LLVM c++ API (LLVM version 13), however I see some erratic behavior with
segmentation faults when running the new ModulePassManager. Specifically I
see the debugger halts execution in the llvm::EarlyCSEPass::run function
call when a segmentation fault occurs. Can't see where exactly the seg
fault happens inside this function as I am not currently using a debug
build for the LLVM source code itself.

I think the seg fault might have something to do with the way I set up my
pass manager and run the pass manger on new instances of llvm::Module
without any kind of reset to the pass analysis manager (not sure if this
guess is correct though). I have highlighted my current code that sets up
and runs the pass manager below. I would be grateful if you could give any
insights into what I might be doing wrong and how it should be done
correctly.

Best, Sanket

/*
I have a "CodeGenerator" class object that holds the pass manager and
the other related objects as public members
*/
class CodeGenerator {

public:
   llvm::PassBuilder passBuilder;
   llvm::LoopAnalysisManager loopAnalysisManager;
   llvm::FunctionAnalysisManager functionAnalysisManager;
   llvm::CGSCCAnalysisManager cGSCCAnalysisManager;
   llvm::ModuleAnalysisManager moduleAnalysisManager;
   llvm::ModulePassManager modulePassManager;
   CodeGenerator(); // constructor for the class
   // other code that handles emitting the LLVM IR from the parsed AST
of the front-end code

   // I keep the llvm::Module and llvm::Context instances to which the
ir is emitted within this class as members
   llvm::orc::ThreadSafeContext Ctx;
   std::unique_ptr<llvm::Module> TheModule;

}
/*
I initialize the ModulePassManager in the class constructor
*/CodeGenerator(): Ctx(std::make_unique<llvm::LLVMContext>()) {public:
  passBuilder.registerModuleAnalyses(moduleAnalysisManager);
  passBuilder.registerCGSCCAnalyses(cGSCCAnalysisManager);
  passBuilder.registerFunctionAnalyses(functionAnalysisManager);
  passBuilder.registerLoopAnalyses(loopAnalysisManager);
  passBuilder.crossRegisterProxies(
     loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager,
     moduleAnalysisManager);
  modulePassManager =
passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O0);
}


After calling the constructor for the above class

I initialize the Module to which the llvm ir is emitted.

CodeGenerator CG = CodeGenerator();

CG.TheModule = std::make_unique<llvm::Module>("module_name",
*(CG.Ctx.getContext()));
// I parse my front end code and emit my llvm ir code to TheModule here
// then I call the ModulePassManager here to optimize the module
CG.modulePassManager.run(*CG.TheModule, CG.moduleAnalysisManager);// I
move the optimized module to my JIT interpreterauto TSM =
llvm::orc::ThreadSafeModule(std::move(CG.TheModule),CG.Ctx);ExitOnErr(TheJIT->addModule(std::move(TSM)));
// Then, I create a new instance of llvm::Module to emit some other ir code

CG.TheModule = std::make_unique<llvm::Module>(ModuleName,
*(CG.Ctx.getContext()));
// emit ir
// then call the optimizer again
CG.modulePassManager.run(*CG.TheModule, CG.moduleAnalysisManager);
// I repeat this several times changing TheModule to a new instance//
of llvm::Module to contain some new ir code and run the optimizer.
// one of these calls to CG.modulePassManager.run ends up giving the
segmentation fault // there is no specific fixed instance of
llvm::Module that this happens for// The segmentation fault seems to
happen at random for any one of the instances, on some runs there is
no seg fault // The ir being emitted is also not changed on any of the
runs

My suspicion is that CG.moduleAnalysisManager might need some kind of reset
after I change the Module instance before I can run the ModulePassManager
on the newly emitted ir. Or maybe I am missing something else in how the
pass manager needs to be setup. Any help would be great.

Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20211016/f47d1404/attachment.html>


More information about the llvm-dev mailing list