On Mon, Feb 1, 2016 at 9:34 AM, Hans Wennborg <h...@chromium.org> wrote: > On Mon, Feb 1, 2016 at 2:37 AM, Bhushan Attarde > <bhushan.atta...@imgtec.com> wrote: >> Hi Hans, >> >> Could you please add this (r258919) to the release branch? >> Also commit r258967 (on top of this) by Zachary which fixes some python 3 >> incompatibilities. > > Since this touched more than just MIPS-specific files, I'd like Greg > to approve it for the branch. > > Greg, is this OK for 3.8?
As per Greg's earlier email [1] about non-ARM or x86 patches, I'll just go ahead and merge this. r259523. Thanks, Hans [1] http://lists.llvm.org/pipermail/lldb-commits/Week-of-Mon-20160201/027147.html >> -----Original Message----- >> From: lldb-commits [mailto:lldb-commits-boun...@lists.llvm.org] On Behalf Of >> Bhushan D. Attarde via lldb-commits >> Sent: 27 January 2016 15:47 >> To: lldb-commits@lists.llvm.org >> Subject: [Lldb-commits] [lldb] r258919 - [LLDB][MIPS] A small fix in >> GetBreakableLoadAddress() for MIPS >> >> Author: bhushan.attarde >> Date: Wed Jan 27 04:16:30 2016 >> New Revision: 258919 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=258919&view=rev >> Log: >> [LLDB][MIPS] A small fix in GetBreakableLoadAddress() for MIPS >> >> SUMMARY: >> Get the load address for the address given by symbol and function. >> Earlier, this was done for function only, this patch does it for symbol >> too. >> This patch also adds TestAvoidBreakpointInDelaySlot.py to test this >> change. >> >> Reviewers: clayborg >> Subscribers: labath, zturner, mohit.bhakkad, sagar, jaydeep, lldb-commits >> Differential Revision: http://reviews.llvm.org/D16049 >> >> Added: >> >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/ >> >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/Makefile >> >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/TestAvoidBreakpointInDelaySlot.py >> >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/main.c >> Modified: >> lldb/trunk/include/lldb/API/SBInstruction.h >> lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py >> lldb/trunk/scripts/interface/SBInstruction.i >> lldb/trunk/source/API/SBInstruction.cpp >> lldb/trunk/source/Target/Target.cpp >> >> Modified: lldb/trunk/include/lldb/API/SBInstruction.h >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBInstruction.h?rev=258919&r1=258918&r2=258919&view=diff >> ============================================================================== >> --- lldb/trunk/include/lldb/API/SBInstruction.h (original) >> +++ lldb/trunk/include/lldb/API/SBInstruction.h Wed Jan 27 04:16:30 2016 >> @@ -60,6 +60,9 @@ public: >> bool >> DoesBranch (); >> >> + bool >> + HasDelaySlot (); >> + >> void >> Print (FILE *out); >> >> >> Added: >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/Makefile >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/Makefile?rev=258919&view=auto >> ============================================================================== >> --- >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/Makefile >> (added) >> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint >> +++ /breakpoint_in_delayslot/Makefile Wed Jan 27 04:16:30 2016 >> @@ -0,0 +1,6 @@ >> +LEVEL = ../../../make >> + >> +C_SOURCES := main.c >> + >> +include $(LEVEL)/Makefile.rules >> + >> >> Added: >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/TestAvoidBreakpointInDelaySlot.py >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/TestAvoidBreakpointInDelaySlot.py?rev=258919&view=auto >> ============================================================================== >> --- >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/TestAvoidBreakpointInDelaySlot.py >> (added) >> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint >> +++ /breakpoint_in_delayslot/TestAvoidBreakpointInDelaySlot.py Wed Jan >> +++ 27 04:16:30 2016 >> @@ -0,0 +1,82 @@ >> +""" >> +Test specific to MIPS >> +""" >> + >> +import os, time >> +import re >> +import unittest2 >> +import lldb >> +import lldbsuite.test.lldbutil as lldbutil from lldbsuite.test.lldbtest >> +import * >> + >> +class AvoidBreakpointInDelaySlotAPITestCase(TestBase): >> + >> + mydir = TestBase.compute_mydir(__file__) >> + >> + @skipUnlessArch(archs=re.compile('mips*')) >> + def test(self): >> + self.build() >> + exe = os.path.join(os.getcwd(), "a.out") >> + self.expect("file " + exe, >> + patterns = [ "Current executable set to .*a.out.*" >> + ]) >> + >> + # Create a target by the debugger. >> + target = self.dbg.CreateTarget(exe) >> + self.assertTrue(target, VALID_TARGET) >> + >> + breakpoint = target.BreakpointCreateByName('main', 'a.out') >> + self.assertTrue(breakpoint and >> + breakpoint.GetNumLocations() == 1, >> + VALID_BREAKPOINT) >> + >> + # Now launch the process, and do not stop at entry point. >> + process = target.LaunchSimple (None, None, >> self.get_process_working_directory()) >> + self.assertTrue(process, PROCESS_IS_VALID) >> + >> + list = target.FindFunctions('foo', lldb.eFunctionNameTypeAuto) >> + self.assertTrue(list.GetSize() == 1) >> + sc = list.GetContextAtIndex(0) >> + self.assertTrue(sc.GetSymbol().GetName() == "foo") >> + function = sc.GetFunction() >> + self.assertTrue(function) >> + self.function(function, target) >> + >> + def function (self, function, target): >> + """Iterate over instructions in function and place a breakpoint on >> delay slot instruction""" >> + # Get the list of all instructions in the function >> + insts = function.GetInstructions(target) >> + print insts >> + i = 0 >> + for inst in insts: >> + if (inst.HasDelaySlot()): >> + # Remember the address of branch instruction. >> + branchinstaddress = >> + inst.GetAddress().GetLoadAddress(target) >> + >> + # Get next instruction i.e delay slot instruction. >> + delayinst = insts.GetInstructionAtIndex(i+1) >> + delayinstaddr = >> + delayinst.GetAddress().GetLoadAddress(target) >> + >> + # Set breakpoint on delay slot instruction >> + breakpoint = >> + target.BreakpointCreateByAddress(delayinstaddr) >> + >> + # Verify the breakpoint. >> + self.assertTrue(breakpoint and >> + breakpoint.GetNumLocations() == 1, >> + VALID_BREAKPOINT) >> + # Get the location from breakpoint >> + location = breakpoint.GetLocationAtIndex(0) >> + >> + # Get the address where breakpoint is actually set. >> + bpaddr = location.GetLoadAddress() >> + >> + # Breakpoint address should be adjusted to the address of >> branch instruction. >> + self.assertTrue(branchinstaddress == bpaddr) >> + i += 1 >> + else: >> + i += 1 >> + >> +if __name__ == '__main__': >> + import atexit >> + lldb.SBDebugger.Initialize() >> + atexit.register(lambda: lldb.SBDebugger.Terminate()) >> + unittest2.main() >> >> Added: >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/main.c >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/main.c?rev=258919&view=auto >> ============================================================================== >> --- >> lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_in_delayslot/main.c >> (added) >> +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/breakpoint >> +++ /breakpoint_in_delayslot/main.c Wed Jan 27 04:16:30 2016 >> @@ -0,0 +1,21 @@ >> +#include <stdio.h> >> + >> +foo (int a, int b) >> +{ >> + int c; >> + if (a<=b) >> + c=b-a; >> + else >> + c=b+a; >> + return c; >> +} >> + >> +int main() >> +{ >> + int a=7, b=8, c; >> + >> + c = foo(a, b); >> + >> +return 0; >> +} >> + >> >> Modified: lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py?rev=258919&r1=258918&r2=258919&view=diff >> ============================================================================== >> --- lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py (original) >> +++ lldb/trunk/packages/Python/lldbsuite/test/lldbtest.py Wed Jan 27 >> +++ 04:16:30 2016 >> @@ -636,6 +636,14 @@ def check_list_or_lambda(list_or_lambda, >> else: >> return list_or_lambda is None or value is None or list_or_lambda == >> value >> >> +def matchArchitectures(archs, actual_arch): >> + retype = type(re.compile('hello, world')) >> + list_passes = isinstance(archs, list) and actual_arch in archs >> + basestring_passes = isinstance(archs, basestring) and actual_arch == >> archs >> + regex_passes = isinstance(archs, retype) and re.match(archs, >> +actual_arch) >> + >> + return (list_passes or basestring_passes or regex_passes) >> + >> # provide a function to xfail on defined oslist, compiler version, and >> archs # if none is specified for any argument, that argument won't be >> checked and thus means for all # for example, @@ -1029,7 +1037,7 @@ def >> skipUnlessHostPlatform(oslist): >> return unittest2.skipUnless(getHostPlatform() in oslist, >> "requires on of %s" % (", ".join(oslist))) >> >> -def skipUnlessArch(archlist): >> +def skipUnlessArch(archs): >> """Decorate the item to skip tests unless running on one of the listed >> architectures.""" >> def myImpl(func): >> if isinstance(func, type) and issubclass(func, unittest2.TestCase): >> @@ -1038,9 +1046,8 @@ def skipUnlessArch(archlist): >> @wraps(func) >> def wrapper(*args, **kwargs): >> self = args[0] >> - if self.getArchitecture() not in archlist: >> - self.skipTest("skipping for architecture %s (requires one >> of %s)" % >> - (self.getArchitecture(), ", ".join(archlist))) >> + if not matchArchitectures(archs, self.getArchitecture()): >> + self.skipTest("skipping for architecture %s" % >> + (self.getArchitecture())) >> else: >> func(*args, **kwargs) >> return wrapper >> >> Modified: lldb/trunk/scripts/interface/SBInstruction.i >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBInstruction.i?rev=258919&r1=258918&r2=258919&view=diff >> ============================================================================== >> --- lldb/trunk/scripts/interface/SBInstruction.i (original) >> +++ lldb/trunk/scripts/interface/SBInstruction.i Wed Jan 27 04:16:30 >> +++ 2016 >> @@ -51,6 +51,9 @@ public: >> bool >> DoesBranch (); >> >> + bool >> + HasDelaySlot (); >> + >> void >> Print (FILE *out); >> >> >> Modified: lldb/trunk/source/API/SBInstruction.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBInstruction.cpp?rev=258919&r1=258918&r2=258919&view=diff >> ============================================================================== >> --- lldb/trunk/source/API/SBInstruction.cpp (original) >> +++ lldb/trunk/source/API/SBInstruction.cpp Wed Jan 27 04:16:30 2016 >> @@ -160,6 +160,14 @@ SBInstruction::DoesBranch () >> return false; >> } >> >> +bool >> +SBInstruction::HasDelaySlot () >> +{ >> + if (m_opaque_sp) >> + return m_opaque_sp->HasDelaySlot (); >> + return false; >> +} >> + >> void >> SBInstruction::SetOpaque (const lldb::InstructionSP &inst_sp) { >> >> Modified: lldb/trunk/source/Target/Target.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=258919&r1=258918&r2=258919&view=diff >> ============================================================================== >> --- lldb/trunk/source/Target/Target.cpp (original) >> +++ lldb/trunk/source/Target/Target.cpp Wed Jan 27 04:16:30 2016 >> @@ -2442,18 +2442,18 @@ Target::GetBreakableLoadAddress (lldb::a >> SymbolContext sc; >> uint32_t resolve_scope = eSymbolContextFunction | >> eSymbolContextSymbol; >> >> temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, >> resolve_scope, sc); >> + Address sym_addr; >> if (sc.function) >> - { >> - function_start = >> sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress(this); >> - if (function_start == LLDB_INVALID_ADDRESS) >> - function_start = >> sc.function->GetAddressRange().GetBaseAddress().GetFileAddress(); >> - } >> + sym_addr = >> + sc.function->GetAddressRange().GetBaseAddress(); >> else if (sc.symbol) >> - { >> - Address sym_addr = sc.symbol->GetAddress(); >> + sym_addr = sc.symbol->GetAddress(); >> + >> + function_start = sym_addr.GetLoadAddress(this); >> + if (function_start == LLDB_INVALID_ADDRESS) >> function_start = sym_addr.GetFileAddress(); >> - } >> - current_offset = addr - function_start; >> + >> + if (function_start) >> + current_offset = addr - function_start; >> } >> >> // If breakpoint address is start of function then we dont have to >> do anything. >> >> >> _______________________________________________ >> lldb-commits mailing list >> lldb-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits