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 §ion_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 §ion_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