diff --git a/lldb/include/lldb/Core/AddressRange.h b/lldb/include/lldb/Core/AddressRange.h --- a/lldb/include/lldb/Core/AddressRange.h +++ b/lldb/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 diff --git a/lldb/include/lldb/Symbol/Block.h b/lldb/include/lldb/Symbol/Block.h --- a/lldb/include/lldb/Symbol/Block.h +++ b/lldb/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 diff --git a/lldb/include/lldb/Symbol/Declaration.h b/lldb/include/lldb/Symbol/Declaration.h --- a/lldb/include/lldb/Symbol/Declaration.h +++ b/lldb/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 diff --git a/lldb/include/lldb/Symbol/LineEntry.h b/lldb/include/lldb/Symbol/LineEntry.h --- a/lldb/include/lldb/Symbol/LineEntry.h +++ b/lldb/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. /// diff --git a/lldb/source/Core/AddressRange.cpp b/lldb/source/Core/AddressRange.cpp --- a/lldb/source/Core/AddressRange.cpp +++ b/lldb/source/Core/AddressRange.cpp @@ -122,6 +122,24 @@ return false; } +bool AddressRange::Extend(const AddressRange &rhs_range) { + addr_t lhs_end_addr = GetBaseAddress().GetFileAddress() + GetByteSize(); + addr_t rhs_base_addr = rhs_range.GetBaseAddress().GetFileAddress(); + + if (!ContainsFileAddress(rhs_range.GetBaseAddress()) && + lhs_end_addr != rhs_base_addr) + // The ranges don't intersect at all on the right side of this range. + return false; + + addr_t rhs_end_addr = rhs_base_addr + rhs_range.GetByteSize(); + if (lhs_end_addr >= 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; diff --git a/lldb/source/Symbol/Block.cpp b/lldb/source/Symbol/Block.cpp --- a/lldb/source/Symbol/Block.cpp +++ b/lldb/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) { diff --git a/lldb/source/Symbol/Declaration.cpp b/lldb/source/Symbol/Declaration.cpp --- a/lldb/source/Symbol/Declaration.cpp +++ b/lldb/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()) diff --git a/lldb/source/Symbol/LineEntry.cpp b/lldb/source/Symbol/LineEntry.cpp --- a/lldb/source/Symbol/LineEntry.cpp +++ b/lldb/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; diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp --- a/lldb/source/Target/Thread.cpp +++ b/lldb/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); diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp --- a/lldb/source/Target/ThreadPlanStepOut.cpp +++ b/lldb/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( diff --git a/lldb/source/Target/ThreadPlanStepRange.cpp b/lldb/source/Target/ThreadPlanStepRange.cpp --- a/lldb/source/Target/ThreadPlanStepRange.cpp +++ b/lldb/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; diff --git a/lldb/tools/lldb-test/lldb-test.cpp b/lldb/tools/lldb-test/lldb-test.cpp --- a/lldb/tools/lldb-test/lldb-test.cpp +++ b/lldb/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; diff --git a/lldb/unittests/Core/CMakeLists.txt b/lldb/unittests/Core/CMakeLists.txt --- a/lldb/unittests/Core/CMakeLists.txt +++ b/lldb/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 ) diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp --- a/lldb/unittests/Core/MangledTest.cpp +++ b/lldb/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); diff --git a/lldb/unittests/Interpreter/TestCompletion.cpp b/lldb/unittests/Interpreter/TestCompletion.cpp --- a/lldb/unittests/Interpreter/TestCompletion.cpp +++ b/lldb/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 { diff --git a/lldb/unittests/ObjectFile/ELF/CMakeLists.txt b/lldb/unittests/ObjectFile/ELF/CMakeLists.txt --- a/lldb/unittests/ObjectFile/ELF/CMakeLists.txt +++ b/lldb/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 diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp --- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/lldb/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); diff --git a/lldb/unittests/Symbol/CMakeLists.txt b/lldb/unittests/Symbol/CMakeLists.txt --- a/lldb/unittests/Symbol/CMakeLists.txt +++ b/lldb/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}") diff --git a/lldb/unittests/Symbol/Inputs/inlined-functions.yaml b/lldb/unittests/Symbol/Inputs/inlined-functions.yaml new file mode 100644 --- /dev/null +++ b/lldb/unittests/Symbol/Inputs/inlined-functions.yaml @@ -0,0 +1,943 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000001 + ncmds: 4 + sizeofcmds: 1160 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 1032 + segname: '' + vmaddr: 0 + vmsize: 2022 + fileoff: 1192 + filesize: 2022 + maxprot: 7 + initprot: 7 + nsects: 6 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000000000000 + size: 224 + offset: 0x000004A8 + align: 4 + reloff: 0x00000C90 + nreloc: 1 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __debug_str + segname: __DWARF + addr: 0x00000000000000E0 + size: 223 + offset: 0x00000588 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __debug_abbrev + segname: __DWARF + addr: 0x00000000000001BF + size: 190 + offset: 0x00000667 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __debug_info + segname: __DWARF + addr: 0x000000000000027D + size: 583 + offset: 0x00000725 + align: 0 + reloff: 0x00000C98 + nreloc: 8 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __compact_unwind + segname: __LD + addr: 0x0000000000000670 + size: 64 + offset: 0x00000B18 + align: 3 + reloff: 0x00000CD8 + nreloc: 2 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __debug_line + segname: __DWARF + addr: 0x0000000000000718 + size: 206 + offset: 0x00000BC0 + align: 0 + reloff: 0x00000CE8 + nreloc: 1 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - cmd: LC_BUILD_VERSION + cmdsize: 24 + platform: 1 + minos: 658944 + sdk: 658944 + ntools: 0 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 3312 + nsyms: 2 + stroff: 3344 + strsize: 20 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 0 + iextdefsym: 0 + nextdefsym: 2 + iundefsym: 2 + nundefsym: 0 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 0 + nindirectsyms: 0 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 +LinkEditData: + NameList: + - n_strx: 7 + n_type: 0x0F + n_sect: 1 + n_desc: 0 + n_value: 0 + - n_strx: 1 + n_type: 0x0F + n_sect: 1 + n_desc: 0 + n_value: 32 + StringTable: + - '' + - _main + - __Z4sum3iii + - '' +DWARF: + debug_str: + - 'Apple LLVM version 10.0.1 (clang-1001.0.46.3)' + - inlined-functions.cpp + - '/Users/aadsm/Projects/llvm-project/lldb/unittests/Symbol/Inputs' + - sum3 + - _Z4sum3iii + - _Z4sum2ii + - sum2 + - int + - a + - b + - result + - _Z4sum4iiii + - sum4 + - c + - d + - main + - argc + - argv + - char + - sum + debug_abbrev: + - Code: 0x00000001 + Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_producer + Form: DW_FORM_strp + - Attribute: DW_AT_language + Form: DW_FORM_data2 + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_stmt_list + Form: DW_FORM_sec_offset + - Attribute: DW_AT_comp_dir + Form: DW_FORM_strp + - Attribute: DW_AT_low_pc + Form: DW_FORM_addr + - Attribute: DW_AT_high_pc + Form: DW_FORM_data4 + - Code: 0x00000002 + Tag: DW_TAG_subprogram + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_low_pc + Form: DW_FORM_addr + - Attribute: DW_AT_high_pc + Form: DW_FORM_data4 + - Attribute: DW_AT_frame_base + Form: DW_FORM_exprloc + - Attribute: DW_AT_linkage_name + Form: DW_FORM_strp + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Attribute: DW_AT_external + Form: DW_FORM_flag_present + - Code: 0x00000003 + Tag: DW_TAG_formal_parameter + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Code: 0x00000004 + Tag: DW_TAG_variable + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Code: 0x00000005 + Tag: DW_TAG_subprogram + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_linkage_name + Form: DW_FORM_strp + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Attribute: DW_AT_external + Form: DW_FORM_flag_present + - Attribute: DW_AT_inline + Form: DW_FORM_data1 + - Code: 0x00000006 + Tag: DW_TAG_formal_parameter + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Code: 0x00000007 + Tag: DW_TAG_variable + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Code: 0x00000008 + Tag: DW_TAG_base_type + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_encoding + Form: DW_FORM_data1 + - Attribute: DW_AT_byte_size + Form: DW_FORM_data1 + - Code: 0x00000009 + Tag: DW_TAG_subprogram + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_low_pc + Form: DW_FORM_addr + - Attribute: DW_AT_high_pc + Form: DW_FORM_data4 + - Attribute: DW_AT_frame_base + Form: DW_FORM_exprloc + - Attribute: DW_AT_name + Form: DW_FORM_strp + - Attribute: DW_AT_decl_file + Form: DW_FORM_data1 + - Attribute: DW_AT_decl_line + Form: DW_FORM_data1 + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Attribute: DW_AT_external + Form: DW_FORM_flag_present + - Code: 0x0000000A + Tag: DW_TAG_inlined_subroutine + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_abstract_origin + Form: DW_FORM_ref4 + - Attribute: DW_AT_low_pc + Form: DW_FORM_addr + - Attribute: DW_AT_high_pc + Form: DW_FORM_data4 + - Attribute: DW_AT_call_file + Form: DW_FORM_data1 + - Attribute: DW_AT_call_line + Form: DW_FORM_data1 + - Code: 0x0000000B + Tag: DW_TAG_formal_parameter + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + - Attribute: DW_AT_abstract_origin + Form: DW_FORM_ref4 + - Code: 0x0000000C + Tag: DW_TAG_variable + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + - Attribute: DW_AT_abstract_origin + Form: DW_FORM_ref4 + - Code: 0x0000000D + Tag: DW_TAG_pointer_type + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + debug_info: + - Length: + TotalLength: 579 + Version: 4 + AbbrOffset: 0 + AddrSize: 8 + Entries: + - AbbrCode: 0x00000001 + Values: + - Value: 0x0000000000000000 + - Value: 0x0000000000000004 + - Value: 0x000000000000002E + - Value: 0x0000000000000000 + - Value: 0x0000000000000044 + - Value: 0x0000000000000000 + - Value: 0x00000000000000E0 + - AbbrCode: 0x00000002 + Values: + - Value: 0x0000000000000000 + - Value: 0x000000000000001E + - Value: 0x0000000000000001 + BlockData: + - 0x56 + - Value: 0x0000000000000089 + - Value: 0x0000000000000084 + - Value: 0x0000000000000001 + - Value: 0x0000000000000006 + - Value: 0x00000000000000B2 + - Value: 0x0000000000000001 + - AbbrCode: 0x00000003 + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x7C + - Value: 0x00000000000000A7 + - Value: 0x0000000000000001 + - Value: 0x0000000000000006 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000003 + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x78 + - Value: 0x00000000000000A9 + - Value: 0x0000000000000001 + - Value: 0x0000000000000006 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000003 + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x74 + - Value: 0x00000000000000C3 + - Value: 0x0000000000000001 + - Value: 0x0000000000000006 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000004 + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x70 + - Value: 0x00000000000000AB + - Value: 0x0000000000000001 + - Value: 0x0000000000000007 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x00000005 + Values: + - Value: 0x0000000000000094 + - Value: 0x000000000000009E + - Value: 0x0000000000000001 + - Value: 0x0000000000000001 + - Value: 0x00000000000000B2 + - Value: 0x0000000000000001 + - Value: 0x0000000000000001 + - AbbrCode: 0x00000006 + Values: + - Value: 0x00000000000000A7 + - Value: 0x0000000000000001 + - Value: 0x0000000000000001 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000006 + Values: + - Value: 0x00000000000000A9 + - Value: 0x0000000000000001 + - Value: 0x0000000000000001 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000007 + Values: + - Value: 0x00000000000000AB + - Value: 0x0000000000000001 + - Value: 0x0000000000000002 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x00000008 + Values: + - Value: 0x00000000000000A3 + - Value: 0x0000000000000005 + - Value: 0x0000000000000004 + - AbbrCode: 0x00000005 + Values: + - Value: 0x00000000000000B2 + - Value: 0x00000000000000BE + - Value: 0x0000000000000001 + - Value: 0x000000000000000B + - Value: 0x00000000000000B2 + - Value: 0x0000000000000001 + - Value: 0x0000000000000001 + - AbbrCode: 0x00000006 + Values: + - Value: 0x00000000000000A7 + - Value: 0x0000000000000001 + - Value: 0x000000000000000B + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000006 + Values: + - Value: 0x00000000000000A9 + - Value: 0x0000000000000001 + - Value: 0x000000000000000B + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000006 + Values: + - Value: 0x00000000000000C3 + - Value: 0x0000000000000001 + - Value: 0x000000000000000B + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000006 + Values: + - Value: 0x00000000000000C5 + - Value: 0x0000000000000001 + - Value: 0x000000000000000B + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000007 + Values: + - Value: 0x00000000000000AB + - Value: 0x0000000000000001 + - Value: 0x000000000000000C + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x00000009 + Values: + - Value: 0x0000000000000020 + - Value: 0x00000000000000C0 + - Value: 0x0000000000000001 + BlockData: + - 0x56 + - Value: 0x00000000000000C7 + - Value: 0x0000000000000001 + - Value: 0x0000000000000011 + - Value: 0x00000000000000B2 + - Value: 0x0000000000000001 + - AbbrCode: 0x00000003 + Values: + - Value: 0x0000000000000003 + BlockData: + - 0x91 + - 0xB4 + - 0x7F + - Value: 0x00000000000000CC + - Value: 0x0000000000000001 + - Value: 0x0000000000000011 + - Value: 0x00000000000000B2 + - AbbrCode: 0x00000003 + Values: + - Value: 0x0000000000000003 + BlockData: + - 0x91 + - 0xA8 + - 0x7F + - Value: 0x00000000000000D1 + - Value: 0x0000000000000001 + - Value: 0x0000000000000011 + - Value: 0x0000000000000235 + - AbbrCode: 0x00000004 + Values: + - Value: 0x0000000000000003 + BlockData: + - 0x91 + - 0xA4 + - 0x7F + - Value: 0x00000000000000DB + - Value: 0x0000000000000001 + - Value: 0x0000000000000013 + - Value: 0x00000000000000B2 + - AbbrCode: 0x0000000A + Values: + - Value: 0x0000000000000080 + - Value: 0x000000000000005A + - Value: 0x0000000000000025 + - Value: 0x0000000000000001 + - Value: 0x0000000000000012 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x44 + - Value: 0x0000000000000090 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x40 + - Value: 0x000000000000009B + - AbbrCode: 0x0000000C + Values: + - Value: 0x0000000000000003 + BlockData: + - 0x91 + - 0xBC + - 0x7F + - Value: 0x00000000000000A6 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x0000000A + Values: + - Value: 0x00000000000000B9 + - Value: 0x000000000000007F + - Value: 0x000000000000003C + - Value: 0x0000000000000001 + - Value: 0x0000000000000013 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x64 + - Value: 0x00000000000000C9 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x60 + - Value: 0x00000000000000D4 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x5C + - Value: 0x00000000000000DF + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x58 + - Value: 0x00000000000000EA + - AbbrCode: 0x0000000C + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x54 + - Value: 0x00000000000000F5 + - AbbrCode: 0x0000000A + Values: + - Value: 0x0000000000000080 + - Value: 0x000000000000008B + - Value: 0x000000000000000C + - Value: 0x0000000000000001 + - Value: 0x000000000000000C + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x70 + - Value: 0x0000000000000090 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x6C + - Value: 0x000000000000009B + - AbbrCode: 0x0000000C + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x68 + - Value: 0x00000000000000A6 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x0000000A + Values: + - Value: 0x0000000000000080 + - Value: 0x00000000000000A3 + - Value: 0x0000000000000009 + - Value: 0x0000000000000001 + - Value: 0x000000000000000C + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x7C + - Value: 0x0000000000000090 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x78 + - Value: 0x000000000000009B + - AbbrCode: 0x0000000C + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x74 + - Value: 0x00000000000000A6 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x0000000A + Values: + - Value: 0x0000000000000080 + - Value: 0x00000000000000CC + - Value: 0x0000000000000009 + - Value: 0x0000000000000001 + - Value: 0x0000000000000014 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x50 + - Value: 0x0000000000000090 + - AbbrCode: 0x0000000B + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x4C + - Value: 0x000000000000009B + - AbbrCode: 0x0000000C + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x48 + - Value: 0x00000000000000A6 + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x00000000 + Values: [] + - AbbrCode: 0x0000000D + Values: + - Value: 0x000000000000023A + - AbbrCode: 0x0000000D + Values: + - Value: 0x000000000000023F + - AbbrCode: 0x00000008 + Values: + - Value: 0x00000000000000D6 + - Value: 0x0000000000000006 + - Value: 0x0000000000000001 + - AbbrCode: 0x00000000 + Values: [] + debug_line: + - Length: + TotalLength: 202 + Version: 4 + PrologueLength: 45 + MinInstLength: 1 + MaxOpsPerInst: 1 + DefaultIsStmt: 1 + LineBase: 251 + LineRange: 14 + OpcodeBase: 13 + StandardOpcodeLengths: [ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 ] + IncludeDirs: [] + Files: + - Name: inlined-functions.cpp + DirIdx: 0 + ModTime: 0 + Length: 0 + Opcodes: + - Opcode: DW_LNS_extended_op + ExtLen: 9 + SubOpcode: DW_LNE_set_address + Data: 0 + - Opcode: 0x17 + Data: 0 + - Opcode: DW_LNS_set_column + Data: 18 + - Opcode: DW_LNS_set_prologue_end + Data: 18 + - Opcode: 0xC9 + Data: 18 + - Opcode: DW_LNS_set_column + Data: 20 + - Opcode: DW_LNS_negate_stmt + Data: 20 + - Opcode: 0x3C + Data: 20 + - Opcode: DW_LNS_set_column + Data: 24 + - Opcode: 0x3C + Data: 24 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: 0x3C + Data: 9 + - Opcode: DW_LNS_set_column + Data: 12 + - Opcode: DW_LNS_negate_stmt + Data: 12 + - Opcode: 0x3D + Data: 12 + - Opcode: DW_LNS_set_column + Data: 5 + - Opcode: DW_LNS_negate_stmt + Data: 5 + - Opcode: 0x3C + Data: 5 + - Opcode: DW_LNS_set_column + Data: 0 + - Opcode: DW_LNS_negate_stmt + Data: 0 + - Opcode: DW_LNS_advance_line + SData: 9 + Data: 0 + - Opcode: 0x4A + Data: 0 + - Opcode: DW_LNS_set_column + Data: 5 + - Opcode: DW_LNS_set_prologue_end + Data: 5 + - Opcode: DW_LNS_const_add_pc + Data: 5 + - Opcode: 0x59 + Data: 5 + - Opcode: DW_LNS_set_column + Data: 18 + - Opcode: DW_LNS_advance_line + SData: -16 + Data: 18 + - Opcode: DW_LNS_advance_pc + Data: 36 + - Opcode: DW_LNS_copy + Data: 36 + - Opcode: DW_LNS_set_column + Data: 20 + - Opcode: DW_LNS_negate_stmt + Data: 20 + - Opcode: 0x3C + Data: 20 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: 0x3C + Data: 9 + - Opcode: DW_LNS_set_column + Data: 23 + - Opcode: DW_LNS_negate_stmt + Data: 23 + - Opcode: DW_LNS_advance_line + SData: 10 + Data: 23 + - Opcode: DW_LNS_const_add_pc + Data: 23 + - Opcode: 0xD6 + Data: 23 + - Opcode: DW_LNS_set_column + Data: 26 + - Opcode: DW_LNS_negate_stmt + Data: 26 + - Opcode: 0x3C + Data: 26 + - Opcode: DW_LNS_set_column + Data: 18 + - Opcode: DW_LNS_negate_stmt + Data: 18 + - Opcode: DW_LNS_advance_line + SData: -10 + Data: 18 + - Opcode: 0x90 + Data: 18 + - Opcode: DW_LNS_set_column + Data: 20 + - Opcode: DW_LNS_negate_stmt + Data: 20 + - Opcode: 0x3C + Data: 20 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: 0x3C + Data: 9 + - Opcode: DW_LNS_set_column + Data: 12 + - Opcode: DW_LNS_negate_stmt + Data: 12 + - Opcode: 0x3D + Data: 12 + - Opcode: DW_LNS_set_column + Data: 36 + - Opcode: DW_LNS_advance_line + SData: 9 + Data: 36 + - Opcode: 0x3C + Data: 36 + - Opcode: DW_LNS_set_column + Data: 39 + - Opcode: DW_LNS_negate_stmt + Data: 39 + - Opcode: 0x3C + Data: 39 + - Opcode: DW_LNS_set_column + Data: 18 + - Opcode: DW_LNS_negate_stmt + Data: 18 + - Opcode: DW_LNS_advance_line + SData: -10 + Data: 18 + - Opcode: 0x90 + Data: 18 + - Opcode: DW_LNS_set_column + Data: 20 + - Opcode: DW_LNS_negate_stmt + Data: 20 + - Opcode: 0x3C + Data: 20 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: 0x3C + Data: 9 + - Opcode: DW_LNS_set_column + Data: 29 + - Opcode: DW_LNS_negate_stmt + Data: 29 + - Opcode: DW_LNS_advance_line + SData: 10 + Data: 29 + - Opcode: 0x3C + Data: 29 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: DW_LNS_negate_stmt + Data: 9 + - Opcode: 0x3C + Data: 9 + - Opcode: DW_LNS_set_column + Data: 12 + - Opcode: DW_LNS_negate_stmt + Data: 12 + - Opcode: 0x3D + Data: 12 + - Opcode: 0x67 + Data: 12 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: 0x41 + Data: 9 + - Opcode: DW_LNS_set_column + Data: 18 + - Opcode: DW_LNS_advance_line + SData: -17 + Data: 18 + - Opcode: DW_LNS_const_add_pc + Data: 18 + - Opcode: 0x12 + Data: 18 + - Opcode: DW_LNS_set_column + Data: 20 + - Opcode: DW_LNS_negate_stmt + Data: 20 + - Opcode: 0x3C + Data: 20 + - Opcode: DW_LNS_set_column + Data: 9 + - Opcode: 0x3C + Data: 9 + - Opcode: DW_LNS_set_column + Data: 5 + - Opcode: DW_LNS_negate_stmt + Data: 5 + - Opcode: DW_LNS_advance_line + SData: 19 + Data: 5 + - Opcode: 0x3C + Data: 5 + - Opcode: DW_LNS_advance_pc + Data: 11 + - Opcode: DW_LNS_extended_op + ExtLen: 1 + SubOpcode: DW_LNE_end_sequence + Data: 11 +... diff --git a/lldb/unittests/Symbol/TestDWARFCallFrameInfo.cpp b/lldb/unittests/Symbol/TestDWARFCallFrameInfo.cpp --- a/lldb/unittests/Symbol/TestDWARFCallFrameInfo.cpp +++ b/lldb/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(); diff --git a/lldb/unittests/Symbol/TestLineEntry.cpp b/lldb/unittests/Symbol/TestLineEntry.cpp new file mode 100644 --- /dev/null +++ b/lldb/unittests/Symbol/TestLineEntry.cpp @@ -0,0 +1,235 @@ +//===-- TestLineEntry.cpp ------------------------------*- C++ -*-===// +// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" +#include + +#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h" +#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h" +#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h" +#include "Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h" +#include "TestingSupport/TestUtilities.h" +#include "lldb/Symbol/ClangASTContext.h" + +#include "lldb/Core/Module.h" +#include "lldb/Host/FileSystem.h" +#include "lldb/Host/HostInfo.h" +#include "lldb/Symbol/CompileUnit.h" +#include "lldb/Symbol/SymbolContext.h" +#include "lldb/Utility/StreamString.h" + +#include "llvm/Support/FileUtilities.h" +#include "llvm/Support/Program.h" +#include "llvm/Testing/Support/Error.h" + +using namespace lldb_private; +using namespace lldb; + +class LineEntryTest : public testing::Test { +public: + void SetUp() override { + FileSystem::Initialize(); + HostInfo::Initialize(); + ObjectFileMachO::Initialize(); + SymbolVendorMacOSX::Initialize(); + SymbolFileDWARF::Initialize(); + ClangASTContext::Initialize(); + } + + void TearDown() override { + ClangASTContext::Terminate(); + SymbolFileDWARF::Terminate(); + SymbolVendorMacOSX::Terminate(); + ObjectFileMachO::Terminate(); + HostInfo::Terminate(); + FileSystem::Terminate(); + } + +protected: + llvm::Expected GetModule(); + llvm::Expected GetLineEntryForLine(uint32_t line); + ModuleSP m_module_sp; +}; + +llvm::Expected LineEntryTest::GetModule() { + if (m_module_sp) + return m_module_sp; + + llvm::SmallString<128> obj; + if (auto ec = llvm::sys::fs::createTemporaryFile("source-%%%%%%", "obj", obj)) + return llvm::errorCodeToError(ec); + llvm::FileRemover obj_remover(obj); + if (auto error = ReadYAMLObjectFile("inlined-functions.yaml", obj)) + return llvm::Error(std::move(error)); + + m_module_sp = std::make_shared(ModuleSpec(FileSpec(obj))); + // Preload because the temporary file will be gone once we exit this function. + m_module_sp->PreloadSymbols(); + return m_module_sp; +} + +llvm::Expected LineEntryTest::GetLineEntryForLine(uint32_t line) { + auto expected_module_so = GetModule(); + + if (!expected_module_so) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "Not able to get module for test object."); + + auto module = expected_module_so->get(); + bool check_inlines = true; + bool exact = true; + SymbolContextList sc_comp_units; + SymbolContextList sc_line_entries; + FileSpec file_spec("inlined-functions.cpp"); + module->ResolveSymbolContextsForFileSpec(file_spec, line, check_inlines, + lldb::eSymbolContextCompUnit, + sc_comp_units); + if (sc_comp_units.GetSize() == 0) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "No comp unit found on the test object."); + sc_comp_units[0].comp_unit->ResolveSymbolContext( + file_spec, line, check_inlines, exact, eSymbolContextLineEntry, + sc_line_entries); + if (sc_line_entries.GetSize() == 0) + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "No line entry found on the test object."); + return sc_line_entries[0].line_entry; +} + +TEST_F(LineEntryTest, GetSameLineContiguousAddressRangeNoInlines) { + auto line_entry = GetLineEntryForLine(18); + ASSERT_THAT_EXPECTED(line_entry, llvm::Succeeded()); + bool include_inlined_functions = false; + auto range = + line_entry->GetSameLineContiguousAddressRange(include_inlined_functions); + ASSERT_EQ(range.GetByteSize(), (uint64_t)0x24); +} + +TEST_F(LineEntryTest, GetSameLineContiguousAddressRangeOneInline) { + auto line_entry = GetLineEntryForLine(18); + ASSERT_THAT_EXPECTED(line_entry, llvm::Succeeded()); + bool include_inlined_functions = true; + auto range = + line_entry->GetSameLineContiguousAddressRange(include_inlined_functions); + ASSERT_EQ(range.GetByteSize(), (uint64_t)0x49); +} + +TEST_F(LineEntryTest, GetSameLineContiguousAddressRangeNestedInline) { + auto line_entry = GetLineEntryForLine(12); + ASSERT_THAT_EXPECTED(line_entry, llvm::Succeeded()); + bool include_inlined_functions = true; + auto range = + line_entry->GetSameLineContiguousAddressRange(include_inlined_functions); + ASSERT_EQ(range.GetByteSize(), (uint64_t)0x33); +} + +/* +# inlined-functions.cpp +inline __attribute__((always_inline)) int sum2(int a, int b) { + int result = a + b; + return result; +} + +int sum3(int a, int b, int c) { + int result = a + b + c; + return result; +} + +inline __attribute__((always_inline)) int sum4(int a, int b, int c, int d) { + int result = sum2(a, b) + sum2(c, d); + result += 0; + return result; +} + +int main(int argc, char** argv) { + sum3(3, 4, 5) + sum2(1, 2); + int sum = sum4(1, 2, 3, 4); + sum2(5, 6); + return 0; +} + +// g++ -c inlined-functions.cpp -o inlined-functions.o -g -Wno-unused-value +// obj2yaml inlined-functions.o > inlined-functions.yaml + +# Dump of source line per address: +# inlined-functions.cpp is src.cpp for space considerations. +0x20: src.cpp:17 +0x21: src.cpp:17 +0x26: src.cpp:17 +0x27: src.cpp:17 +0x29: src.cpp:17 +0x2e: src.cpp:17 +0x2f: src.cpp:17 +0x31: src.cpp:17 +0x36: src.cpp:18 +0x37: src.cpp:18 +0x39: src.cpp:18 +0x3e: src.cpp:18 +0x3f: src.cpp:18 +0x41: src.cpp:18 +0x46: src.cpp:18 +0x47: src.cpp:18 +0x49: src.cpp:18 +0x4e: src.cpp:18 +0x4f: src.cpp:18 +0x51: src.cpp:18 +0x56: src.cpp:18 +0x57: src.cpp:18 +0x59: src.cpp:18 +0x5e: src.cpp:18 -> sum2@src.cpp:2 +0x5f: src.cpp:18 -> sum2@src.cpp:2 +0x61: src.cpp:18 -> sum2@src.cpp:2 +0x66: src.cpp:18 -> sum2@src.cpp:2 +0x67: src.cpp:18 -> sum2@src.cpp:2 +0x69: src.cpp:18 -> sum2@src.cpp:2 +0x6e: src.cpp:18 -> sum2@src.cpp:2 +0x6f: src.cpp:18 -> sum2@src.cpp:2 +0x71: src.cpp:18 -> sum2@src.cpp:2 +0x76: src.cpp:18 -> sum2@src.cpp:2 +0x77: src.cpp:18 -> sum2@src.cpp:2 +0x79: src.cpp:18 -> sum2@src.cpp:2 +0x7e: src.cpp:18 -> sum2@src.cpp:2 +0x7f: src.cpp:19 -> sum4@src.cpp:12 +0x81: src.cpp:19 -> sum4@src.cpp:12 +0x86: src.cpp:19 -> sum4@src.cpp:12 +0x87: src.cpp:19 -> sum4@src.cpp:12 +0x89: src.cpp:19 -> sum4@src.cpp:12 +0x8e: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:2 +0x8f: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:2 +0x91: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:2 +0x96: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:3 +0x97: src.cpp:19 -> sum4@src.cpp:12 +0x99: src.cpp:19 -> sum4@src.cpp:12 +0x9e: src.cpp:19 -> sum4@src.cpp:12 +0x9f: src.cpp:19 -> sum4@src.cpp:12 +0xa1: src.cpp:19 -> sum4@src.cpp:12 +0xa6: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:2 +0xa7: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:2 +0xa9: src.cpp:19 -> sum4@src.cpp:12 -> sum2@src.cpp:2 +0xae: src.cpp:19 -> sum4@src.cpp:12 +0xaf: src.cpp:19 -> sum4@src.cpp:12 +0xb1: src.cpp:19 -> sum4@src.cpp:12 +0xb6: src.cpp:19 -> sum4@src.cpp:13 +0xb7: src.cpp:19 -> sum4@src.cpp:13 +0xb9: src.cpp:19 -> sum4@src.cpp:14 +0xbe: src.cpp:19 +0xbf: src.cpp:19 +0xc1: src.cpp:19 +0xc6: src.cpp:19 +0xc7: src.cpp:19 +0xc9: src.cpp:19 +0xce: src.cpp:20 -> sum2@src.cpp:2 +0xcf: src.cpp:20 -> sum2@src.cpp:2 +0xd1: src.cpp:20 -> sum2@src.cpp:2 +0xd6: src.cpp:21 +0xd7: src.cpp:21 +0xd9: src.cpp:21 +0xde: src.cpp:21 +*/ diff --git a/lldb/unittests/TestingSupport/CMakeLists.txt b/lldb/unittests/TestingSupport/CMakeLists.txt --- a/lldb/unittests/TestingSupport/CMakeLists.txt +++ b/lldb/unittests/TestingSupport/CMakeLists.txt @@ -9,3 +9,6 @@ LINK_COMPONENTS Support ) + +add_dependencies(lldbUtilityHelpers yaml2obj) +add_definitions(-DYAML2OBJ="$") \ No newline at end of file diff --git a/lldb/unittests/TestingSupport/TestUtilities.h b/lldb/unittests/TestingSupport/TestUtilities.h --- a/lldb/unittests/TestingSupport/TestUtilities.h +++ b/lldb/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 diff --git a/lldb/unittests/TestingSupport/TestUtilities.cpp b/lldb/unittests/TestingSupport/TestUtilities.cpp --- a/lldb/unittests/TestingSupport/TestUtilities.cpp +++ b/lldb/unittests/TestingSupport/TestUtilities.cpp @@ -9,7 +9,9 @@ #include "TestUtilities.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" extern const char *TestMainArgv0; @@ -19,3 +21,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