Sean Callanan
2012-Aug-18 01:46 UTC
[LLVMdev] GlobalVariable initializer using from beyond the grave
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>
Eli Friedman
2012-Aug-18 01:55 UTC
[LLVMdev] GlobalVariable initializer using from beyond the grave
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