<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">For LLDB I'm writing a dumb module pass that removes all global variables, by running the following code:<div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">    <span style="color: #bb2ca2">bool</span> erased = <span style="color: #bb2ca2">true</span>;</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px; ">    <br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">    <span style="color: #bb2ca2">while</span> (erased)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">    {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">        erased = <span style="color: #bb2ca2">false</span>;</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px; ">        <br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">        <span style="color: #bb2ca2">for</span> (<span style="color: #4f8187">Module</span>::<span style="color: #4f8187">global_iterator</span> gi = llvm_module.<span style="color: #31595d">global_begin</span>(), ge = llvm_module.<span style="color: #31595d">global_end</span>();</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">             gi != ge;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">             ++gi)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">        {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">            <span style="color: #4f8187">GlobalVariable</span> *global_var = <span style="color: #31595d">dyn_cast</span><<span style="color: #4f8187">GlobalVariable</span>>(gi);</div><p style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px; ">        <br class="webkit-block-placeholder"></p><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">            <span style="color: #bb2ca2">if</span> (global_var-><span style="color: #31595d">use_empty</span>())</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">            {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">                log-><span style="color: #31595d">Printf</span>(<span style="color: #d12f1b">"Did remove %s"</span>,</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">                            <span style="color: #31595d">PrintValue</span>(global_var).<span style="color: #3d1d81">c_str</span>());</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">                global_var-><span style="color: #31595d">eraseFromParent</span>();</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">                erased = <span style="color: #bb2ca2">true</span>;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">                <span style="color: #bb2ca2">break</span>;</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">            }</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">        }</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; ">    }</div></div><div><br></div><div>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:</div><div><br></div><div>  @"\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"</div><div><br></div><div><div>because the initializer for</div><div><br></div><div>  @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*)]</div></div><div><br></div><div>which I had previously erased, was still claimed as a use.</div><div><br></div><div>Is there some way I need to purge the GlobalVariable beyond just calling eraseFromParent()?  Do I need to rebuild the use graph or something?</div><div><br></div><div>Sean</div></body></html>