[llvm] r195776 - DwarfDebug: Include type units in accelerator tables.

Eric Christopher echristo at gmail.com
Tue Nov 26 13:22:03 PST 2013


On Tue, Nov 26, 2013 at 1:09 PM, David Blaikie <dblaikie at gmail.com> wrote:
> On Tue, Nov 26, 2013 at 1:04 PM, Eric Christopher <echristo at gmail.com> wrote:
>> On Tue, Nov 26, 2013 at 11:14 AM, David Blaikie <dblaikie at gmail.com> wrote:
>>> Author: dblaikie
>>> Date: Tue Nov 26 13:14:34 2013
>>> New Revision: 195776
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=195776&view=rev
>>> Log:
>>> DwarfDebug: Include type units in accelerator tables.
>>
>> As a note it's probably a good idea to say "pubnames/pubtypes" rather
>> than "accelerator"
>
> Ah, right - yeah, mistake on my part after jumbling through these bits
> of the code.
>
>> here because we've got tables that are called
>> "accelerator" tables as well and it's actually impossible to have type
>> units that are separated out into distinct sections in those
>> accelerator tables right now since the use data4 offsets in debug_info
>> as locations. (This should really be DW_FORM_sec_offset, but.. ).
>
> How does that work during linking? Wouldn't the offsets change? (or
> are these accelerator tables only produced at link-time?)
>

The latter. There's some noise on the committee that they'd like
linking of tables to work, but it's not going to happen.

-eric

