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? Thanks, Hans > -----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