<div dir="ltr">I sent my best attempt in <a href="https://reviews.llvm.org/D26908">https://reviews.llvm.org/D26908</a>, would appreciate any advice there :-)</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 18, 2016 at 7:22 PM, Sam McCall <span dir="ltr"><<a href="mailto:sammccall@google.com" target="_blank">sammccall@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I'm seeing particular globals spuriously being reported as local variables: they're returned by SBFrame::GetVariables(true, true, false, true) because their scope is eValueTypeVariableLocal.<div><br></div><div>I've tracked down the problem but don't know DWARF well enough to determine the right fix. Anyone want to help me out?</div><div><br></div><div>--</div><div><br></div><div>I can reproduce with the following program:<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div>struct Obj{};</div></div><div><div>namespace N { extern Obj& o; }</div></div><div><div>using N::o;</div></div><div><div>int main(){}</div></div></blockquote><div><br></div><div>When building with clang -g, lldb gives</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">(lldb) frame v -g -s<br></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">LOCAL: (Obj &) N::o = <no location, value may have been optimized out></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">(lldb) target v -s</blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">LOCAL: (Obj &) N::o = <no location, value may have been optimized out><br></blockquote>It seems confused about whether it's local or global.<div><br></div><div>readelf --dump-debug has the following info for the variable:</div><div><div><2><31>: Abbrev Number: 3 (DW_TAG_variable)</div><div>    <32>   DW_AT_name        : (indirect string, offset: 0x51): o</div><div>    <36>   DW_AT_type        : <0x42></div><div>    <3a>   DW_AT_external    : 1</div><div>    <3a>   DW_AT_decl_file   : 1</div><div>    <3b>   DW_AT_decl_line   : 2</div><div>    <3c>   DW_AT_declaration : 1     </div><div>    <3c>   DW_AT_location    : 0 byte block:    ()</div><div>    <3d>   DW_AT_linkage_name: (indirect string, offset: 0x57): _ZN1N1oE</div></div><div>It seems that the zero-length location is a problem: SymbolFileDWARF.cpp thinks a variable without a valid location must be static or local.</div><div><br></div><div>FWIW, gdb on the clang-built binary shows N::o as an optimized-out global, which seems fine. gcc generates debug info that omits the DW_AT_location, which causes gdb to hide it completely I think.</div></div><div><br></div><div>Cheers, Sam</div></div>
</blockquote></div><br></div>