[PATCH] This phabricator revision is the merge of 4 patches that aim to provide resolving of AT_abstract_origin and AT_specification attributes.

Alexey Samsonov vonosmas at gmail.com
Fri Sep 5 14:17:40 PDT 2014


================
Comment at: lib/DebugInfo/DWARFDebugInfoEntry.cpp:319
@@ +318,3 @@
+      Offset >= U->getNextUnitOffset()) {
+    U = U->getContext().getCompileUnitForOffset(Offset);
+    assert(U && "Invalid DIE referenced.");
----------------
dblaikie wrote:
> samsonov wrote:
> > dblaikie wrote:
> > > Is "getCompileUnitForOffset" cheap enough that we should just always call it? (& maybe pass in the context to this function, rather than the DWARFUnit, at that point)
> > This part makes no sense to me. We definitely should somehow ensure that "this" is in a fact a DIE in "U". When you call DWARFDebugInfoEntry::getSubroutineName(), you certainly should know which unit this DIE belongs to. How can it be not so?
> LLVM under LTO will generate DIE references across the CUs (in an effort to reduce debug info size - eg: rather than putting a type (even a declaration) in multiple CUs, one CU just references directly into the other CU to reference the type defined there) - so you actually don't know.
OK, makes sense. But you still are supposed to know which Unit a given DIE belongs to. You can't even extract it otherwise: DWARFDebugInfoEntry::extractFast() takes a pointer to Unit as an input parameter. So, in case of cross-CU references, and, for instance, getSubroutineName you should do the following:
  1) assume "this" is a DIE contained in "U".
  2) if DIE has name attribute, return it
  3) try to fetch name from specification:
    a) read DW_AT_specification reference SpecRef
    b) calculate SpecU this SpecRef corresponds to
    c) call SpecDIE.extractFast(SpecU, &SpecRef)
    d) call SpecDIE.getSubroutineName(SpecU)

http://reviews.llvm.org/D5208






More information about the llvm-commits mailing list