[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