<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jul 10, 2016 at 3:55 PM, Robinson, Paul <span dir="ltr"><<a href="mailto:paul.robinson@sony.com" target="_blank">paul.robinson@sony.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">This leaves the DWARF in a disconcerting state: the entity<br>
appears to be a definition, but has no location, which normally<br>
means the entity has been optimized away.  That's obviously not<br>
the case.<br>
<br>
Better to mark the entity as a declaration in this case, so that<br>
the consumer isn't expecting to be able to locate it.<br>
--paulr<br></blockquote><div><br></div><div>Thanks, should be addressed in r275040.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<div class=""><div class="h5"><br>
> -----Original Message-----<br>
> From: llvm-commits [mailto:<a href="mailto:llvm-commits-bounces@lists.llvm.org">llvm-commits-bounces@lists.llvm.org</a>] On Behalf<br>
> Of David Majnemer via llvm-commits<br>
> Sent: Saturday, July 09, 2016 1:48 PM<br>
> To: <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> Subject: [llvm] r274986 - [COFF, Dwarf] Don't emit DW_AT_location for<br>
> dllimported entities<br>
><br>
> Author: majnemer<br>
> Date: Sat Jul  9 15:47:48 2016<br>
> New Revision: 274986<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=274986&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=274986&view=rev</a><br>
> Log:<br>
> [COFF, Dwarf] Don't emit DW_AT_location for dllimported entities<br>
><br>
> There exists no relocation which can describe the address of a<br>
> dllimported variable: do not try to describe their location.<br>
><br>
> Added:<br>
>     llvm/trunk/test/DebugInfo/X86/dllimport.ll<br>
> Modified:<br>
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp<br>
><br>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=274986&<br>
> r1=274985&r2=274986&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Sat Jul  9<br>
> 15:47:48 2016<br>
> @@ -148,62 +148,69 @@ DIE *DwarfCompileUnit::getOrCreateGlobal<br>
>    // Add location.<br>
>    bool addToAccelTable = false;<br>
>    if (auto *Global = dyn_cast_or_null<GlobalVariable>(GV->getVariable()))<br>
> {<br>
> -    addToAccelTable = true;<br>
> -    DIELoc *Loc = new (DIEValueAllocator) DIELoc;<br>
> -    const MCSymbol *Sym = Asm->getSymbol(Global);<br>
> -    if (Global->isThreadLocal()) {<br>
> -      if (Asm->TM.Options.EmulatedTLS) {<br>
> -        // TODO: add debug info for emulated thread local mode.<br>
> -      } else {<br>
> -        // FIXME: Make this work with -gsplit-dwarf.<br>
> -        unsigned PointerSize = Asm->getDataLayout().getPointerSize();<br>
> -        assert((PointerSize == 4 || PointerSize == 8) &&<br>
> -               "Add support for other sizes if necessary");<br>
> -        // Based on GCC's support for TLS:<br>
> -        if (!DD->useSplitDwarf()) {<br>
> -          // 1) Start with a constNu of the appropriate pointer size<br>
> -          addUInt(*Loc, dwarf::DW_FORM_data1, PointerSize == 4<br>
> -                                                  ? dwarf::DW_OP_const4u<br>
> -                                                  :<br>
> dwarf::DW_OP_const8u);<br>
> -          // 2) containing the (relocated) offset of the TLS variable<br>
> -          //    within the module's TLS block.<br>
> -          addExpr(*Loc, dwarf::DW_FORM_udata,<br>
> -                  Asm-<br>
> >getObjFileLowering().getDebugThreadLocalSymbol(Sym));<br>
> +    // We cannot describe the location of dllimport'd variables: the<br>
> computation<br>
> +    // of their address requires loads from the IAT.<br>
> +    if (!Global->hasDLLImportStorageClass()) {<br>
> +      addToAccelTable = true;<br>
> +      DIELoc *Loc = new (DIEValueAllocator) DIELoc;<br>
> +      const MCSymbol *Sym = Asm->getSymbol(Global);<br>
> +      if (Global->isThreadLocal()) {<br>
> +        if (Asm->TM.Options.EmulatedTLS) {<br>
> +          // TODO: add debug info for emulated thread local mode.<br>
>          } else {<br>
> -          addUInt(*Loc, dwarf::DW_FORM_data1,<br>
> dwarf::DW_OP_GNU_const_index);<br>
> -          addUInt(*Loc, dwarf::DW_FORM_udata,<br>
> -                  DD->getAddressPool().getIndex(Sym, /* TLS */ true));<br>
> +          // FIXME: Make this work with -gsplit-dwarf.<br>
> +          unsigned PointerSize = Asm->getDataLayout().getPointerSize();<br>
> +          assert((PointerSize == 4 || PointerSize == 8) &&<br>
> +                 "Add support for other sizes if necessary");<br>
> +          // Based on GCC's support for TLS:<br>
> +          if (!DD->useSplitDwarf()) {<br>
> +            // 1) Start with a constNu of the appropriate pointer size<br>
> +            addUInt(*Loc, dwarf::DW_FORM_data1, PointerSize == 4<br>
> +                                                    ?<br>
> dwarf::DW_OP_const4u<br>
> +                                                    :<br>
> dwarf::DW_OP_const8u);<br>
> +            // 2) containing the (relocated) offset of the TLS variable<br>
> +            //    within the module's TLS block.<br>
> +            addExpr(*Loc, dwarf::DW_FORM_udata,<br>
> +                    Asm-<br>
> >getObjFileLowering().getDebugThreadLocalSymbol(Sym));<br>
> +          } else {<br>
> +            addUInt(*Loc, dwarf::DW_FORM_data1,<br>
> dwarf::DW_OP_GNU_const_index);<br>
> +            addUInt(*Loc, dwarf::DW_FORM_udata,<br>
> +                    DD->getAddressPool().getIndex(Sym, /* TLS */ true));<br>
> +          }<br>
> +          // 3) followed by an OP to make the debugger do a TLS lookup.<br>
> +          addUInt(*Loc, dwarf::DW_FORM_data1,<br>
> +                  DD->useGNUTLSOpcode() ?<br>
> dwarf::DW_OP_GNU_push_tls_address<br>
> +                                        : dwarf::DW_OP_form_tls_address);<br>
>          }<br>
> -        // 3) followed by an OP to make the debugger do a TLS lookup.<br>
> -        addUInt(*Loc, dwarf::DW_FORM_data1,<br>
> -                DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address<br>
> -                                      : dwarf::DW_OP_form_tls_address);<br>
> +      } else {<br>
> +        DD->addArangeLabel(SymbolCU(this, Sym));<br>
> +        addOpAddress(*Loc, Sym);<br>
>        }<br>
> -    } else {<br>
> -      DD->addArangeLabel(SymbolCU(this, Sym));<br>
> -      addOpAddress(*Loc, Sym);<br>
> -    }<br>
><br>
> -    addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);<br>
> -    if (DD->useAllLinkageNames())<br>
> -      addLinkageName(*VariableDIE, GV->getLinkageName());<br>
> +      addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);<br>
> +      if (DD->useAllLinkageNames())<br>
> +        addLinkageName(*VariableDIE, GV->getLinkageName());<br>
> +    }<br>
>    } else if (const ConstantInt *CI =<br>
>                   dyn_cast_or_null<ConstantInt>(GV->getVariable())) {<br>
>      addConstantValue(*VariableDIE, CI, GTy);<br>
>    } else if (const ConstantExpr *CE = getMergedGlobalExpr(GV-<br>
> >getVariable())) {<br>
> -    addToAccelTable = true;<br>
> -    // GV is a merged global.<br>
> -    DIELoc *Loc = new (DIEValueAllocator) DIELoc;<br>
>      auto *Ptr = cast<GlobalValue>(CE->getOperand(0));<br>
> -    MCSymbol *Sym = Asm->getSymbol(Ptr);<br>
> -    DD->addArangeLabel(SymbolCU(this, Sym));<br>
> -    addOpAddress(*Loc, Sym);<br>
> -    addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);<br>
> -    SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());<br>
> -    addUInt(*Loc, dwarf::DW_FORM_udata,<br>
> -            Asm->getDataLayout().getIndexedOffsetInType(Ptr-<br>
> >getValueType(), Idx));<br>
> -    addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);<br>
> -    addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);<br>
> +    if (!Ptr->hasDLLImportStorageClass()) {<br>
> +      addToAccelTable = true;<br>
> +      // GV is a merged global.<br>
> +      DIELoc *Loc = new (DIEValueAllocator) DIELoc;<br>
> +      MCSymbol *Sym = Asm->getSymbol(Ptr);<br>
> +      DD->addArangeLabel(SymbolCU(this, Sym));<br>
> +      addOpAddress(*Loc, Sym);<br>
> +      addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);<br>
> +      SmallVector<Value *, 3> Idx(CE->op_begin() + 1, CE->op_end());<br>
> +      addUInt(*Loc, dwarf::DW_FORM_udata,<br>
> +              Asm->getDataLayout().getIndexedOffsetInType(Ptr-<br>
> >getValueType(),<br>
> +                                                          Idx));<br>
> +      addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);<br>
> +      addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);<br>
> +    }<br>
>    }<br>
><br>
>    if (addToAccelTable) {<br>
><br>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=274986&r1=2749<br>
> 85&r2=274986&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Sat Jul  9 15:47:48<br>
> 2016<br>
> @@ -1053,14 +1053,18 @@ void DwarfUnit::constructTemplateValuePa<br>
>      if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val))<br>
>        addConstantValue(ParamDIE, CI, resolve(VP->getType()));<br>
>      else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) {<br>
> -      // For declaration non-type template parameters (such as global<br>
> values and<br>
> -      // functions)<br>
> -      DIELoc *Loc = new (DIEValueAllocator) DIELoc;<br>
> -      addOpAddress(*Loc, Asm->getSymbol(GV));<br>
> -      // Emit DW_OP_stack_value to use the address as the immediate value<br>
> of the<br>
> -      // parameter, rather than a pointer to it.<br>
> -      addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);<br>
> -      addBlock(ParamDIE, dwarf::DW_AT_location, Loc);<br>
> +      // We cannot describe the location of dllimport'd entities: the<br>
> +      // computation of their address requires loads from the IAT.<br>
> +      if (!GV->hasDLLImportStorageClass()) {<br>
> +        // For declaration non-type template parameters (such as global<br>
> values<br>
> +        // and functions)<br>
> +        DIELoc *Loc = new (DIEValueAllocator) DIELoc;<br>
> +        addOpAddress(*Loc, Asm->getSymbol(GV));<br>
> +        // Emit DW_OP_stack_value to use the address as the immediate<br>
> value of<br>
> +        // the parameter, rather than a pointer to it.<br>
> +        addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value);<br>
> +        addBlock(ParamDIE, dwarf::DW_AT_location, Loc);<br>
> +      }<br>
>      } else if (VP->getTag() == dwarf::DW_TAG_GNU_template_template_param)<br>
> {<br>
>        assert(isa<MDString>(Val));<br>
>        addString(ParamDIE, dwarf::DW_AT_GNU_template_name,<br>
><br>
> Added: llvm/trunk/test/DebugInfo/X86/dllimport.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/llvm/trunk/test/DebugInfo/X86/dllimport.ll?rev=274986&view=auto<br>
> ==========================================================================<br>
> ====<br>
> --- llvm/trunk/test/DebugInfo/X86/dllimport.ll (added)<br>
> +++ llvm/trunk/test/DebugInfo/X86/dllimport.ll Sat Jul  9 15:47:48 2016<br>
> @@ -0,0 +1,27 @@<br>
> +; RUN: llc -mtriple=i686-pc-windows-msvc -O0 -filetype=obj < %s | llvm-<br>
> dwarfdump -debug-dump=info - | FileCheck %s<br>
> +<br>
> +; CHECK-NOT: DW_AT_location<br>
> +<br>
> +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"<br>
> +target triple = "i686-pc-windows-msvc"<br>
> +<br>
> +@"\01?id@?$numpunct@D@@0HA" = available_externally dllimport global i32<br>
> 0, align 4<br>
> +<br>
> +!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
> +!llvm.module.flags = !{!13, !14}<br>
> +<br>
> +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1,<br>
> producer: "clang version 3.9.0 (trunk 272628) (llvm/trunk 272566)",<br>
> isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2,<br>
> globals: !3)<br>
> +!1 = !DIFile(filename:<br>
> "/usr/local/google/home/majnemer/Downloads/<stdin>", directory:<br>
> "/usr/local/google/home/majnemer/llvm/src")<br>
> +!2 = !{}<br>
> +!3 = !{!4}<br>
> +!4 = distinct !DIGlobalVariable(name: "id", linkageName:<br>
> "\01?id@?$numpunct@D@@0HA", scope: !0, file: !5, line: 4, type: !6,<br>
> isLocal: false, isDefinition: true, variable: i32*<br>
> @"\01?id@?$numpunct@D@@0HA", declaration: !7)<br>
> +!5 = !DIFile(filename: "/usr/local/google/home/majnemer/Downloads/t.ii",<br>
> directory: "/usr/local/google/home/majnemer/llvm/src")<br>
> +!6 = !DIBasicType(name: "int", size: 32, align: 32, encoding:<br>
> DW_ATE_signed)<br>
> +!7 = !DIDerivedType(tag: DW_TAG_member, name: "id", scope: !8, file: !5,<br>
> line: 2, baseType: !6, flags: DIFlagStaticMember)<br>
> +!8 = distinct !DICompositeType(tag: DW_TAG_class_type, name:<br>
> "numpunct<char>", file: !5, line: 2, size: 8, align: 8, elements: !9,<br>
> templateParams: !10)<br>
> +!9 = !{!7}<br>
> +!10 = !{!11}<br>
> +!11 = !DITemplateTypeParameter(type: !12)<br>
> +!12 = !DIBasicType(name: "char", size: 8, align: 8, encoding:<br>
> DW_ATE_signed_char)<br>
> +!13 = !{i32 2, !"Dwarf Version", i32 3}<br>
> +!14 = !{i32 2, !"Debug Info Version", i32 3}<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div></div>