[LLVMdev] opt -O2/-O3 does not Initialize pass?
Anthony Danalis
adanalis at eecs.utk.edu
Wed Mar 11 12:03:35 PDT 2009
Hello,
I'm writing a pass that adds a function prototype to the module during
doInitialization() and stores the pointer in a global variable. If I
run opt with "-O1" or less, everything works fine. However, If I call
opt with "-O2" or "-O3" then as soon as runOnFunction() is called, the
pointer seems to be NULL. Here is a code that shows the problem:
namespace {
struct InitTest : public FunctionPass {
Constant *someF;
public:
static char ID; // Pass identification, replacement for typeid
InitTest() : FunctionPass(&ID) {}
virtual bool doInitialization(Module &mdl) {
someF = mdl.getOrInsertFunction("test",
/* return type */ Type::VoidTy,
/* actual 1 type */ IntegerType::get(32),
NULL);
if( !someF ){
cerr << "### Error: someF is NULL ###" << std::endl;
}
return true;
}
virtual bool runOnFunction(Function &func) {
if( !someF ){
cerr << "--- Error: someF is NULL ---" << std::endl;
}
return false;
}
};
}
char InitTest::ID = 0;
static RegisterPass<InitTest> IT("inittest", "Initialization Testing
Pass");
and here is the output of some runs:
$ opt -load Test.so -inittest < test.bc > /dev/null
--- Success ---
$ opt -O1 -load Test.so -inittest < test.bc > /dev/null
--- Success ---
$ opt -O2 -load Test.so -inittest < test.bc > /dev/null
--- Error: someF is NULL ---
$ opt -O3 -load Test.so -inittest < test.bc > /dev/null
--- Error: someF is NULL ---
Is this normal? What can I do to preserve my "test" function prototype?
thanks,
Anthony
More information about the llvm-dev
mailing list