[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