[llvm] r292634 - [DWARF] [ObjectYAML] Adding APIs for unittesting

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 6 11:15:15 PST 2017


Ping

On Tue, Feb 28, 2017 at 8:08 AM David Blaikie <dblaikie at gmail.com> wrote:

> Looks like this change removed the need for the 'setForceChildren' API (by
> providing an alternative path for producing DWARF DIEs with
> present-yet-empty children lists) - could you remove it?
>
> On Fri, Jan 20, 2017 at 11:14 AM Chris Bieneman via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
> Author: cbieneman
> Date: Fri Jan 20 13:03:14 2017
> New Revision: 292634
>
> URL: http://llvm.org/viewvc/llvm-project?rev=292634&view=rev
> Log:
> [DWARF] [ObjectYAML] Adding APIs for unittesting
>
> Summary: This patch adds some new APIs to enable using the YAML DWARF
> representation in unit tests. The most basic new API is
> DWARFYAML::EmitDebugSections which converts a YAML string into a series of
> owned MemoryBuffer objects stored in a StringMap. The string map can then
> be used to construct a DWARFContext for parsing in place of an ObjectFile.
>
> Reviewers: dblaikie, clayborg
>
> Subscribers: mgorny, fhahn, jgosnell, aprantl, llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D28828
>
> Modified:
>     llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
>     llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h
>     llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
>     llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp
>     llvm/trunk/unittests/DebugInfo/DWARF/CMakeLists.txt
>     llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
>
> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h?rev=292634&r1=292633&r2=292634&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFContext.h Fri Jan 20
> 13:03:14 2017
> @@ -15,6 +15,7 @@
>  #include "llvm/ADT/MapVector.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/SmallVector.h"
> +#include "llvm/ADT/StringMap.h"
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/DebugInfo/DIContext.h"
>  #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
> @@ -293,10 +294,16 @@ class DWARFContextInMemory : public DWAR
>
>    SmallVector<SmallString<32>, 4> UncompressedSections;
>
> +  StringRef *MapSectionToMember(StringRef Name);
> +
>  public:
>    DWARFContextInMemory(const object::ObjectFile &Obj,
>      const LoadedObjectInfo *L = nullptr);
>
> +  DWARFContextInMemory(const StringMap<std::unique_ptr<MemoryBuffer>>
> &Sections,
> +                       uint8_t AddrSize,
> +                       bool isLittleEndian = sys::IsLittleEndianHost);
> +
>    bool isLittleEndian() const override { return IsLittleEndian; }
>    uint8_t getAddressSize() const override { return AddressSize; }
>    const DWARFSection &getInfoSection() override { return InfoSection; }
>
> Modified: llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h?rev=292634&r1=292633&r2=292634&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h (original)
> +++ llvm/trunk/include/llvm/ObjectYAML/DWARFEmitter.h Fri Jan 20 13:03:14
> 2017
> @@ -13,6 +13,14 @@
>  #ifndef LLVM_OBJECTYAML_DWARFEMITTER_H
>  #define LLVM_OBJECTYAML_DWARFEMITTER_H
>
> +#include "llvm/ADT/StringMap.h"
> +#include "llvm/ADT/StringRef.h"
> +#include "llvm/Support/Error.h"
> +#include "llvm/Support/Host.h"
> +#include "llvm/Support/MemoryBuffer.h"
> +#include <memory>
> +#include <vector>
> +
>  namespace llvm {
>  class raw_ostream;
>
> @@ -30,6 +38,10 @@ void EmitPubSection(llvm::raw_ostream &O
>  void EmitDebugInfo(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data
> &DI);
>  void EmitDebugLine(llvm::raw_ostream &OS, const llvm::DWARFYAML::Data
> &DI);
>
> +Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
> +EmitDebugSections(StringRef YAMLString,
> +                  bool IsLittleEndian = sys::IsLittleEndianHost);
> +
>  } // namespace DWARFYAML
>  } // namespace llvm
>
>
> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp?rev=292634&r1=292633&r2=292634&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp Fri Jan 20 13:03:14
> 2017
> @@ -617,40 +617,7 @@ DWARFContextInMemory::DWARFContextInMemo
>      name = name.substr(
>          name.find_first_not_of("._z")); // Skip ".", "z" and "_" prefixes.
>
> -    StringRef *SectionData =
> -        StringSwitch<StringRef *>(name)
> -            .Case("debug_info", &InfoSection.Data)
> -            .Case("debug_abbrev", &AbbrevSection)
> -            .Case("debug_loc", &LocSection.Data)
> -            .Case("debug_line", &LineSection.Data)
> -            .Case("debug_aranges", &ARangeSection)
> -            .Case("debug_frame", &DebugFrameSection)
> -            .Case("eh_frame", &EHFrameSection)
> -            .Case("debug_str", &StringSection)
> -            .Case("debug_ranges", &RangeSection)
> -            .Case("debug_macinfo", &MacinfoSection)
> -            .Case("debug_pubnames", &PubNamesSection)
> -            .Case("debug_pubtypes", &PubTypesSection)
> -            .Case("debug_gnu_pubnames", &GnuPubNamesSection)
> -            .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
> -            .Case("debug_info.dwo", &InfoDWOSection.Data)
> -            .Case("debug_abbrev.dwo", &AbbrevDWOSection)
> -            .Case("debug_loc.dwo", &LocDWOSection.Data)
> -            .Case("debug_line.dwo", &LineDWOSection.Data)
> -            .Case("debug_str.dwo", &StringDWOSection)
> -            .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
> -            .Case("debug_addr", &AddrSection)
> -            .Case("apple_names", &AppleNamesSection.Data)
> -            .Case("apple_types", &AppleTypesSection.Data)
> -            .Case("apple_namespaces", &AppleNamespacesSection.Data)
> -            .Case("apple_namespac", &AppleNamespacesSection.Data)
> -            .Case("apple_objc", &AppleObjCSection.Data)
> -            .Case("debug_cu_index", &CUIndexSection)
> -            .Case("debug_tu_index", &TUIndexSection)
> -            .Case("gdb_index", &GdbIndexSection)
> -            // Any more debug info sections go here.
> -            .Default(nullptr);
> -    if (SectionData) {
> +    if (StringRef *SectionData = MapSectionToMember(name)) {
>        *SectionData = data;
>        if (name == "debug_ranges") {
>          // FIXME: Use the other dwo range section when we emit it.
> @@ -811,4 +778,49 @@ DWARFContextInMemory::DWARFContextInMemo
>    }
>  }
>
> +DWARFContextInMemory::DWARFContextInMemory(
> +    const StringMap<std::unique_ptr<MemoryBuffer>> &Sections, uint8_t
> AddrSize,
> +    bool isLittleEndian)
> +    : IsLittleEndian(isLittleEndian), AddressSize(AddrSize) {
> +  for (const auto &SecIt : Sections) {
> +    if (StringRef *SectionData = MapSectionToMember(SecIt.first()))
> +      *SectionData = SecIt.second->getBuffer();
> +  }
> +}
> +
> +StringRef *DWARFContextInMemory::MapSectionToMember(StringRef Name) {
> +  return StringSwitch<StringRef *>(Name)
> +      .Case("debug_info", &InfoSection.Data)
> +      .Case("debug_abbrev", &AbbrevSection)
> +      .Case("debug_loc", &LocSection.Data)
> +      .Case("debug_line", &LineSection.Data)
> +      .Case("debug_aranges", &ARangeSection)
> +      .Case("debug_frame", &DebugFrameSection)
> +      .Case("eh_frame", &EHFrameSection)
> +      .Case("debug_str", &StringSection)
> +      .Case("debug_ranges", &RangeSection)
> +      .Case("debug_macinfo", &MacinfoSection)
> +      .Case("debug_pubnames", &PubNamesSection)
> +      .Case("debug_pubtypes", &PubTypesSection)
> +      .Case("debug_gnu_pubnames", &GnuPubNamesSection)
> +      .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
> +      .Case("debug_info.dwo", &InfoDWOSection.Data)
> +      .Case("debug_abbrev.dwo", &AbbrevDWOSection)
> +      .Case("debug_loc.dwo", &LocDWOSection.Data)
> +      .Case("debug_line.dwo", &LineDWOSection.Data)
> +      .Case("debug_str.dwo", &StringDWOSection)
> +      .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
> +      .Case("debug_addr", &AddrSection)
> +      .Case("apple_names", &AppleNamesSection.Data)
> +      .Case("apple_types", &AppleTypesSection.Data)
> +      .Case("apple_namespaces", &AppleNamespacesSection.Data)
> +      .Case("apple_namespac", &AppleNamespacesSection.Data)
> +      .Case("apple_objc", &AppleObjCSection.Data)
> +      .Case("debug_cu_index", &CUIndexSection)
> +      .Case("debug_tu_index", &TUIndexSection)
> +      .Case("gdb_index", &GdbIndexSection)
> +      // Any more debug info sections go here.
> +      .Default(nullptr);
> +}
> +
>  void DWARFContextInMemory::anchor() { }
>
> Modified: llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp?rev=292634&r1=292633&r2=292634&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp (original)
> +++ llvm/trunk/lib/ObjectYAML/DWARFEmitter.cpp Fri Jan 20 13:03:14 2017
> @@ -330,3 +330,42 @@ void DWARFYAML::EmitDebugLine(raw_ostrea
>      }
>    }
>  }
> +
> +typedef void (*EmitFuncType)(raw_ostream &, const DWARFYAML::Data &);
> +
> +void EmitDebugSectionImpl(
> +    const DWARFYAML::Data &DI, EmitFuncType EmitFunc, StringRef Sec,
> +    StringMap<std::unique_ptr<MemoryBuffer>> &OutputBuffers) {
> +  std::string Data;
> +  raw_string_ostream DebugInfoStream(Data);
> +  EmitFunc(DebugInfoStream, DI);
> +  DebugInfoStream.flush();
> +  if (!Data.empty())
> +    OutputBuffers[Sec] = MemoryBuffer::getMemBufferCopy(Data);
> +}
> +
> +Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
> +DWARFYAML::EmitDebugSections(StringRef YAMLString,
> +                             bool IsLittleEndian) {
> +  StringMap<std::unique_ptr<MemoryBuffer>> DebugSections;
> +
> +  yaml::Input YIn(YAMLString);
> +
> +  DWARFYAML::Data DI;
> +  DI.IsLittleEndian = IsLittleEndian;
> +  YIn >> DI;
> +  if (YIn.error())
> +    return errorCodeToError(YIn.error());
> +
> +  EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugInfo, "debug_info",
> +                       DebugSections);
> +  EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugLine, "debug_line",
> +                       DebugSections);
> +  EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugStr, "debug_str",
> +                       DebugSections);
> +  EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugAbbrev, "debug_abbrev",
> +                       DebugSections);
> +  EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugAranges, "debug_aranges",
> +                       DebugSections);
> +  return std::move(DebugSections);
> +}
>
> Modified: llvm/trunk/unittests/DebugInfo/DWARF/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/DebugInfo/DWARF/CMakeLists.txt?rev=292634&r1=292633&r2=292634&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/DebugInfo/DWARF/CMakeLists.txt (original)
> +++ llvm/trunk/unittests/DebugInfo/DWARF/CMakeLists.txt Fri Jan 20
> 13:03:14 2017
> @@ -4,6 +4,7 @@ set(LLVM_LINK_COMPONENTS
>    DebugInfoDWARF
>    MC
>    Object
> +  ObjectYAML
>    Support
>    )
>
>
> Modified: llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp?rev=292634&r1=292633&r2=292634&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp (original)
> +++ llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp Fri Jan 20
> 13:03:14 2017
> @@ -13,6 +13,8 @@
>  #include "llvm/DebugInfo/DWARF/DWARFDie.h"
>  #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
>  #include "llvm/DebugInfo/DWARF/DWARFUnit.h"
> +#include "llvm/ObjectYAML/DWARFYAML.h"
> +#include "llvm/ObjectYAML/DWARFEmitter.h"
>  #include "llvm/Support/Dwarf.h"
>  #include "llvm/Support/Host.h"
>  #include "llvm/Support/TargetSelect.h"
> @@ -1157,41 +1159,35 @@ TEST(DWARFDebugInfo, TestChildIteratorsO
>    EXPECT_EQ(begin, end);
>  }
>
> -
>  TEST(DWARFDebugInfo, TestEmptyChildren) {
> -  // Test a DIE that says it has children in the abbreviation, but
> actually
> -  // doesn't have any attributes, will not return anything during
> iteration.
> -  // We do this by making sure the begin and end iterators are equal.
> -  uint16_t Version = 4;
> -
> -  const uint8_t AddrSize = sizeof(void *);
> -  initLLVMIfNeeded();
> -  Triple Triple = getHostTripleForAddrSize(AddrSize);
> -  auto ExpectedDG = dwarfgen::Generator::create(Triple, Version);
> -  if (HandleExpectedError(ExpectedDG))
> -    return;
> -  dwarfgen::Generator *DG = ExpectedDG.get().get();
> -  dwarfgen::CompileUnit &CU = DG->addCompileUnit();
> -
> -  // Scope to allow us to re-use the same DIE names
> -  {
> -    // Create a compile unit DIE that has an abbreviation that says it has
> -    // children, but doesn't have any actual attributes. This helps us
> test
> -    // a DIE that has only one child: a NULL DIE.
> -    auto CUDie = CU.getUnitDIE();
> -    CUDie.setForceChildren();
> -  }
> -
> -  MemoryBufferRef FileBuffer(DG->generate(), "dwarf");
> -  auto Obj = object::ObjectFile::createObjectFile(FileBuffer);
> -  EXPECT_TRUE((bool)Obj);
> -  DWARFContextInMemory DwarfContext(*Obj.get());
> -
> +  const char *yamldata = "debug_abbrev:\n"
> +                         "  - Code:            0x00000001\n"
> +                         "    Tag:             DW_TAG_compile_unit\n"
> +                         "    Children:        DW_CHILDREN_yes\n"
> +                         "    Attributes:\n"
> +                         "debug_info:\n"
> +                         "  - Length:          9\n"
> +                         "    Version:         4\n"
> +                         "    AbbrOffset:      0\n"
> +                         "    AddrSize:        8\n"
> +                         "    Entries:\n"
> +                         "      - AbbrCode:        0x00000001\n"
> +                         "        Values:\n"
> +                         "      - AbbrCode:        0x00000000\n"
> +                         "        Values:\n";
> +
> +  auto ErrOrSections = DWARFYAML::EmitDebugSections(StringRef(yamldata));
> +  EXPECT_TRUE((bool)ErrOrSections);
> +
> +  auto &DebugSections = *ErrOrSections;
> +
> +  DWARFContextInMemory DwarfContext(DebugSections, 8);
> +
>    // Verify the number of compile units is correct.
>    uint32_t NumCUs = DwarfContext.getNumCompileUnits();
>    EXPECT_EQ(NumCUs, 1u);
>    DWARFCompileUnit *U = DwarfContext.getCompileUnitAtIndex(0);
> -
> +
>    // Get the compile unit DIE is valid.
>    auto CUDie = U->getUnitDIE(false);
>    EXPECT_TRUE(CUDie.isValid());
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170306/16aa4546/attachment.html>


More information about the llvm-commits mailing list