[llvm] r274986 - [COFF, Dwarf] Don't emit DW_AT_location for dllimported entities

Robinson, Paul via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 10 15:55:07 PDT 2016


This leaves the DWARF in a disconcerting state: the entity
appears to be a definition, but has no location, which normally
means the entity has been optimized away.  That's obviously not
the case.

Better to mark the entity as a declaration in this case, so that
the consumer isn't expecting to be able to locate it.
--paulr

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


More information about the llvm-commits mailing list