[Lldb-commits] [lldb] r258919 - [LLDB][MIPS] A small fix in GetBreakableLoadAddress() for MIPS

Hans Wennborg via lldb-commits lldb-commits at lists.llvm.org
Tue Feb 2 08:52:53 PST 2016


On Mon, Feb 1, 2016 at 9:34 AM, Hans Wennborg <hans at chromium.org> wrote:
> On Mon, Feb 1, 2016 at 2:37 AM, Bhushan Attarde
> <Bhushan.Attarde at 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-bounces at lists.llvm.org] On Behalf Of Bhushan D. Attarde via lldb-commits
>> Sent: 27 January 2016 15:47
>> To: lldb-commits at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list