[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:42:13 PST 2016


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/a63c8606/attachment-0001.html>


More information about the lldb-commits mailing list