From 62a7f80af7fc7cb0856fe72537817a721c1dbc97 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Fri, 29 Jun 2018 12:15:54 +0000 Subject: [PATCH] Add a test for reading lld-generated build-ids Summary: This test makes sure we are able to read the shorter build-ids which are generated by lld. To make this work, I've extended lldb-test to print the UUID of the loaded object file. I've renamed the lldb-test subcommand from "module-sections" to "object-file" to reflect the fact it prints more than just the sections. I've also added the module Architecture to the output, so we could avoid printing the entire symbol file information just to get the ArchSpec details in the lc_version_min test (which was also the only test in it's folder not using the module-sections command). Reviewers: aprantl, zturner Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D48646 llvm-svn: 335967 --- lldb/lit/Modules/build-id-case.yaml | 2 +- lldb/lit/Modules/compressed-sections.yaml | 2 +- lldb/lit/Modules/elf-duplicate-section.yaml | 2 +- lldb/lit/Modules/elf-section-types.yaml | 2 +- lldb/lit/Modules/lc_version_min.yaml | 4 ++-- lldb/lit/Modules/short-build-id.yaml | 26 +++++++++++++++++++++++++ lldb/tools/lldb-test/lldb-test.cpp | 30 +++++++++++++++++------------ 7 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 lldb/lit/Modules/short-build-id.yaml diff --git a/lldb/lit/Modules/build-id-case.yaml b/lldb/lit/Modules/build-id-case.yaml index bbad512..246163a 100644 --- a/lldb/lit/Modules/build-id-case.yaml +++ b/lldb/lit/Modules/build-id-case.yaml @@ -2,7 +2,7 @@ # RUN: yaml2obj %s > %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug # RUN: cd %t # RUN: llvm-objcopy --strip-all --add-gnu-debuglink=.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug %t/stripped.out -# RUN: lldb-test module-sections %t/stripped.out | FileCheck %s +# RUN: lldb-test object-file %t/stripped.out | FileCheck %s # CHECK: Name: .debug_frame # CHECK-NEXT: Type: dwarf-frame diff --git a/lldb/lit/Modules/compressed-sections.yaml b/lldb/lit/Modules/compressed-sections.yaml index db18924..c75dc85 100644 --- a/lldb/lit/Modules/compressed-sections.yaml +++ b/lldb/lit/Modules/compressed-sections.yaml @@ -1,6 +1,6 @@ # REQUIRES: zlib # RUN: yaml2obj %s > %t -# RUN: lldb-test module-sections --contents %t | FileCheck %s +# RUN: lldb-test object-file --contents %t | FileCheck %s --- !ELF FileHeader: Class: ELFCLASS32 diff --git a/lldb/lit/Modules/elf-duplicate-section.yaml b/lldb/lit/Modules/elf-duplicate-section.yaml index 99a76c2..b4b391c 100644 --- a/lldb/lit/Modules/elf-duplicate-section.yaml +++ b/lldb/lit/Modules/elf-duplicate-section.yaml @@ -2,7 +2,7 @@ # RUN: yaml2obj %s > %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug # RUN: cd %t # RUN: llvm-objcopy --strip-all --add-gnu-debuglink=.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug %t/.build-id/1b/8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9.debug %t/stripped.out -# RUN: lldb-test module-sections %t/stripped.out | FileCheck %s +# RUN: lldb-test object-file %t/stripped.out | FileCheck %s # Make sure that the debug_frame section is present only once. # CHECK: Name: .debug_frame diff --git a/lldb/lit/Modules/elf-section-types.yaml b/lldb/lit/Modules/elf-section-types.yaml index a8aa5c8..64906a9 100644 --- a/lldb/lit/Modules/elf-section-types.yaml +++ b/lldb/lit/Modules/elf-section-types.yaml @@ -1,5 +1,5 @@ # RUN: yaml2obj %s > %t -# RUN: lldb-test module-sections %t | FileCheck %s +# RUN: lldb-test object-file %t | FileCheck %s # CHECK: Name: .text # CHECK-NEXT: Type: code diff --git a/lldb/lit/Modules/lc_version_min.yaml b/lldb/lit/Modules/lc_version_min.yaml index 5294ecf..e791070 100644 --- a/lldb/lit/Modules/lc_version_min.yaml +++ b/lldb/lit/Modules/lc_version_min.yaml @@ -1,8 +1,8 @@ # RUN: yaml2obj %s > %t.out -# RUN: lldb-test symbols %t.out | FileCheck %s +# RUN: lldb-test object-file %t.out | FileCheck %s # Test that the deployment target is parsed from the load commands. -# CHECK: x86_64-apple-macosx10.9.0 +# CHECK: Architecture: x86_64-apple-macosx10.9.0 --- !mach-o FileHeader: magic: 0xFEEDFACF diff --git a/lldb/lit/Modules/short-build-id.yaml b/lldb/lit/Modules/short-build-id.yaml new file mode 100644 index 0000000..9078134 --- /dev/null +++ b/lldb/lit/Modules/short-build-id.yaml @@ -0,0 +1,26 @@ +# RUN: yaml2obj %s >%t +# RUN: lldb-test object-file %t | FileCheck %s + +# CHECK: UUID: 333059A4-3CC3-D5F9 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000201000 +Sections: + - Name: .note.gnu.build-id + Type: SHT_NOTE + Flags: [ SHF_ALLOC ] + Address: 0x0000000000200190 + AddressAlign: 0x0000000000000004 + Content: 040000000800000003000000474E5500333059A43CC3D5F9 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000201000 + AddressAlign: 0x0000000000000004 + Content: '' +... diff --git a/lldb/tools/lldb-test/lldb-test.cpp b/lldb/tools/lldb-test/lldb-test.cpp index e4bb542..c9225f6 100644 --- a/lldb/tools/lldb-test/lldb-test.cpp +++ b/lldb/tools/lldb-test/lldb-test.cpp @@ -51,14 +51,15 @@ using namespace llvm; namespace opts { static cl::SubCommand BreakpointSubcommand("breakpoints", "Test breakpoint resolution"); -cl::SubCommand ModuleSubcommand("module-sections", - "Display LLDB Module Information"); +cl::SubCommand ObjectFileSubcommand("object-file", + "Display LLDB object file information"); cl::SubCommand SymbolsSubcommand("symbols", "Dump symbols for an object file"); cl::SubCommand IRMemoryMapSubcommand("ir-memory-map", "Test IRMemoryMap"); cl::opt Log("log", cl::desc("Path to a log file"), cl::init(""), cl::sub(BreakpointSubcommand), - cl::sub(ModuleSubcommand), cl::sub(SymbolsSubcommand), + cl::sub(ObjectFileSubcommand), + cl::sub(SymbolsSubcommand), cl::sub(IRMemoryMapSubcommand)); /// Create a target using the file pointed to by \p Filename, or abort. @@ -85,13 +86,14 @@ static std::string substitute(StringRef Cmd); static int evaluateBreakpoints(Debugger &Dbg); } // namespace breakpoint -namespace module { +namespace object { cl::opt SectionContents("contents", cl::desc("Dump each section's contents"), - cl::sub(ModuleSubcommand)); + cl::sub(ObjectFileSubcommand)); cl::list InputFilenames(cl::Positional, cl::desc(""), - cl::OneOrMore, cl::sub(ModuleSubcommand)); -} // namespace module + cl::OneOrMore, + cl::sub(ObjectFileSubcommand)); +} // namespace object namespace symbols { static cl::list InputFilenames(cl::Positional, @@ -616,11 +618,11 @@ int opts::symbols::dumpSymbols(Debugger &Dbg) { return HadErrors; } -static int dumpModules(Debugger &Dbg) { +static int dumpObjectFiles(Debugger &Dbg) { LinePrinter Printer(4, llvm::outs()); int HadErrors = 0; - for (const auto &File : opts::module::InputFilenames) { + for (const auto &File : opts::object::InputFilenames) { ModuleSpec Spec{FileSpec(File, false)}; auto ModulePtr = std::make_shared(Spec); @@ -634,6 +636,10 @@ static int dumpModules(Debugger &Dbg) { continue; } + Printer.formatLine("Architecture: {0}", + ModulePtr->GetArchitecture().GetTriple().getTriple()); + Printer.formatLine("UUID: {0}", ModulePtr->GetUUID().GetAsString()); + size_t Count = Sections->GetNumSections(0); Printer.formatLine("Showing {0} sections", Count); for (size_t I = 0; I < Count; ++I) { @@ -646,7 +652,7 @@ static int dumpModules(Debugger &Dbg) { Printer.formatLine("VM size: {0}", S->GetByteSize()); Printer.formatLine("File size: {0}", S->GetFileSize()); - if (opts::module::SectionContents) { + if (opts::object::SectionContents) { DataExtractor Data; S->GetSectionData(Data); ArrayRef Bytes = {Data.GetDataStart(), Data.GetDataEnd()}; @@ -841,8 +847,8 @@ int main(int argc, const char *argv[]) { if (opts::BreakpointSubcommand) return opts::breakpoint::evaluateBreakpoints(*Dbg); - if (opts::ModuleSubcommand) - return dumpModules(*Dbg); + if (opts::ObjectFileSubcommand) + return dumpObjectFiles(*Dbg); if (opts::SymbolsSubcommand) return opts::symbols::dumpSymbols(*Dbg); if (opts::IRMemoryMapSubcommand) -- 2.7.4