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

Anton Korobeynikov via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 13 17:01:00 PDT 2016


Right, but definition vs declaration should be done on the emitter (=
clang) side.

On Thu, Jul 14, 2016 at 2:53 AM, David Blaikie <dblaikie at gmail.com> wrote:
> I think that's a bit different - I Think it might be reasonable to emit that
> as a definiton without a location, since we have no way to describe the
> location but there really is a definition there.
>
> Whereas a dllimport isn't really a definition at all - there's a definition
> on the dllexport side, which we should be describing.
>
> On Wed, Jul 13, 2016 at 4:51 PM Anton Korobeynikov via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> It seems we have to deal with TLS symbols in pretty similar way.
>>
>> Sometimes there is no relocation which could describe the location.
>> The recent example is AArch64, see
>> https://llvm.org/bugs/show_bug.cgi?id=21077 for more information.
>>
>> Good thing is that we're having TLOF::getDebugThreadLocalSymbol()
>> hook, which can be made to return nullptr in default case and we would
>> handle it here the same way as dllimport stuff.
>>
>> On Sat, Jul 9, 2016 at 11:47 PM, David Majnemer via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>> > 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=274985&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
>>
>>
>>
>> --
>> With best regards, Anton Korobeynikov
>> Department of Statistical Modelling, Saint Petersburg State University
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



-- 
With best regards, Anton Korobeynikov
Department of Statistical Modelling, Saint Petersburg State University


More information about the llvm-commits mailing list