<div dir="ltr"><div><div><div><div><div>Hi,<br><br></div>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:<br><br>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.<br>0  opt             0x000000000125b11d llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 45<br>1  opt             0x000000000125c5fb<br>2  libpthread.so.0 0x000000374620f500<br>3  libc.so.6       0x0000003745a328e5 gsignal + 53<br>4  libc.so.6       0x0000003745a340c5 abort + 373<br>5  libc.so.6       0x0000003745a2ba0e<br>6  libc.so.6       0x0000003745a2bad0 __assert_perror_fail + 0<br>7  opt             0x0000000000e6d619 llvm::CallGraphSCCPass::assignPassManager(llvm::PMStack&, llvm::PassManagerType) + 489<br>8  opt             0x00000000011b9cdc llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 2268<br>9  opt             0x00000000011c1ef3<br>10 opt             0x00000000011bcfda llvm::PMDataManager::add(llvm::Pass*, bool) + 906<br>11 opt             0x00000000011b9cdc llvm::PMTopLevelManager::schedulePass(llvm::Pass*) + 2268<br>12 opt             0x0000000000533a8c main + 6380<br>13 libc.so.6       0x0000003745a1ecdd __libc_start_main + 253<br>14 opt             0x0000000000526799<br>Stack dump:<br>0.    Program arguments: opt -load Debug.so file.ll -S -user <br>Aborted (core dumped)<br><br></div>If I change my default pass to extend ModulePass, everything runs fine.<br><br></div>My test case is below. Is this a bug? Have I missed something? Is this unsupported?<br><br></div>Thanks,<br></div>Matt<br><br><br>// PassX.h<br><br>#ifndef PASSX_H<br>#define PASSX_H<br><br>class PassX {<br>public:<br>  static char ID;<br><br>  PassX() {}<br>  virtual ~PassX(){};<br><br>  virtual bool get(void) const = 0;<br>};<br><br>#endif // PASSX_H<br><br><br>// PassXImpl.cpp<br>#include <string><br>#include "llvm/Analysis/CallGraphSCCPass.h"<br>#include "PassX.h"<br>using namespace llvm;<br><br>namespace {<br>struct PassXImpl : public CallGraphSCCPass, public PassX {<br>  static char ID;<br>  PassXImpl() : CallGraphSCCPass(ID) {}<br>  ~PassXImpl() {}<br><br>  virtual void *getAdjustedAnalysisPointer(AnalysisID PI) {<br>    if (PI == &PassX::ID)<br>      return (PassX *)this;<br>    return this;<br>  }<br><br>  virtual void getAnalysisUsage(AnalysisUsage &AU) const {<br>    CallGraphSCCPass::getAnalysisUsage(AU);<br>  }<br><br>  virtual bool runOnSCC(CallGraphSCC &) { return false; }<br><br>  virtual bool get(void) const { return true; }<br>};<br>}<br><br>char PassX::ID = 0;<br>static RegisterAnalysisGroup<PassX> G("PassX");<br><br>char PassXImpl::ID = 0;<br>static RegisterPass<PassXImpl> P("passx", "Default PassX");<br><br>RegisterAnalysisGroup<PassX, true> Default(P);<br><br><br>// User.cpp<br><br>#include <string><br>#include "llvm/Pass.h"<br>#include "PassX.h"<br>using namespace llvm;<br><br>namespace {<br>struct User : public ModulePass {<br>  static char ID;<br>  User() : ModulePass(ID) {}<br>  ~User() {}<br><br>  virtual void getAnalysisUsage(AnalysisUsage &AU) const {<br>    ModulePass::getAnalysisUsage(AU);<br>    AU.addRequired<PassX>();<br>  }<br><br>  virtual bool runOnModule(Module &) {<br>    PassX &P = getAnalysis<PassX>();<br>    return P.get();<br>  }<br>};<br>}<br><br>char User::ID = 0;<br>static RegisterPass<User> P("user", "Default User");<br><br><div><div><div><div><div><div><div><br></div></div></div></div></div></div></div></div>