[LLVMdev] Question about abstract subprograms in debug info

Manman Ren mren at apple.com
Mon Mar 11 11:12:07 PDT 2013


On Mar 8, 2013, at 5:49 PM, Manman Ren <mren at apple.com> wrote:

> 
> Hi,
> 
> I am working on an issue where a subprogram created here is having abstract_origin pointing to nowhere.
> DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
>                                          const MDNode *SPNode) {
>  DIE *SPDie = SPCU->getDIE(SPNode);
> 
>  assert(SPDie && "Unable to find subprogram DIE!");
>  DISubprogram SP(SPNode);
> 
>  // If we're updating an abstract DIE, then we will be adding the children and
>  // object pointer later on. But what we don't want to do is process the
>  // concrete DIE twice.
>  if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
>    // Pick up abstract subprogram DIE.
>    SPDie = new DIE(dwarf::DW_TAG_subprogram);
>    SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
>                      dwarf::DW_FORM_ref4, AbsSPDIE);
>    SPCU->addDie(SPDie);
>  }
>> }
> 
> The compile unit DIE where AbsSPDIE belongs to is different from the compile unit DIE SPCU->getCUDie().
> So it is not legal to use a FORM_ref4 here.
> 
> Why do we create these subprogram DIEs here? They are added to SPCU, but not inserted via insertDIE, so they are not in the MDNodeToDieMap of the CU.
> 
> Another question is how to fix this if we need to create these subprograms.
> Should we use FORM_ref_addr here? FORM_ref_addr is not supported yet, I am wondering whether that will break any debugger.
Sorry, FORM_ref_addr is already there under lib/DebugInfo/, it is just not used in lib/CodeGen/.
I am checking whether using it instead of FORM_ref_4 will work.

Thanks,
Manman
> Another fix seems to be copying the attributes of the origin instead of using abstract_origin.
> 
> Thanks,
> Manman





More information about the llvm-dev mailing list