[LLVMdev] Another Pass Manager Assertion
Devang Patel
dpatel at apple.com
Tue Dec 18 14:01:05 PST 2007
On Dec 18, 2007, at 10:55 AM, John Criswell wrote:
> Dear All,
>
> The attached code (which is a contrived test case) hits the following
> assertion:
>
> test:
> /home/vadve/criswell/src/llvm22/include/llvm/PassAnalysisSupport.h:
> 226:
> AnalysisType& llvm::Pass::getAnalysisID(const llvm::PassInfo*,
> llvm::Function&) [with AnalysisType = Pass1]: Assertion `ResultPass &&
> "getAnalysis*() called on an analysis that was not " "'required' by
> pass!"' failed.
> Abort
>
> Does anyone see anything wrong with my use of the pass manager
> interface? As far as I can tell, the code looks correct.
Your pass manager interface is OK.
You are requesting PassManager to make a Function level analysis pass
(Pass1) available to Module level transformation pass (BottomPass).
In real life you could use it to request Dominator information for a
module level pass. This is supported and it works. The reason it fails
for your test case is that the function "main" is just a declaration.
There is no analysis info to generate.
If you add a "main" function body in your module then it should work.
Or you should check whether F.isDeclaration() is true or not before
invoking getAnalysis<Pass1>(F);
I agree, the assertion message is not very helpful here.
-
Devang
> -- John T.
>
> #include "llvm/Pass.h"
> #include "llvm/Module.h"
> #include "llvm/PassManager.h"
> #include "llvm/Type.h"
>
> using namespace llvm;
>
> struct Pass1 : public FunctionPass {
> public :
> static char ID;
> Pass1 () : FunctionPass ((intptr_t) &ID) {}
> const char *getPassName() const { return "Pass 1"; }
> virtual bool runOnFunction(Function &F) {
> return false;
> }
> virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> return;
> }
> };
>
> struct BottomPass : public ModulePass {
> public :
> static char ID;
> BottomPass () : ModulePass ((intptr_t) &ID) {
> }
> const char *getPassName() const { return "Bottom Pass"; }
> virtual bool runOnModule(Module &M) {
> for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
> Function &F = *I;
> Pass1 &P = getAnalysis<Pass1>(F);
> }
> return false;
> }
> virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> AU.addRequired<Pass1>();
> }
> };
>
> int main(int argc, char **argv) {
> Module M("testmodule");
> M.getOrInsertFunction ("main", Type::VoidTy, NULL);
> PassManager Passes;
> Passes.add(new BottomPass());
> Passes.run(M);
> return 1;
> }
>
> char Pass1::ID = 0;
> char BottomPass::ID = 0;
>
> RegisterPass<Pass1> R1("p1","Pass 1");
> RegisterPass<BottomPass> R3("b","Bottom Pass");
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-
Devang
More information about the llvm-dev
mailing list