[llvm-dev] Analysis group?
Matthew O'Connor via llvm-dev
llvm-dev at lists.llvm.org
Fri Dec 4 10:24:11 PST 2015
Hi,
I am attempting to create a shared object with a few passes that get loaded
into opt via -load. I am creating an analysis group and attempting to set
the default. When I make the default pass extend CallGraphSCCPass, I get
the following assertion from opt:
opt: /llvm-3.7.0/lib/Analysis/IPA/CallGraphSCCPass.cpp:554: virtual void
llvm::CallGraphSCCPass::assignPassManager(llvm::PMStack &,
llvm::PassManagerType): Assertion `!PMS.empty() && "Unable to handle Call
Graph Pass"' failed.
0 opt 0x000000000125b11d
llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 45
1 opt 0x000000000125c5fb
2 libpthread.so.0 0x000000374620f500
3 libc.so.6 0x0000003745a328e5 gsignal + 53
4 libc.so.6 0x0000003745a340c5 abort + 373
5 libc.so.6 0x0000003745a2ba0e
6 libc.so.6 0x0000003745a2bad0 __assert_perror_fail + 0
7 opt 0x0000000000e6d619
llvm::CallGraphSCCPass::assignPassManager(llvm::PMStack&,
llvm::PassManagerType) + 489
8 opt 0x00000000011b9cdc
llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 2268
9 opt 0x00000000011c1ef3
10 opt 0x00000000011bcfda llvm::PMDataManager::add(llvm::Pass*,
bool) + 906
11 opt 0x00000000011b9cdc
llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 2268
12 opt 0x0000000000533a8c main + 6380
13 libc.so.6 0x0000003745a1ecdd __libc_start_main + 253
14 opt 0x0000000000526799
Stack dump:
0. Program arguments: opt -load Debug.so file.ll -S -user
Aborted (core dumped)
If I change my default pass to extend ModulePass, everything runs fine.
My test case is below. Is this a bug? Have I missed something? Is this
unsupported?
Thanks,
Matt
// PassX.h
#ifndef PASSX_H
#define PASSX_H
class PassX {
public:
static char ID;
PassX() {}
virtual ~PassX(){};
virtual bool get(void) const = 0;
};
#endif // PASSX_H
// PassXImpl.cpp
#include <string>
#include "llvm/Analysis/CallGraphSCCPass.h"
#include "PassX.h"
using namespace llvm;
namespace {
struct PassXImpl : public CallGraphSCCPass, public PassX {
static char ID;
PassXImpl() : CallGraphSCCPass(ID) {}
~PassXImpl() {}
virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {
if (PI == &PassX::ID)
return (PassX *)this;
return this;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
CallGraphSCCPass::getAnalysisUsage(AU);
}
virtual bool runOnSCC(CallGraphSCC &) { return false; }
virtual bool get(void) const { return true; }
};
}
char PassX::ID = 0;
static RegisterAnalysisGroup<PassX> G("PassX");
char PassXImpl::ID = 0;
static RegisterPass<PassXImpl> P("passx", "Default PassX");
RegisterAnalysisGroup<PassX, true> Default(P);
// User.cpp
#include <string>
#include "llvm/Pass.h"
#include "PassX.h"
using namespace llvm;
namespace {
struct User : public ModulePass {
static char ID;
User() : ModulePass(ID) {}
~User() {}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
ModulePass::getAnalysisUsage(AU);
AU.addRequired<PassX>();
}
virtual bool runOnModule(Module &) {
PassX &P = getAnalysis<PassX>();
return P.get();
}
};
}
char User::ID = 0;
static RegisterPass<User> P("user", "Default User");
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151204/792c3f6f/attachment-0001.html>
More information about the llvm-dev
mailing list