[Lldb-commits] [lldb] r258919 - [LLDB][MIPS] A small fix in GetBreakableLoadAddress() for MIPS
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Wed Jan 27 10:45:19 PST 2016
Also please add `from __future__ import print_function` to the top of every
new test file you create. Sorry this didn't get caught during review, no
worries.
On Wed, Jan 27, 2016 at 10:42 AM Zachary Turner <zturner at google.com> wrote:
> Just a heads up, `isinstance(foo, basestring)` doesn't work in Python 3.
> You need to use `isinstance(foo, six.string_types)`. I'm checking in a fix
> for this, but just wanted to let you know so you can keep this in the back
> of your head for future.
>
> On Wed, Jan 27, 2016 at 2:20 AM Bhushan D. Attarde via lldb-commits <
> lldb-commits at lists.llvm.org> wrote:
>
>> 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160127/aefc8046/attachment-0001.html>
More information about the lldb-commits
mailing list