[llvm] r274986 - [COFF, Dwarf] Don't emit DW_AT_location for dllimported entities
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 10 21:36:41 PDT 2016
On Sun, Jul 10, 2016 at 3:55 PM, Robinson, Paul <paul.robinson at sony.com>
wrote:
> 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
>
Thanks, should be addressed in r275040.
>
> > -----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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160710/f36733cd/attachment.html>
More information about the llvm-commits
mailing list