From ae3f793e9e19ca36192a8161c69dee32c037e7a8 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Mon, 10 Sep 2018 23:09:09 +0000 Subject: [PATCH] Rollback "Fix raw address breakpoints not resolving". It broke a bunch of bots. Ted confirmed, but can't revert for now so I'm reverting on his behalf. llvm-svn: 341878 --- lldb/include/lldb/Core/Address.h | 19 ++++++++--- .../address_breakpoints/TestAddressBreakpoints.py | 37 ---------------------- lldb/source/Breakpoint/Breakpoint.cpp | 2 +- lldb/source/Core/Address.cpp | 10 ++++-- 4 files changed, 23 insertions(+), 45 deletions(-) diff --git a/lldb/include/lldb/Core/Address.h b/lldb/include/lldb/Core/Address.h index 2692421..617aaef 100644 --- a/lldb/include/lldb/Core/Address.h +++ b/lldb/include/lldb/Core/Address.h @@ -525,11 +525,11 @@ public: bool CalculateSymbolContextLineEntry(LineEntry &line_entry) const; //------------------------------------------------------------------ - // Returns true if the m_section_wp once had a reference to a valid section - // shared pointer, but no longer does. This can happen if we have an address - // from a module that gets unloaded and deleted. This function should only be - // called if GetSection() returns an empty shared pointer and you want to - // know if this address used to have a valid section. + // Returns true if the section should be valid, but isn't because the shared + // pointer to the section can't be reconstructed from a weak pointer that + // contains a valid weak reference to a section. Returns false if the section + // weak pointer has no reference to a section, or if the section is still + // valid //------------------------------------------------------------------ bool SectionWasDeleted() const; @@ -539,6 +539,15 @@ protected: //------------------------------------------------------------------ lldb::SectionWP m_section_wp; ///< The section for the address, can be NULL. lldb::addr_t m_offset; ///< Offset into section if \a m_section_wp is valid... + + //------------------------------------------------------------------ + // Returns true if the m_section_wp once had a reference to a valid section + // shared pointer, but no longer does. This can happen if we have an address + // from a module that gets unloaded and deleted. This function should only be + // called if GetSection() returns an empty shared pointer and you want to + // know if this address used to have a valid section. + //------------------------------------------------------------------ + bool SectionWasDeletedPrivate() const; }; //---------------------------------------------------------------------- diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py index 5d77802..46191d8 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/address_breakpoints/TestAddressBreakpoints.py @@ -97,40 +97,3 @@ class AddressBreakpointTestCase(TestBase): # The hit count for the breakpoint should now be 2. self.assertTrue(breakpoint.GetHitCount() == 2) - - - - def test_address_breakpoint_set_before_launch(self): - """Test that an address bp set before the process is launched works correctly.""" - self.build() - - exe = self.getBuildArtifact("a.out") - - # Create a target by the debugger. - target = self.dbg.CreateTarget(exe) - self.assertTrue(target, VALID_TARGET) - - # get the address of the symbol "main" - sc_list = target.FindSymbols("main", lldb.eSymbolTypeCode) - symbol = sc_list.GetContextAtIndex(0).GetSymbol() - address = symbol.GetStartAddress().GetFileAddress() - - # BreakpointCreateBySBAddress will resolve the address, causing this - # test to always pass, so use runCmd - self.runCmd("break set -a " + str(address)) - - # Disable ASLR. This will allow us to actually test (on platforms that support this flag) - # that the breakpoint was able to track the module. - - launch_info = lldb.SBLaunchInfo(None) - flags = launch_info.GetLaunchFlags() - flags &= ~lldb.eLaunchFlagDisableASLR - launch_info.SetLaunchFlags(flags) - - error = lldb.SBError() - - process = target.Launch(launch_info, error) - self.assertTrue(process, PROCESS_IS_VALID) - self.expect("process status", STOPPED_DUE_TO_BREAKPOINT, - substrs=["stop reason = breakpoint 1.1"]) - diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp index bdeda4f..1dc0296 100644 --- a/lldb/source/Breakpoint/Breakpoint.cpp +++ b/lldb/source/Breakpoint/Breakpoint.cpp @@ -555,7 +555,7 @@ void Breakpoint::ModulesChanged(ModuleList &module_list, bool load, // address that we haven't resolved to a section yet. So we'll have to // look in all the new modules to resolve this location. Otherwise, if // it was set in this module, re-resolve it here. - if (!section_sp || section_sp->GetModule() == module_sp) { + if (section_sp && section_sp->GetModule() == module_sp) { if (!seen) seen = true; diff --git a/lldb/source/Core/Address.cpp b/lldb/source/Core/Address.cpp index eb54278..f183245 100644 --- a/lldb/source/Core/Address.cpp +++ b/lldb/source/Core/Address.cpp @@ -281,7 +281,7 @@ addr_t Address::GetFileAddress() const { // We have a valid file range, so we can return the file based address by // adding the file base address to our offset return sect_file_addr + m_offset; - } else if (SectionWasDeleted()) { + } else if (SectionWasDeletedPrivate()) { // Used to have a valid section but it got deleted so the offset doesn't // mean anything without the section return LLDB_INVALID_ADDRESS; @@ -302,7 +302,7 @@ addr_t Address::GetLoadAddress(Target *target) const { return sect_load_addr + m_offset; } } - } else if (SectionWasDeleted()) { + } else if (SectionWasDeletedPrivate()) { // Used to have a valid section but it got deleted so the offset doesn't // mean anything without the section return LLDB_INVALID_ADDRESS; @@ -761,6 +761,12 @@ bool Address::Dump(Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, } bool Address::SectionWasDeleted() const { + if (GetSection()) + return false; + return SectionWasDeletedPrivate(); +} + +bool Address::SectionWasDeletedPrivate() const { lldb::SectionWP empty_section_wp; // If either call to "std::weak_ptr::owner_before(...) value returns true, -- 2.7.4