[LLVMdev] GlobalVariable initializer using from beyond the grave

Sean Callanan scallanan at apple.com
Fri Aug 17 18:46:19 PDT 2012


For LLDB I'm writing a dumb module pass that removes all global variables, by running the following code:

    bool erased = true;
    
    while (erased)
    {
        erased = false;
        
        for (Module::global_iterator gi = llvm_module.global_begin(), ge = llvm_module.global_end();
             gi != ge;
             ++gi)
        {
            GlobalVariable *global_var = dyn_cast<GlobalVariable>(gi);
        
            if (global_var->use_empty())
            {
                log->Printf("Did remove %s",
                            PrintValue(global_var).c_str());
                global_var->eraseFromParent();
                erased = true;
                break;
            }
        }
    }

It's not super efficient and it falls over in the face of cycles, but that's not what I'm running into.  Rather, Constants inside the initializers for global variables that I successfully removed are still showing up as uses for global variables that I haven't yet removed.  E.g., I couldn't erase:

  @"\01L_OBJC_SELECTOR_REFERENCES_" = internal global i8* getelementptr inbounds ([20 x i8]* inttoptr (i64 4295929920 to [20 x i8]*), i32 0, i32 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"

because the initializer for

  @llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([20 x i8]* inttoptr (i64 4295929920 to [20 x i8]*), i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_" to i8*)]

which I had previously erased, was still claimed as a use.

Is there some way I need to purge the GlobalVariable beyond just calling eraseFromParent()?  Do I need to rebuild the use graph or something?

Sean
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120817/d370a32b/attachment.html>


More information about the llvm-dev mailing list