>> This is why I'm proposing bringing the type units back into the
>> debug_info section at any rate.
>>
>> All of this a random aside, but it's interesting information I think.
>
> Yep
>
>>
>> -eric
>>
>>>
>>> Since type units aren't in the CUMap, use the DwarfUnits list to iterate
>>> over units for tasks such as accelerator table building.
>>>
>>> Modified:
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>>     llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=195776&r1=195775&r2=195776&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Nov 26 13:14:34 2013
>>> @@ -1063,10 +1063,10 @@ void DwarfDebug::finalizeModuleInfo() {
>>>    computeInlinedDIEs();
>>>
>>>    // Handle anything that needs to be done on a per-cu basis.
>>> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
>>> -                                                         CUE = CUMap.end();
>>> -       CUI != CUE; ++CUI) {
>>> -    CompileUnit *TheCU = CUI->second;
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>> +       I != E; ++I) {
>>> +    CompileUnit *TheCU = *I;
>>>      // Emit DW_AT_containing_type attribute to connect types with their
>>>      // vtable holding type.
>>>      TheCU->constructContainingTypeDIEs();
>>> @@ -1953,7 +1953,8 @@ void DwarfUnits::computeSizeAndOffsets()
>>>
>>>    // Iterate over each compile unit and set the size and offsets for each
>>>    // DIE within each compile unit. All offsets are CU relative.
>>> -  for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = CUs.begin(),
>>> +                                                      E = CUs.end();
>>>         I != E; ++I) {
>>>      (*I)->setDebugInfoOffset(SecOffset);
>>>
>>> @@ -2227,10 +2228,10 @@ void DwarfDebug::emitEndOfLineMatrix(uns
>>>  void DwarfDebug::emitAccelNames() {
>>>    DwarfAccelTable AT(
>>>        DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
>>> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
>>> -                                                         E = CUMap.end();
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>>         I != E; ++I) {
>>> -    CompileUnit *TheCU = I->second;
>>> +    CompileUnit *TheCU = *I;
>>>      const StringMap<std::vector<const DIE *> > &Names = TheCU->getAccelNames();
>>>      for (StringMap<std::vector<const DIE *> >::const_iterator
>>>               GI = Names.begin(),
>>> @@ -2260,10 +2261,10 @@ void DwarfDebug::emitAccelNames() {
>>>  void DwarfDebug::emitAccelObjC() {
>>>    DwarfAccelTable AT(
>>>        DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
>>> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
>>> -                                                         E = CUMap.end();
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>>         I != E; ++I) {
>>> -    CompileUnit *TheCU = I->second;
>>> +    CompileUnit *TheCU = *I;
>>>      const StringMap<std::vector<const DIE *> > &Names = TheCU->getAccelObjC();
>>>      for (StringMap<std::vector<const DIE *> >::const_iterator
>>>               GI = Names.begin(),
>>> @@ -2292,10 +2293,10 @@ void DwarfDebug::emitAccelObjC() {
>>>  void DwarfDebug::emitAccelNamespaces() {
>>>    DwarfAccelTable AT(
>>>        DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
>>> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
>>> -                                                         E = CUMap.end();
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>>         I != E; ++I) {
>>> -    CompileUnit *TheCU = I->second;
>>> +    CompileUnit *TheCU = *I;
>>>      const StringMap<std::vector<const DIE *> > &Names =
>>>          TheCU->getAccelNamespace();
>>>      for (StringMap<std::vector<const DIE *> >::const_iterator
>>> @@ -2331,10 +2332,10 @@ void DwarfDebug::emitAccelTypes() {
>>>    Atoms.push_back(
>>>        DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1));
>>>    DwarfAccelTable AT(Atoms);
>>> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
>>> -                                                         E = CUMap.end();
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>>         I != E; ++I) {
>>> -    CompileUnit *TheCU = I->second;
>>> +    CompileUnit *TheCU = *I;
>>>      const StringMap<std::vector<std::pair<const DIE *, unsigned> > > &Names =
>>>          TheCU->getAccelTypes();
>>>      for (StringMap<
>>> @@ -2428,9 +2429,10 @@ void DwarfDebug::emitDebugPubNames(bool
>>>        GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
>>>                 : Asm->getObjFileLowering().getDwarfPubNamesSection();
>>>
>>> -  typedef DenseMap<const MDNode *, CompileUnit *> CUMapType;
>>> -  for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
>>> -    CompileUnit *TheCU = I->second;
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>> +       I != E; ++I) {
>>> +    CompileUnit *TheCU = *I;
>>>      unsigned ID = TheCU->getUniqueID();
>>>
>>>      // Start the dwarf pubnames section.
>>> @@ -2496,10 +2498,10 @@ void DwarfDebug::emitDebugPubTypes(bool
>>>        GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
>>>                 : Asm->getObjFileLowering().getDwarfPubTypesSection();
>>>
>>> -  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
>>> -                                                         E = CUMap.end();
>>> +  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
>>> +                                                      E = getUnits().end();
>>>         I != E; ++I) {
>>> -    CompileUnit *TheCU = I->second;
>>> +    CompileUnit *TheCU = *I;
>>>      // Start the dwarf pubtypes section.
>>>      Asm->OutStreamer.SwitchSection(PSec);
>>>
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=195776&r1=195775&r2=195776&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Nov 26 13:14:34 2013
>>> @@ -258,6 +258,8 @@ public:
>>>
>>>    ~DwarfUnits();
>>>
>>> +  const SmallVectorImpl<CompileUnit *> &getUnits() { return CUs; }
>>> +
>>>    /// \brief Compute the size and offset of a DIE given an incoming Offset.
>>>    unsigned computeSizeAndOffset(DIE *Die, unsigned Offset);
>>>
>>> @@ -479,10 +481,12 @@ class DwarfDebug {
>>>    // Holder for the skeleton information.
>>>    DwarfUnits SkeletonHolder;
>>>
>>> -private:
>>> -
>>>    void addScopeVariable(LexicalScope *LS, DbgVariable *Var);
>>>
>>> +  const SmallVectorImpl<CompileUnit *> &getUnits() {
>>> +    return InfoHolder.getUnits();
>>> +  }
>>> +
>>>    /// \brief Find abstract variable associated with Var.
>>>    DbgVariable *findAbstractVariable(DIVariable &Var, DebugLoc Loc);
>>>
>>>
>>> Modified: llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll?rev=195776&r1=195775&r2=195776&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll (original)
>>> +++ llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll Tue Nov 26 13:14:34 2013
>>> @@ -91,11 +91,29 @@
>>>  ; CHECK: DW_TAG_structure_type
>>>  ; CHECK-NEXT: debug_str{{.*}}"wombat"
>>>
>>> -; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
>>> +; Use the unit size as a rough hash/identifier for the unit we're dealing with
>>> +; it happens to be unambiguous at the moment, but it's hardly ideal.
>>>  ; CHECK-LABEL: .debug_pubtypes contents:
>>> -; CHECK-NEXT: unit_offset = 0x00000000
>>> -; CHECK-NEXT: Offset
>>> -; CHECK-NEXT: {{^$}}
>>> +; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
>>> +; CHECK-NEXT: unit_size = 0x00000174
>>> +; CHECK-NEXT: Offset Name
>>> +; Type unit for 'bar'
>>> +; CHECK-NEXT: unit_size = 0x0000001f
>>> +; CHECK-NEXT: Offset Name
>>> +; CHECK-NEXT: "bar"
>>> +; CHECK-NEXT: unit_size = 0x00000059
>>> +; CHECK-NEXT: Offset Name
>>> +; CHECK-NEXT: "int"
>>> +; CHECK-NEXT: "echidna::capybara::mongoose::fluffy"
>>> +; CHECK-NEXT: unit_size = 0x0000002f
>>> +; CHECK-NEXT: Offset Name
>>> +; CHECK-NEXT: "walrus"
>>> +; CHECK-NEXT: unit_size = 0x0000003f
>>> +; CHECK-NEXT: Offset Name
>>> +; CHECK-NEXT: "int"
>>> +; CHECK-NEXT: unit_size = 0x00000036
>>> +; CHECK-NEXT: Offset Name
>>> +; CHECK-NEXT: "wombat"
>>>
>>>  %struct.bar = type { i8 }
>>>  %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list