[llvm] r232342 - [dsymutil] Add support to generate .debug_pubnames and .debug_pubtypes
Eric Christopher
echristo at gmail.com
Tue Mar 24 18:11:39 PDT 2015
Can you comment on this a bit more now? Also, FWIW, gcc (and we're using
it) use a different kind of format that includes some useful information in
lookup tables that we might want to support outputting. Also, why have the
tool able to output pubnames/pubtypes at all. I don't think lldb is using
it?
-eric
On Sun, Mar 15, 2015 at 7:10 PM Frederic Riss <friss at apple.com> wrote:
> Author: friss
> Date: Sun Mar 15 21:05:10 2015
> New Revision: 232342
>
> URL: http://llvm.org/viewvc/llvm-project?rev=232342&view=rev
> Log:
> [dsymutil] Add support to generate .debug_pubnames and .debug_pubtypes
>
> The information gathering part of the patch stores a bit more information
> than what is strictly necessary for these 2 sections. The rest will
> become useful when we start emitting __apple_* type accelerator tables.
>
> Modified:
> llvm/trunk/test/tools/dsymutil/X86/basic-linking-x86.test
> llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test
> llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test
> llvm/trunk/tools/dsymutil/DwarfLinker.cpp
>
> Modified: llvm/trunk/test/tools/dsymutil/X86/basic-linking-x86.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> dsymutil/X86/basic-linking-x86.test?rev=232342&r1=232341&
> r2=232342&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/tools/dsymutil/X86/basic-linking-x86.test (original)
> +++ llvm/trunk/test/tools/dsymutil/X86/basic-linking-x86.test Sun Mar 15
> 21:05:10 2015
> @@ -186,4 +186,32 @@ CHECK-NEXT: 0x0000000100000f7b 20
> CHECK-NEXT: 0x0000000100000f84 20 0 1 0 0
> is_stmt end_sequence
> CHECK-NEXT: 0x0000000100000f90 11 0 1 0 0
> is_stmt
> CHECK-NEXT: 0x0000000100000f9b 12 0 1 0 0
> is_stmt prologue_end
> -CHECK-NEXT: 0x0000000100000fa9 12 0 1 0 0
> is_stmt end_sequence
> \ No newline at end of file
> +CHECK-NEXT: 0x0000000100000fa9 12 0 1 0 0
> is_stmt end_sequence
> +
> +CHECK: .debug_pubnames contents:
> +CHECK-NEXT: length = 0x00000017 version = 0x0002 unit_offset = 0x00000000
> unit_size = 0x00000081
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000026 "main"
> +CHECK-NEXT: length = 0x00000036 version = 0x0002 unit_offset = 0x00000081
> unit_size = 0x000000a5
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x0000002d "private_int"
> +CHECK-NEXT: 0x00000042 "baz"
> +CHECK-NEXT: 0x00000057 "foo"
> +CHECK-NEXT: 0x00000086 "inc"
> +CHECK-NEXT: length = 0x00000026 version = 0x0002 unit_offset = 0x00000126
> unit_size = 0x00000096
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000026 "val"
> +CHECK-NEXT: 0x00000048 "bar"
> +CHECK-NEXT: 0x00000077 "inc"
> +
> +CHECK: .debug_pubtypes contents:
> +CHECK-NEXT: length = 0x0000001f version = 0x0002 unit_offset = 0x00000000
> unit_size = 0x00000081
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000063 "int"
> +CHECK-NEXT: 0x00000079 "char"
> +CHECK-NEXT: length = 0x00000016 version = 0x0002 unit_offset = 0x00000081
> unit_size = 0x000000a5
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000026 "int"
> +CHECK-NEXT: length = 0x00000016 version = 0x0002 unit_offset = 0x00000126
> unit_size = 0x00000096
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000041 "int"
>
> Modified: llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-
> linking-x86.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> dsymutil/X86/basic-lto-dw4-linking-x86.test?rev=232342&
> r1=232341&r2=232342&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test
> (original)
> +++ llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test Sun
> Mar 15 21:05:10 2015
> @@ -179,3 +179,25 @@ CHECK-NEXT: 0x0000000100000fa9 19
> CHECK-NEXT: 0x0000000100000fab 19 10 1 0 0
> CHECK-NEXT: 0x0000000100000fb2 20 1 1 0 0
> is_stmt
> CHECK-NEXT: 0x0000000100000fb4 20 1 1 0 0
> is_stmt end_sequence
> +
> +CHECK: .debug_pubnames contents:
> +CHECK-NEXT: length = 0x00000017 version = 0x0002 unit_offset = 0x00000000
> unit_size = 0x00000077
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x0000002a "main"
> +CHECK-NEXT: length = 0x0000002e version = 0x0002 unit_offset = 0x00000077
> unit_size = 0x000000a4
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000031 "baz"
> +CHECK-NEXT: 0x00000046 "private_int"
> +CHECK-NEXT: 0x00000067 "foo"
> +CHECK-NEXT: length = 0x0000001e version = 0x0002 unit_offset = 0x0000011b
> unit_size = 0x00000085
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x0000002a "val"
> +CHECK-NEXT: 0x00000050 "bar"
> +
> +CHECK: .debug_pubtypes contents:
> +CHECK-NEXT: length = 0x00000017 version = 0x0002 unit_offset = 0x00000000
> unit_size = 0x00000077
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x0000006f "char"
> +CHECK-NEXT: length = 0x00000016 version = 0x0002 unit_offset = 0x00000077
> unit_size = 0x000000a4
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x0000002a "int"
>
> Modified: llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> dsymutil/X86/basic-lto-linking-x86.test?rev=232342&
> r1=232341&r2=232342&view=diff
> ============================================================
> ==================
> --- llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test
> (original)
> +++ llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test Sun Mar
> 15 21:05:10 2015
> @@ -184,3 +184,23 @@ CHECK-NEXT: 0x0000000100000fa7 20
> CHECK-NEXT: 0x0000000100000fa9 19 0 1 0 0
> is_stmt
> CHECK-NEXT: 0x0000000100000fb2 20 0 1 0 0
> is_stmt
> CHECK-NEXT: 0x0000000100000fb4 20 0 1 0 0
> is_stmt end_sequence
> +
> +CHECK: .debug_pubnames contents:
> +CHECK-NEXT: length = 0x00000017 version = 0x0002 unit_offset = 0x00000000
> unit_size = 0x00000081
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000026 "main"
> +CHECK-NEXT: length = 0x0000002e version = 0x0002 unit_offset = 0x00000081
> unit_size = 0x000000b9
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000026 "private_int"
> +CHECK-NEXT: 0x0000003f "baz"
> +CHECK-NEXT: 0x00000058 "foo"
> +CHECK-NEXT: length = 0x0000001e version = 0x0002 unit_offset = 0x0000013a
> unit_size = 0x000000ac
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000026 "val"
> +CHECK-NEXT: 0x00000045 "bar"
> +
> +CHECK: .debug_pubtypes contents:
> +CHECK-NEXT: length = 0x0000001f version = 0x0002 unit_offset = 0x00000000
> unit_size = 0x00000081
> +CHECK-NEXT: Offset Name
> +CHECK-NEXT: 0x00000063 "int"
> +CHECK-NEXT: 0x00000079 "char"
>
> Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/
> dsymutil/DwarfLinker.cpp?rev=232342&r1=232341&r2=232342&view=diff
> ============================================================
> ==================
> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)
> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Sun Mar 15 21:05:10 2015
> @@ -143,6 +143,30 @@ public:
> /// list in the debug_loc section.
> void noteLocationAttribute(DIEInteger *Attr, int64_t PcOffset);
>
> + /// \brief Add a name accelerator entry for \p Die with \p Name
> + /// which is stored in the string table at \p Offset.
> + void addNameAccelerator(const DIE *Die, const char *Name, uint32_t
> Offset,
> + bool SkipPubnamesSection = false);
> +
> + /// \brief Add a type accelerator entry for \p Die with \p Name
> + /// which is stored in the string table at \p Offset.
> + void addTypeAccelerator(const DIE *Die, const char *Name, uint32_t
> Offset);
> +
> + struct AccelInfo {
> + StringRef Name; ///< Name of the entry.
> + const DIE *Die; ///< DIE this entry describes.
> + uint32_t NameOffset; ///< Offset of Name in the string pool.
> + bool SkipPubSection; ///< Emit this entry only in the apple_*
> sections.
> +
> + AccelInfo(StringRef Name, const DIE *Die, uint32_t NameOffset,
> + bool SkipPubSection = false)
> + : Name(Name), Die(Die), NameOffset(NameOffset),
> + SkipPubSection(SkipPubSection) {}
> + };
> +
> + const std::vector<AccelInfo> &getPubnames() const { return Pubnames; }
> + const std::vector<AccelInfo> &getPubtypes() const { return Pubtypes; }
> +
> private:
> DWARFUnit &OrigUnit;
> unsigned ID;
> @@ -182,6 +206,13 @@ private:
> /// along with the PC offset that is to be applied to their
> /// function's address.
> std::vector<std::pair<DIEInteger *, int64_t>> LocationAttributes;
> +
> + /// \brief Accelerator entries for the unit, both for the pub*
> + /// sections and the apple* ones.
> + /// @{
> + std::vector<AccelInfo> Pubnames;
> + std::vector<AccelInfo> Pubtypes;
> + /// @}
> };
>
> uint64_t CompileUnit::computeNextUnitOffset() {
> @@ -230,6 +261,20 @@ void CompileUnit::noteLocationAttribute(
> LocationAttributes.emplace_back(Attr, PcOffset);
> }
>
> +/// \brief Add a name accelerator entry for \p Die with \p Name
> +/// which is stored in the string table at \p Offset.
> +void CompileUnit::addNameAccelerator(const DIE *Die, const char *Name,
> + uint32_t Offset, bool
> SkipPubSection) {
> + Pubnames.emplace_back(Name, Die, Offset, SkipPubSection);
> +}
> +
> +/// \brief Add a type accelerator entry for \p Die with \p Name
> +/// which is stored in the string table at \p Offset.
> +void CompileUnit::addTypeAccelerator(const DIE *Die, const char *Name,
> + uint32_t Offset) {
> + Pubtypes.emplace_back(Name, Die, Offset, false);
> +}
> +
> /// \brief A string table that doesn't need relocations.
> ///
> /// We are doing a final link, no need for a string table that
> @@ -342,6 +387,12 @@ class DwarfStreamer {
> uint32_t LocSectionSize;
> uint32_t LineSectionSize;
>
> + /// \brief Emit the pubnames or pubtypes section contribution for \p
> + /// Unit into \p Sec. The data is provided in \p Names.
> + void emitPubSectionForUnit(const MCSection *Sec, StringRef Name,
> + const CompileUnit &Unit,
> + const std::vector<CompileUnit::AccelInfo>
> &Names);
> +
> public:
> /// \brief Actually create the streamer and the ouptut file.
> ///
> @@ -402,6 +453,12 @@ public:
> unsigned AdddressSize);
>
> uint32_t getLineSectionSize() const { return LineSectionSize; }
> +
> + /// \brief Emit the .debug_pubnames contribution for \p Unit.
> + void emitPubNamesForUnit(const CompileUnit &Unit);
> +
> + /// \brief Emit the .debug_pubtypes contribution for \p Unit.
> + void emitPubTypesForUnit(const CompileUnit &Unit);
> };
>
> bool DwarfStreamer::init(Triple TheTriple, StringRef OutputFilename) {
> @@ -851,6 +908,59 @@ void DwarfStreamer::emitLineTableForUnit
> MS->EmitLabel(LineEndSym);
> }
>
> +/// \brief Emit the pubnames or pubtypes section contribution for \p
> +/// Unit into \p Sec. The data is provided in \p Names.
> +void DwarfStreamer::emitPubSectionForUnit(
> + const MCSection *Sec, StringRef SecName, const CompileUnit &Unit,
> + const std::vector<CompileUnit::AccelInfo> &Names) {
> + if (Names.empty())
> + return;
> +
> + // Start the dwarf pubnames section.
> + Asm->OutStreamer.SwitchSection(Sec);
> + MCSymbol *BeginLabel =
> + Asm->GetTempSymbol("pub" + SecName + "_begin", Unit.getUniqueID());
> + MCSymbol *EndLabel =
> + Asm->GetTempSymbol("pub" + SecName + "_end", Unit.getUniqueID());
> +
> + bool HeaderEmitted = false;
> + // Emit the pubnames for this compilation unit.
> + for (const auto &Name : Names) {
> + if (Name.SkipPubSection)
> + continue;
> +
> + if (!HeaderEmitted) {
> + // Emit the header.
> + Asm->EmitLabelDifference(EndLabel, BeginLabel, 4); // Length
> + Asm->OutStreamer.EmitLabel(BeginLabel);
> + Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION); // Version
> + Asm->EmitInt32(Unit.getStartOffset()); // Unit offset
> + Asm->EmitInt32(Unit.getNextUnitOffset() - Unit.getStartOffset());
> // Size
> + HeaderEmitted = true;
> + }
> + Asm->EmitInt32(Name.Die->getOffset());
> + Asm->OutStreamer.EmitBytes(
> + StringRef(Name.Name.data(), Name.Name.size() + 1));
> + }
> +
> + if (!HeaderEmitted)
> + return;
> + Asm->EmitInt32(0); // End marker.
> + Asm->OutStreamer.EmitLabel(EndLabel);
> +}
> +
> +/// \brief Emit .debug_pubnames for \p Unit.
> +void DwarfStreamer::emitPubNamesForUnit(const CompileUnit &Unit) {
> + emitPubSectionForUnit(MC->getObjectFileInfo()->
> getDwarfPubNamesSection(),
> + "names", Unit, Unit.getPubnames());
> +}
> +
> +/// \brief Emit .debug_pubtypes for \p Unit.
> +void DwarfStreamer::emitPubTypesForUnit(const CompileUnit &Unit) {
> + emitPubSectionForUnit(MC->getObjectFileInfo()->
> getDwarfPubTypesSection(),
> + "types", Unit, Unit.getPubtypes());
> +}
> +
> /// \brief The core of the Dwarf linking logic.
> ///
> /// The link of the dwarf information from the object files will be
> @@ -989,10 +1099,19 @@ private:
> /// \brief Information gathered and exchanged between the various
> /// clone*Attributes helpers about the attributes of a particular DIE.
> struct AttributesInfo {
> + const char *Name, *MangledName; ///< Names.
> + uint32_t NameOffset, MangledNameOffset; ///< Offsets in the string
> pool.
> +
> uint64_t OrigHighPc; ///< Value of AT_high_pc in the input DIE
> int64_t PCOffset; ///< Offset to apply to PC addresses inside a
> function.
>
> - AttributesInfo() : OrigHighPc(0), PCOffset(0) {}
> + bool HasLowPc; ///< Does the DIE have a low_pc attribute?
> + bool IsDeclaration; ///< Is this DIE only a declaration?
> +
> + AttributesInfo()
> + : Name(nullptr), MangledName(nullptr), NameOffset(0),
> + MangledNameOffset(0), OrigHighPc(0), PCOffset(0),
> HasLowPc(false),
> + IsDeclaration(false) {}
> };
>
> /// \brief Helper for cloneDIE.
> @@ -1026,7 +1145,7 @@ private:
> const DWARFDebugInfoEntryMinimal
> &InputDIE,
> CompileUnit &U, AttributeSpec AttrSpec,
> const DWARFFormValue &Val, unsigned
> AttrSize,
> - const AttributesInfo &Info);
> + AttributesInfo &Info);
>
> /// \brief Helper for cloneDIE.
> bool applyValidRelocs(MutableArrayRef<char> Data, uint32_t BaseOffset,
> @@ -1055,6 +1174,9 @@ private:
> /// emit the result in the debug_line section.
> void patchLineTableForUnit(CompileUnit &Unit, DWARFContext &OrigDwarf);
>
> + /// \brief Emit the accelerator entries for \p Unit.
> + void emitAcceleratorEntriesForUnit(CompileUnit &Unit);
> +
> /// \brief DIELoc objects that need to be destructed (but not freed!).
> std::vector<DIELoc *> DIELocs;
> /// \brief DIEBlock objects that need to be destructed (but not freed!).
> @@ -1073,6 +1195,9 @@ private:
>
> CompileUnit *getUnitForOffset(unsigned Offset);
>
> + bool getDIENames(const DWARFDebugInfoEntryMinimal &Die, DWARFUnit &U,
> + AttributesInfo &Info);
> +
> void reportWarning(const Twine &Warning, const DWARFUnit *Unit =
> nullptr,
> const DWARFDebugInfoEntryMinimal *DIE = nullptr)
> const;
>
> @@ -1132,6 +1257,24 @@ const DWARFDebugInfoEntryMinimal *DwarfL
> return nullptr;
> }
>
> +/// \brief Get the potential name and mangled name for the entity
> +/// described by \p Die and store them in \Info if they are not
> +/// already there.
> +/// \returns is a name was found.
> +bool DwarfLinker::getDIENames(const DWARFDebugInfoEntryMinimal &Die,
> + DWARFUnit &U, AttributesInfo &Info) {
> + // FIXME: a bit wastefull as the first getName might return the
> + // short name.
> + if (!Info.MangledName &&
> + (Info.MangledName = Die.getName(&U, DINameKind::LinkageName)))
> + Info.MangledNameOffset = StringPool.getStringOffset(
> Info.MangledName);
> +
> + if (!Info.Name && (Info.Name = Die.getName(&U, DINameKind::ShortName)))
> + Info.NameOffset = StringPool.getStringOffset(Info.Name);
> +
> + return Info.Name || Info.MangledName;
> +}
> +
> /// \brief Report a warning to the user, optionaly including
> /// information about a specific \p DIE related to the warning.
> void DwarfLinker::reportWarning(const Twine &Warning, const DWARFUnit
> *Unit,
> @@ -1735,6 +1878,7 @@ unsigned DwarfLinker::cloneAddressAttrib
> if (Addr == UINT64_MAX)
> return 0;
> }
> + Info.HasLowPc = true;
> } else if (AttrSpec.Attr == dwarf::DW_AT_high_pc) {
> if (Die.getTag() == dwarf::DW_TAG_compile_unit) {
> if (uint64_t HighPc = Unit.getHighPc())
> @@ -1759,7 +1903,7 @@ unsigned DwarfLinker::cloneAddressAttrib
> unsigned DwarfLinker::cloneScalarAttribute(
> DIE &Die, const DWARFDebugInfoEntryMinimal &InputDIE, CompileUnit
> &Unit,
> AttributeSpec AttrSpec, const DWARFFormValue &Val, unsigned AttrSize,
> - const AttributesInfo &Info) {
> + AttributesInfo &Info) {
> uint64_t Value;
> if (AttrSpec.Attr == dwarf::DW_AT_high_pc &&
> Die.getTag() == dwarf::DW_TAG_compile_unit) {
> @@ -1787,6 +1931,8 @@ unsigned DwarfLinker::cloneScalarAttribu
> else if (AttrSpec.Attr == dwarf::DW_AT_location ||
> AttrSpec.Attr == dwarf::DW_AT_frame_base)
> Unit.noteLocationAttribute(Attr, Info.PCOffset);
> + else if (AttrSpec.Attr == dwarf::DW_AT_declaration && Value)
> + Info.IsDeclaration = true;
>
> Die.addValue(dwarf::Attribute(AttrSpec.Attr),
> dwarf::Form(AttrSpec.Form),
> Attr);
> @@ -1886,6 +2032,39 @@ bool DwarfLinker::applyValidRelocs(Mutab
> return Applied;
> }
>
> +static bool isTypeTag(uint16_t Tag) {
> + switch (Tag) {
> + case dwarf::DW_TAG_array_type:
> + case dwarf::DW_TAG_class_type:
> + case dwarf::DW_TAG_enumeration_type:
> + case dwarf::DW_TAG_pointer_type:
> + case dwarf::DW_TAG_reference_type:
> + case dwarf::DW_TAG_string_type:
> + case dwarf::DW_TAG_structure_type:
> + case dwarf::DW_TAG_subroutine_type:
> + case dwarf::DW_TAG_typedef:
> + case dwarf::DW_TAG_union_type:
> + case dwarf::DW_TAG_ptr_to_member_type:
> + case dwarf::DW_TAG_set_type:
> + case dwarf::DW_TAG_subrange_type:
> + case dwarf::DW_TAG_base_type:
> + case dwarf::DW_TAG_const_type:
> + case dwarf::DW_TAG_constant:
> + case dwarf::DW_TAG_file_type:
> + case dwarf::DW_TAG_namelist:
> + case dwarf::DW_TAG_packed_type:
> + case dwarf::DW_TAG_volatile_type:
> + case dwarf::DW_TAG_restrict_type:
> + case dwarf::DW_TAG_interface_type:
> + case dwarf::DW_TAG_unspecified_type:
> + case dwarf::DW_TAG_shared_type:
> + return true;
> + default:
> + break;
> + }
> + return false;
> +}
> +
> /// \brief Recursively clone \p InputDIE's subtrees that have been
> /// selected to appear in the linked output.
> ///
> @@ -1958,6 +2137,26 @@ DIE *DwarfLinker::cloneDIE(const DWARFDe
> cloneAttribute(*Die, InputDIE, Unit, Val, AttrSpec, AttrSize,
> AttrInfo);
> }
>
> + // Look for accelerator entries.
> + uint16_t Tag = InputDIE.getTag();
> + // FIXME: This is slightly wrong. An inline_subroutine without a
> + // low_pc, but with AT_ranges might be interesting to get into the
> + // accelerator tables too. For now stick with dsymutil's behavior.
> + if ((Info.InDebugMap || AttrInfo.HasLowPc) &&
> + Tag != dwarf::DW_TAG_compile_unit &&
> + getDIENames(InputDIE, Unit.getOrigUnit(), AttrInfo)) {
> + if (AttrInfo.MangledName && AttrInfo.MangledName != AttrInfo.Name)
> + Unit.addNameAccelerator(Die, AttrInfo.MangledName,
> + AttrInfo.MangledNameOffset,
> + Tag == dwarf::DW_TAG_inlined_subroutine);
> + if (AttrInfo.Name)
> + Unit.addNameAccelerator(Die, AttrInfo.Name, AttrInfo.NameOffset,
> + Tag == dwarf::DW_TAG_inlined_subroutine);
> + } else if (isTypeTag(Tag) && !AttrInfo.IsDeclaration &&
> + getDIENames(InputDIE, Unit.getOrigUnit(), AttrInfo)) {
> + Unit.addTypeAccelerator(Die, AttrInfo.Name, AttrInfo.NameOffset);
> + }
> +
> DIEAbbrev &NewAbbrev = Die->getAbbrev();
> // If a scope DIE is kept, we must have kept at least one child. If
> // it's not the case, we'll just be emitting one wasteful end of
> @@ -2218,6 +2417,11 @@ void DwarfLinker::patchLineTableForUnit(
> Unit.getOrigUnit().
> getAddressByteSize());
> }
>
> +void DwarfLinker::emitAcceleratorEntriesForUnit(CompileUnit &Unit) {
> + Streamer->emitPubNamesForUnit(Unit);
> + Streamer->emitPubTypesForUnit(Unit);
> +}
> +
> bool DwarfLinker::link(const DebugMap &Map) {
>
> if (Map.begin() == Map.end()) {
> @@ -2301,6 +2505,7 @@ bool DwarfLinker::link(const DebugMap &M
> continue;
> patchRangesForUnit(CurrentUnit, DwarfContext);
> Streamer->emitLocationsForUnit(CurrentUnit, DwarfContext);
> + emitAcceleratorEntriesForUnit(CurrentUnit);
> }
>
> // Emit all the compile unit's debug information.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150325/53bdc6cc/attachment.html>
More information about the llvm-commits
mailing list