Nyx wrote:> Ok, well, I seem to have pinpointed the cause of the problem more accurately. > I'm running some optimization passes on my module after I compile each > function in my scripting language (functions can be compiled at various > times, when scripts are loaded). Now it seems these optimization passes will > prune some of the native C++ functions I'm registering in my module (the > functions that haven't been called/used yet). I'd like to find a way to > disable this so that all the native functions I register will stay in the > module."externally visible" functions should never be deleted. What's the linkage type on your functions? internal? Don't mark things internal unless you don't mind if they go away. :) Nick> Here are the optimization passes I'm running: > > passManager.add(new llvm::TargetData(s_pModule)); > passManager.add(llvm::createLowerSetJmpPass()); > passManager.add(llvm::createRaiseAllocationsPass()); > passManager.add(llvm::createCFGSimplificationPass()); > passManager.add(llvm::createPromoteMemoryToRegisterPass()); > passManager.add(llvm::createGlobalOptimizerPass()); > passManager.add(llvm::createGlobalDCEPass()); > passManager.add(llvm::createFunctionInliningPass()); > > I would like to know either which pass does this (global optimizer maybe?) > so I can disable it, or what flag I can set on my C++ function objects to > keep them from being pruned out.
The linkage type is set to external, I have little code snippet I use to register those native functions in the first post of this topic. The global DCE pass deletes the unused native functions when run. I commented it out for now... Nick Lewycky wrote:> > Nyx wrote: >> Ok, well, I seem to have pinpointed the cause of the problem more >> accurately. >> I'm running some optimization passes on my module after I compile each >> function in my scripting language (functions can be compiled at various >> times, when scripts are loaded). Now it seems these optimization passes >> will >> prune some of the native C++ functions I'm registering in my module (the >> functions that haven't been called/used yet). I'd like to find a way to >> disable this so that all the native functions I register will stay in the >> module. > > "externally visible" functions should never be deleted. What's the > linkage type on your functions? internal? Don't mark things internal > unless you don't mind if they go away. :) > > Nick > >> Here are the optimization passes I'm running: >> >> passManager.add(new llvm::TargetData(s_pModule)); >> passManager.add(llvm::createLowerSetJmpPass()); >> passManager.add(llvm::createRaiseAllocationsPass()); >> passManager.add(llvm::createCFGSimplificationPass()); >> passManager.add(llvm::createPromoteMemoryToRegisterPass()); >> passManager.add(llvm::createGlobalOptimizerPass()); >> passManager.add(llvm::createGlobalDCEPass()); >> passManager.add(llvm::createFunctionInliningPass()); >> >> I would like to know either which pass does this (global optimizer >> maybe?) >> so I can disable it, or what flag I can set on my C++ function objects to >> keep them from being pruned out. > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-- View this message in context: http://www.nabble.com/Strange-LLVM-Crash-tp22508882p22517815.html Sent from the LLVM - Dev mailing list archive at Nabble.com.
Nyx wrote:> The linkage type is set to external, I have little code snippet I use to > register those native functions in the first post of this topic. The global > DCE pass deletes the unused native functions when run. I commented it out > for now...Can you make this happen by writing a custom .ll to demonstrate the problem? For example: $ cat gdce.ll define i32 @foo() { ret i32 0 } $ llvm-as < gdce.ll | opt -globaldce | llvm-dis ; ModuleID = '<stdin>' define i32 @foo() { ret i32 0 } If it happens as you say, you should be able to create a .ll where "opt -globaldce" will eliminate your function. Nick> > > Nick Lewycky wrote: >> Nyx wrote: >>> Ok, well, I seem to have pinpointed the cause of the problem more >>> accurately. >>> I'm running some optimization passes on my module after I compile each >>> function in my scripting language (functions can be compiled at various >>> times, when scripts are loaded). Now it seems these optimization passes >>> will >>> prune some of the native C++ functions I'm registering in my module (the >>> functions that haven't been called/used yet). I'd like to find a way to >>> disable this so that all the native functions I register will stay in the >>> module. >> "externally visible" functions should never be deleted. What's the >> linkage type on your functions? internal? Don't mark things internal >> unless you don't mind if they go away. :) >> >> Nick >> >>> Here are the optimization passes I'm running: >>> >>> passManager.add(new llvm::TargetData(s_pModule)); >>> passManager.add(llvm::createLowerSetJmpPass()); >>> passManager.add(llvm::createRaiseAllocationsPass()); >>> passManager.add(llvm::createCFGSimplificationPass()); >>> passManager.add(llvm::createPromoteMemoryToRegisterPass()); >>> passManager.add(llvm::createGlobalOptimizerPass()); >>> passManager.add(llvm::createGlobalDCEPass()); >>> passManager.add(llvm::createFunctionInliningPass()); >>> >>> I would like to know either which pass does this (global optimizer >>> maybe?) >>> so I can disable it, or what flag I can set on my C++ function objects to >>> keep them from being pruned out. >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> >