[PATCH] D26769: [IR] Remove the DIExpression field from DIGlobalVariable.
Adrian Prantl via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 9 14:13:24 PST 2016
> On Dec 9, 2016, at 2:08 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Fri, Dec 9, 2016 at 2:01 PM Adrian Prantl via Phabricator <reviews at reviews.llvm.org> wrote:
> aprantl marked 8 inline comments as done.
> aprantl added inline comments.
>
>
> ================
> Comment at: include/llvm/IR/GlobalVariable.h:177
> + using DIGlobalVarExpr =
> + PointerUnion<DIGlobalVariable *, DIGlobalVariableExpression *>;
> + /// Attach a DIGlobalVariable or DIGlobalVariableExpression.
> ----------------
> dblaikie wrote:
> > Is this union for backwards compatibility? (so things can still refer directly to a DIGlobalVariable?) If so, might be nice to push that compatibility earlier - map old debug info by creating new DIGlobalVariableExpressions, rather than letting the old semantics remain further through the system.
> The union (the canonical definition is in DebugInfoMetadata.h exists so we don't need to waste a DIGlobalVariableExpression node on global variables that don't need an DIExpression. This is an optimization that Duncan suggested (though I can't find where at the moment).
>
> I assume the plan is to treat global variables the same way we treat functions - drop them if we no longer have a definition. (potentially keep a list of any that get collapsed to a constant/no asociation from an llvm::GlobalValue - but, say, if we did LTO and just optimized away a global variable because it was unused, we'd drop it the same as we drop functions). So it seems strange to me to optimize that case that I think we don't seem to be/intend to care about/have happen much/at all?
Maybe we are talking about different things. The PointerUnion allows us to describe a global variable that doesn't need a DIExpression like so:
@g = global i32 0, !dbg !0
!0 = DIGlobalVariable(name: "g", ...)
without it, we'd have to describe it like so:
@g = global i32 0, !dbg !0
!0 = DIGlobalVariableExpression(var: !1, expr: null)
!1 = DIGlobalVariable(name: "g", ...)
And I think this decision is unaffected by how we handle global variables in optimizations. Let me know if I'm missing the point.
-- adrian
>
>
>
> ================
> Comment at: lib/CodeGen/AsmPrinter/CodeViewDebug.cpp:2209
> }
> + // FIXME: emitDebugInfoForGlobal() doesn't handle DIExpressions.
> emitDebugInfoForGlobal(G, GV, Asm->getSymbol(GV));
> ----------------
> dblaikie wrote:
> > Not quite sure what this means/what the implications are?
> It's just something I noticed while updating the code. Could be a separate commit.
>
> Might be good - just to discuss.
>
> ================
> Comment at: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp:191
> + if (Loc) {
> + DwarfExpr->finalize();
> addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);
> ----------------
> dblaikie wrote:
> > Should finalize return the DIELoc instead of having it kept as a separate/parallel variable that DIEDwarfExpression is updating?
> Not sure I understand. You mean like
> ```
> class DIEDwarfExpression {
> ...
> DIELoc finalize() {
> DwarfExpression::finalize();
> return DIE;
> }
> }
>
> ...
> addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr.finalize());
>
> Yep, something like that. (presumably a DILoc*, but yeah - that idea)
More information about the llvm-commits
mailing list