Index: lldb/trunk/include/lldb/Core/AddressRange.h =================================================================== --- lldb/trunk/include/lldb/Core/AddressRange.h +++ lldb/trunk/include/lldb/Core/AddressRange.h @@ -163,6 +163,20 @@ /// range, \b false otherwise. bool ContainsLoadAddress(lldb::addr_t load_addr, Target *target) const; + //------------------------------------------------------------------ + /// Extends this range with \b rhs_range if it overlaps this range on the + /// right side. The range overlaps on the right side if the base address + /// of \b rhs_range lies within this range or if it's contiguous on its + /// right side. + /// + /// @param[in] rhs_range + /// The range to extend at the right side. + /// + /// @return + /// Returns \b true if this range was extended, \b false otherwise. + //------------------------------------------------------------------ + bool Extend(const AddressRange &rhs_range); + /// Dump a description of this object to a Stream. /// /// Dump a description of the contents of this object to the supplied stream Index: lldb/trunk/include/lldb/Symbol/Block.h =================================================================== --- lldb/trunk/include/lldb/Symbol/Block.h +++ lldb/trunk/include/lldb/Symbol/Block.h @@ -185,6 +185,22 @@ /// parent. Block *GetInlinedParent(); + //------------------------------------------------------------------ + /// Get the inlined block at the given call site that contains this block. + /// + /// @param[in] find_call_site + /// a declaration with the file and line of the call site to find. + /// + /// @return + /// If this block contains inlined function info and is at the call + /// site given by the file and line at the given \b declaration, then + /// it will return this block, otherwise the parent blocks will be + /// searched to see if any is at the call site. nullptr will be returned + /// if no block is found at the call site. + //------------------------------------------------------------------ + Block * + GetContainingInlinedBlockWithCallSite(const Declaration &find_call_site); + /// Get the sibling block for this block. /// /// \return Index: lldb/trunk/include/lldb/Symbol/Declaration.h =================================================================== --- lldb/trunk/include/lldb/Symbol/Declaration.h +++ lldb/trunk/include/lldb/Symbol/Declaration.h @@ -107,6 +107,17 @@ /// \li 1 if lhs > rhs static int Compare(const Declaration &lhs, const Declaration &rhs); + /// Checks if this object has the same file and line as another declaration + /// object. + /// + /// \param[in] declaration + /// The const Declaration object to compare with. + /// + /// \return + /// Returns \b true if \b declaration is at the same file and + /// line, \b false otherwise. + bool FileAndLineEqual(const Declaration &declaration) const; + /// Dump a description of this object to a Stream. /// /// Dump a description of the contents of this object to the supplied stream Index: lldb/trunk/include/lldb/Symbol/LineEntry.h =================================================================== --- lldb/trunk/include/lldb/Symbol/LineEntry.h +++ lldb/trunk/include/lldb/Symbol/LineEntry.h @@ -123,13 +123,21 @@ /// LineEntry (and it will include the range of the following LineEntries /// that match either 32 or 0.) /// + /// When \b include_inlined_functions is \b true inlined functions with + /// a call site at this LineEntry will also be included in the complete + /// range. + /// /// If the initial LineEntry this method is called on is a line #0, only the /// range of contiuous LineEntries with line #0 will be included in the /// complete range. /// + /// @param[in] include_inlined_functions + /// Whether to include inlined functions at the same line or not. + /// /// \return /// The contiguous AddressRange for this source line. - AddressRange GetSameLineContiguousAddressRange() const; + AddressRange + GetSameLineContiguousAddressRange(bool include_inlined_functions) const; /// Apply file mappings from target.source-map to the LineEntry's file. /// Index: lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/desktop.xcscheme =================================================================== --- lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/desktop.xcscheme +++ lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/desktop.xcscheme @@ -42,10 +42,10 @@ + + + + + + + + Index: lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme =================================================================== --- lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme +++ lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme @@ -84,10 +84,10 @@ + + + + + + + + = rhs_end_addr) + // The rhs range totally overlaps this one, nothing to add. + return false; + + m_byte_size += rhs_end_addr - lhs_end_addr; + return true; +} + void AddressRange::Clear() { m_base_addr.Clear(); m_byte_size = 0; Index: lldb/trunk/source/Symbol/Block.cpp =================================================================== --- lldb/trunk/source/Symbol/Block.cpp +++ lldb/trunk/source/Symbol/Block.cpp @@ -212,6 +212,21 @@ return nullptr; } +Block *Block::GetContainingInlinedBlockWithCallSite( + const Declaration &find_call_site) { + auto inlined_block = GetContainingInlinedBlock(); + + while (inlined_block) { + auto function_info = inlined_block->GetInlinedFunctionInfo(); + + if (function_info && + function_info->GetCallSite().FileAndLineEqual(find_call_site)) + return inlined_block; + inlined_block = inlined_block->GetInlinedParent(); + } + return nullptr; +} + bool Block::GetRangeContainingOffset(const addr_t offset, Range &range) { const Range *range_ptr = m_ranges.FindEntryThatContains(offset); if (range_ptr) { Index: lldb/trunk/source/Symbol/Declaration.cpp =================================================================== --- lldb/trunk/source/Symbol/Declaration.cpp +++ lldb/trunk/source/Symbol/Declaration.cpp @@ -83,6 +83,11 @@ return 0; } +bool Declaration::FileAndLineEqual(const Declaration &declaration) const { + int file_compare = FileSpec::Compare(this->m_file, declaration.m_file, true); + return file_compare == 0 && this->m_line == declaration.m_line; +} + bool lldb_private::operator==(const Declaration &lhs, const Declaration &rhs) { #ifdef LLDB_ENABLE_DECLARATION_COLUMNS if (lhs.GetColumn() == rhs.GetColumn()) Index: lldb/trunk/source/Symbol/LineEntry.cpp =================================================================== --- lldb/trunk/source/Symbol/LineEntry.cpp +++ lldb/trunk/source/Symbol/LineEntry.cpp @@ -190,40 +190,62 @@ return FileSpec::Compare(a.file, b.file, true); } -AddressRange LineEntry::GetSameLineContiguousAddressRange() const { +AddressRange LineEntry::GetSameLineContiguousAddressRange( + bool include_inlined_functions) const { // Add each LineEntry's range to complete_line_range until we find a // different file / line number. AddressRange complete_line_range = range; + auto symbol_context_scope = lldb::eSymbolContextLineEntry; + Declaration start_call_site(original_file, line); + if (include_inlined_functions) + symbol_context_scope |= lldb::eSymbolContextBlock; while (true) { SymbolContext next_line_sc; Address range_end(complete_line_range.GetBaseAddress()); range_end.Slide(complete_line_range.GetByteSize()); - range_end.CalculateSymbolContext(&next_line_sc, - lldb::eSymbolContextLineEntry); + range_end.CalculateSymbolContext(&next_line_sc, symbol_context_scope); - if (next_line_sc.line_entry.IsValid() && - next_line_sc.line_entry.range.GetByteSize() > 0 && - original_file == next_line_sc.line_entry.original_file) { + if (!next_line_sc.line_entry.IsValid() || + next_line_sc.line_entry.range.GetByteSize() == 0) + break; + + if (original_file == next_line_sc.line_entry.original_file && + (next_line_sc.line_entry.line == 0 || + line == next_line_sc.line_entry.line)) { // Include any line 0 entries - they indicate that this is compiler- // generated code that does not correspond to user source code. - if (next_line_sc.line_entry.line == 0) { - complete_line_range.SetByteSize( - complete_line_range.GetByteSize() + - next_line_sc.line_entry.range.GetByteSize()); - continue; - } - - if (line == next_line_sc.line_entry.line) { - // next_line_sc is the same file & line as this LineEntry, so extend - // our AddressRange by its size and continue to see if there are more - // LineEntries that we can combine. - complete_line_range.SetByteSize( - complete_line_range.GetByteSize() + - next_line_sc.line_entry.range.GetByteSize()); - continue; - } + // next_line_sc is the same file & line as this LineEntry, so extend + // our AddressRange by its size and continue to see if there are more + // LineEntries that we can combine. However, if there was nothing to + // extend we're done. + if (!complete_line_range.Extend(next_line_sc.line_entry.range)) + break; + continue; } + + if (include_inlined_functions && next_line_sc.block && + next_line_sc.block->GetContainingInlinedBlock() != nullptr) { + // The next_line_sc might be in a different file if it's an inlined + // function. If this is the case then we still want to expand our line + // range to include them if the inlined function is at the same call site + // as this line entry. The current block could represent a nested inline + // function call so we need to need to check up the block tree to see if + // we find one. + auto inlined_parent_block = + next_line_sc.block->GetContainingInlinedBlockWithCallSite( + start_call_site); + if (!inlined_parent_block) + // We didn't find any parent inlined block with a call site at this line + // entry so this inlined function is probably at another line. + break; + // Extend our AddressRange by the size of the inlined block, but if there + // was nothing to add then we're done. + if (!complete_line_range.Extend(next_line_sc.line_entry.range)) + break; + continue; + } + break; } return complete_line_range; Index: lldb/trunk/source/Target/Thread.cpp =================================================================== --- lldb/trunk/source/Target/Thread.cpp +++ lldb/trunk/source/Target/Thread.cpp @@ -1395,10 +1395,12 @@ bool abort_other_plans, const LineEntry &line_entry, const SymbolContext &addr_context, lldb::RunMode stop_other_threads, Status &status, LazyBool step_out_avoids_code_withoug_debug_info) { + const bool include_inlined_functions = true; + auto address_range = + line_entry.GetSameLineContiguousAddressRange(include_inlined_functions); return QueueThreadPlanForStepOverRange( - abort_other_plans, line_entry.GetSameLineContiguousAddressRange(), - addr_context, stop_other_threads, status, - step_out_avoids_code_withoug_debug_info); + abort_other_plans, address_range, addr_context, stop_other_threads, + status, step_out_avoids_code_withoug_debug_info); } ThreadPlanSP Thread::QueueThreadPlanForStepInRange( @@ -1428,8 +1430,10 @@ lldb::RunMode stop_other_threads, Status &status, LazyBool step_in_avoids_code_without_debug_info, LazyBool step_out_avoids_code_without_debug_info) { + const bool include_inlined_functions = false; return QueueThreadPlanForStepInRange( - abort_other_plans, line_entry.GetSameLineContiguousAddressRange(), + abort_other_plans, + line_entry.GetSameLineContiguousAddressRange(include_inlined_functions), addr_context, step_in_target, stop_other_threads, status, step_in_avoids_code_without_debug_info, step_out_avoids_code_without_debug_info); Index: lldb/trunk/source/Target/ThreadPlanStepOut.cpp =================================================================== --- lldb/trunk/source/Target/ThreadPlanStepOut.cpp +++ lldb/trunk/source/Target/ThreadPlanStepOut.cpp @@ -110,8 +110,9 @@ return_address_decr_pc.CalculateSymbolContext( &return_address_sc, lldb::eSymbolContextLineEntry); if (return_address_sc.line_entry.IsValid()) { - range = - return_address_sc.line_entry.GetSameLineContiguousAddressRange(); + const bool include_inlined_functions = false; + range = return_address_sc.line_entry.GetSameLineContiguousAddressRange( + include_inlined_functions); if (range.GetByteSize() > 0) { return_address = m_thread.GetProcess()->AdvanceAddressToNextBranchInstruction( Index: lldb/trunk/source/Target/ThreadPlanStepRange.cpp =================================================================== --- lldb/trunk/source/Target/ThreadPlanStepRange.cpp +++ lldb/trunk/source/Target/ThreadPlanStepRange.cpp @@ -126,8 +126,10 @@ new_context.line_entry.original_file) { if (m_addr_context.line_entry.line == new_context.line_entry.line) { m_addr_context = new_context; - AddRange( - m_addr_context.line_entry.GetSameLineContiguousAddressRange()); + const bool include_inlined_functions = + GetKind() == eKindStepOverRange; + AddRange(m_addr_context.line_entry.GetSameLineContiguousAddressRange( + include_inlined_functions)); ret_value = true; if (log) { StreamString s; @@ -142,8 +144,10 @@ } else if (new_context.line_entry.line == 0) { new_context.line_entry.line = m_addr_context.line_entry.line; m_addr_context = new_context; - AddRange( - m_addr_context.line_entry.GetSameLineContiguousAddressRange()); + const bool include_inlined_functions = + GetKind() == eKindStepOverRange; + AddRange(m_addr_context.line_entry.GetSameLineContiguousAddressRange( + include_inlined_functions)); ret_value = true; if (log) { StreamString s; Index: lldb/trunk/tools/lldb-test/lldb-test.cpp =================================================================== --- lldb/trunk/tools/lldb-test/lldb-test.cpp +++ lldb/trunk/tools/lldb-test/lldb-test.cpp @@ -364,8 +364,10 @@ cu_sp->FindLineEntry(0, Line, &src_file, false, &le); if (!le.IsValid()) continue; - - auto addr = le.GetSameLineContiguousAddressRange().GetBaseAddress(); + const bool include_inlined_functions = false; + auto addr = + le.GetSameLineContiguousAddressRange(include_inlined_functions) + .GetBaseAddress(); if (!addr.IsValid()) continue; @@ -414,8 +416,9 @@ cu_sp->FindLineEntry(0, Line, &src_file, false, &le); if (!le.IsValid()) continue; - - auto addr = le.GetSameLineContiguousAddressRange().GetBaseAddress(); + const bool include_inlined_functions = false; + auto addr = le.GetSameLineContiguousAddressRange(include_inlined_functions) + .GetBaseAddress(); if (!addr.IsValid()) continue; Index: lldb/trunk/unittests/Core/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/Core/CMakeLists.txt +++ lldb/trunk/unittests/Core/CMakeLists.txt @@ -10,13 +10,11 @@ lldbPluginObjectFileELF lldbPluginSymbolVendorELF lldbUtilityHelpers + LLVMTestingSupport LINK_COMPONENTS Support ) -add_dependencies(LLDBCoreTests yaml2obj) -add_definitions(-DYAML2OBJ="$") - set(test_inputs mangled-function-names.yaml ) Index: lldb/trunk/unittests/Core/MangledTest.cpp =================================================================== --- lldb/trunk/unittests/Core/MangledTest.cpp +++ lldb/trunk/unittests/Core/MangledTest.cpp @@ -20,6 +20,7 @@ #include "llvm/Support/FileUtilities.h" #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" +#include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" @@ -49,38 +50,18 @@ EXPECT_STREQ("", TheDemangled.GetCString()); } -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - llvm::SmallString<128> MessageStorage; \ - llvm::raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } - TEST(MangledTest, NameIndexes_FindFunctionSymbols) { FileSystem::Initialize(); HostInfo::Initialize(); ObjectFileELF::Initialize(); SymbolVendorELF::Initialize(); - std::string Yaml = GetInputFilePath("mangled-function-names.yaml"); llvm::SmallString<128> Obj; ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( "mangled-function-names-%%%%%%", "obj", Obj)); - llvm::FileRemover Deleter(Obj); - llvm::StringRef Args[] = {YAML2OBJ, Yaml}; - llvm::StringRef ObjRef = Obj; - const llvm::Optional redirects[] = {llvm::None, ObjRef, - llvm::None}; - ASSERT_EQ(0, - llvm::sys::ExecuteAndWait(YAML2OBJ, Args, llvm::None, redirects)); - uint64_t Size; - ASSERT_NO_ERROR(llvm::sys::fs::file_size(Obj, Size)); - ASSERT_GT(Size, 0u); + ASSERT_THAT_ERROR(ReadYAMLObjectFile("mangled-function-names.yaml", Obj), + llvm::Succeeded()); ModuleSpec Spec{FileSpec(Obj)}; Spec.GetSymbolFileSpec().SetFile(Obj, FileSpec::Style::native); Index: lldb/trunk/unittests/Interpreter/TestCompletion.cpp =================================================================== --- lldb/trunk/unittests/Interpreter/TestCompletion.cpp +++ lldb/trunk/unittests/Interpreter/TestCompletion.cpp @@ -15,6 +15,7 @@ #include "gtest/gtest.h" #include "TestingSupport/MockTildeExpressionResolver.h" +#include "TestingSupport/TestUtilities.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -25,17 +26,6 @@ using namespace llvm; using namespace lldb_private; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } - namespace { class CompletionTest : public testing::Test { Index: lldb/trunk/unittests/ObjectFile/ELF/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/ObjectFile/ELF/CMakeLists.txt +++ lldb/trunk/unittests/ObjectFile/ELF/CMakeLists.txt @@ -6,11 +6,9 @@ lldbPluginSymbolVendorELF lldbCore lldbUtilityHelpers + LLVMTestingSupport ) -add_dependencies(ObjectFileELFTests yaml2obj) -add_definitions(-DYAML2OBJ="$") - set(test_inputs early-section-headers.so debug-info-relocations.pcm.yaml Index: lldb/trunk/unittests/ObjectFile/ELF/TestObjectFileELF.cpp =================================================================== --- lldb/trunk/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ lldb/trunk/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -22,6 +22,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" using namespace lldb_private; @@ -46,33 +47,14 @@ protected: }; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - llvm::SmallString<128> MessageStorage; \ - llvm::raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } - TEST_F(ObjectFileELFTest, SectionsResolveConsistently) { - std::string yaml = GetInputFilePath("sections-resolve-consistently.yaml"); llvm::SmallString<128> obj; ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( "sections-resolve-consistently-%%%%%%", "obj", obj)); - llvm::FileRemover remover(obj); - llvm::StringRef args[] = {YAML2OBJ, yaml}; - llvm::StringRef obj_ref = obj; - const llvm::Optional redirects[] = {llvm::None, obj_ref, - llvm::None}; - ASSERT_EQ(0, - llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects)); - uint64_t size; - ASSERT_NO_ERROR(llvm::sys::fs::file_size(obj, size)); - ASSERT_GT(size, 0u); + ASSERT_THAT_ERROR( + ReadYAMLObjectFile("sections-resolve-consistently.yaml", obj), + llvm::Succeeded()); ModuleSpec spec{FileSpec(obj)}; spec.GetSymbolFileSpec().SetFile(obj, FileSpec::Style::native); @@ -155,21 +137,12 @@ } TEST_F(ObjectFileELFTest, TestAARCH64Relocations) { - std::string yaml = GetInputFilePath("debug-info-relocations.pcm.yaml"); llvm::SmallString<128> obj; ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( "debug-info-relocations-%%%%%%", "obj", obj)); - llvm::FileRemover remover(obj); - llvm::StringRef args[] = {YAML2OBJ, yaml}; - llvm::StringRef obj_ref = obj; - const llvm::Optional redirects[] = {llvm::None, obj_ref, - llvm::None}; - ASSERT_EQ(0, - llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects)); - uint64_t size; - ASSERT_NO_ERROR(llvm::sys::fs::file_size(obj, size)); - ASSERT_GT(size, 0u); + ASSERT_THAT_ERROR(ReadYAMLObjectFile("debug-info-relocations.pcm.yaml", obj), + llvm::Succeeded()); ModuleSpec spec{FileSpec(obj)}; spec.GetSymbolFileSpec().SetFile(obj, FileSpec::Style::native); Index: lldb/trunk/unittests/Symbol/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/Symbol/CMakeLists.txt +++ lldb/trunk/unittests/Symbol/CMakeLists.txt @@ -4,17 +4,21 @@ TestClangASTContext.cpp TestDWARFCallFrameInfo.cpp TestType.cpp + TestLineEntry.cpp LINK_LIBS lldbHost lldbSymbol lldbUtilityHelpers lldbPluginObjectFileELF + lldbPluginObjectFileMachO + lldbPluginSymbolVendorMacOSX + lldbPluginSymbolFileDWARF + LLVMTestingSupport ) -add_dependencies(SymbolTests yaml2obj) -add_definitions(-DYAML2OBJ="$") set(test_inputs basic-call-frame-info.yaml + inlined-functions.yaml ) add_unittest_inputs(SymbolTests "${test_inputs}") Index: lldb/trunk/unittests/Symbol/TestDWARFCallFrameInfo.cpp =================================================================== --- lldb/trunk/unittests/Symbol/TestDWARFCallFrameInfo.cpp +++ lldb/trunk/unittests/Symbol/TestDWARFCallFrameInfo.cpp @@ -20,6 +20,7 @@ #include "lldb/Host/HostInfo.h" #include "lldb/Symbol/DWARFCallFrameInfo.h" #include "lldb/Utility/StreamString.h" +#include "llvm/Testing/Support/Error.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/Path.h" @@ -47,17 +48,6 @@ void TestBasic(DWARFCallFrameInfo::Type type, llvm::StringRef symbol); }; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - llvm::SmallString<128> MessageStorage; \ - llvm::raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } - namespace lldb_private { static std::ostream &operator<<(std::ostream &OS, const UnwindPlan::Row &row) { StreamString SS; @@ -94,23 +84,12 @@ void DWARFCallFrameInfoTest::TestBasic(DWARFCallFrameInfo::Type type, llvm::StringRef symbol) { - std::string yaml = GetInputFilePath("basic-call-frame-info.yaml"); llvm::SmallString<128> obj; - ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( "basic-call-frame-info-%%%%%%", "obj", obj)); llvm::FileRemover obj_remover(obj); - - llvm::StringRef args[] = {YAML2OBJ, yaml}; - llvm::StringRef obj_ref = obj; - const llvm::Optional redirects[] = {llvm::None, obj_ref, - llvm::None}; - ASSERT_EQ(0, - llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects)); - - uint64_t size; - ASSERT_NO_ERROR(llvm::sys::fs::file_size(obj, size)); - ASSERT_GT(size, 0u); + ASSERT_THAT_ERROR(ReadYAMLObjectFile("basic-call-frame-info.yaml", obj), + llvm::Succeeded()); auto module_sp = std::make_shared(ModuleSpec(FileSpec(obj))); SectionList *list = module_sp->GetSectionList(); Index: lldb/trunk/unittests/TestingSupport/CMakeLists.txt =================================================================== --- lldb/trunk/unittests/TestingSupport/CMakeLists.txt +++ lldb/trunk/unittests/TestingSupport/CMakeLists.txt @@ -9,3 +9,6 @@ LINK_COMPONENTS Support ) + +add_dependencies(lldbUtilityHelpers yaml2obj) +add_definitions(-DYAML2OBJ="$") \ No newline at end of file Index: lldb/trunk/unittests/TestingSupport/TestUtilities.h =================================================================== --- lldb/trunk/unittests/TestingSupport/TestUtilities.h +++ lldb/trunk/unittests/TestingSupport/TestUtilities.h @@ -9,11 +9,26 @@ #ifndef LLDB_UNITTESTS_UTILITY_HELPERS_TESTUTILITIES_H #define LLDB_UNITTESTS_UTILITY_HELPERS_TESTUTILITIES_H +#include "llvm/ADT/SmallString.h" #include "llvm/ADT/Twine.h" +#include "llvm/Support/Error.h" #include +#define ASSERT_NO_ERROR(x) \ + if (std::error_code ASSERT_NO_ERROR_ec = x) { \ + llvm::SmallString<128> MessageStorage; \ + llvm::raw_svector_ostream Message(MessageStorage); \ + Message << #x ": did not return errc::success.\n" \ + << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ + << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ + GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ + } else { \ + } + namespace lldb_private { std::string GetInputFilePath(const llvm::Twine &name); +llvm::Error ReadYAMLObjectFile(const llvm::Twine &yaml_name, + llvm::SmallString<128> &obj); } #endif Index: lldb/trunk/unittests/TestingSupport/TestUtilities.cpp =================================================================== --- lldb/trunk/unittests/TestingSupport/TestUtilities.cpp +++ lldb/trunk/unittests/TestingSupport/TestUtilities.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" extern const char *TestMainArgv0; @@ -19,3 +20,24 @@ llvm::sys::path::append(result, "Inputs", name); return result.str(); } + +llvm::Error +lldb_private::ReadYAMLObjectFile(const llvm::Twine &yaml_name, + llvm::SmallString<128> &object_file) { + std::string yaml = GetInputFilePath(yaml_name); + llvm::StringRef args[] = {YAML2OBJ, yaml}; + llvm::StringRef obj_ref = object_file; + const llvm::Optional redirects[] = {llvm::None, obj_ref, + llvm::None}; + if (llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects) != 0) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Error running yaml2obj %s.", yaml.c_str()); + uint64_t size; + if (auto ec = llvm::sys::fs::file_size(object_file, size)) + return llvm::errorCodeToError(ec); + if (size == 0) + return llvm::createStringError( + llvm::inconvertibleErrorCode(), + "Empty object file created from yaml2obj %s.", yaml.c_str()); + return llvm::Error::success(); +} \ No newline at end of file