bhushan created this revision.
bhushan added a reviewer: clayborg.
bhushan added subscribers: lldb-commits, nitesh.jain, mohit.bhakkad, sagar, 
jaydeep.
bhushan set the repository for this revision to rL LLVM.

In MIPS, an application elf can contain mixed code (mips + micromips) i.e some 
functions in the application can be "micromips" and some functions can be 
MIPS-only (non-micromips).
Micromips functions has compressed addresses (bit #0 set) and MIPS functions 
has un-compressed addresses (bit #0 clear).
Such mixed-mode elf will have micromips specific bits set in its flags. That 
means "IsMicromips" will be true even for non-micromips address.

This patch fixes this by using Address::GetAddressClass() to decide which 
address space the address belongs to (instead of deciding this from elf's 
flags).

Repository:
  rL LLVM

http://reviews.llvm.org/D13154

Files:
  source/Target/Target.cpp

Index: source/Target/Target.cpp
===================================================================
--- source/Target/Target.cpp
+++ source/Target/Target.cpp
@@ -2269,10 +2269,12 @@
         uint32_t loop_count = 0;
         Address resolved_addr;
         uint32_t arch_flags = m_arch.GetFlags ();
-        bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16;
-        bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips;
         SectionLoadList &section_load_list = GetSectionLoadList();
 
+        // Get opcode address
+        addr = GetOpcodeLoadAddress (addr, eAddressClassCode);
+        breakable_addr = addr;
+
         if (section_load_list.IsEmpty())
             // No sections are loaded, so we must assume we are not running yet
             // and need to operate only on file address.
@@ -2310,7 +2312,7 @@
         if (loop_count > 3)
         {
             // Scan previous 6 bytes
-            if (IsMips16 | IsMicromips)
+            if (resolved_addr.GetAddressClass() == 
eAddressClassCodeAlternateISA)
                 loop_count = 3;
             // For mips-only, instructions are always 4 bytes, so scan 
previous 4 bytes only.
             else


Index: source/Target/Target.cpp
===================================================================
--- source/Target/Target.cpp
+++ source/Target/Target.cpp
@@ -2269,10 +2269,12 @@
         uint32_t loop_count = 0;
         Address resolved_addr;
         uint32_t arch_flags = m_arch.GetFlags ();
-        bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16;
-        bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips;
         SectionLoadList &section_load_list = GetSectionLoadList();
 
+        // Get opcode address
+        addr = GetOpcodeLoadAddress (addr, eAddressClassCode);
+        breakable_addr = addr;
+
         if (section_load_list.IsEmpty())
             // No sections are loaded, so we must assume we are not running yet
             // and need to operate only on file address.
@@ -2310,7 +2312,7 @@
         if (loop_count > 3)
         {
             // Scan previous 6 bytes
-            if (IsMips16 | IsMicromips)
+            if (resolved_addr.GetAddressClass() == eAddressClassCodeAlternateISA)
                 loop_count = 3;
             // For mips-only, instructions are always 4 bytes, so scan previous 4 bytes only.
             else
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to