[LLVMdev] GlobalVariable initializer using from beyond the grave

Eli Friedman eli.friedman at gmail.com
Fri Aug 17 18:55:40 PDT 2012


On Fri, Aug 17, 2012 at 6:46 PM, Sean Callanan <scallanan at apple.com> wrote:
> 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?

You're looking for Constant::removeDeadConstantUsers()

-Eli



More information about the llvm-dev mailing list