Author: mohit.bhakkad Date: Wed Sep 9 05:32:20 2015 New Revision: 247134 URL: http://llvm.org/viewvc/llvm-project?rev=247134&view=rev Log: [LLDB][MIPS] Added support for the debugging of N32/O32 applications on MIPS64 target. Patch by Nitesh Jain
Reviewers: clayborg, ovyalov. Subscribers: jaydeep, bhushan, mohit.bhakkad, sagar, nitesh.jain, lldb-commits. Differential Revision: http://reviews.llvm.org/D12671 Modified: lldb/trunk/include/lldb/Core/ArchSpec.h lldb/trunk/source/Core/ArchSpec.cpp lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Modified: lldb/trunk/include/lldb/Core/ArchSpec.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ArchSpec.h?rev=247134&r1=247133&r2=247134&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ArchSpec.h (original) +++ lldb/trunk/include/lldb/Core/ArchSpec.h Wed Sep 9 05:32:20 2015 @@ -65,7 +65,11 @@ public: eMIPSAse_mips16 = 0x00000400, // MIPS16 ASE eMIPSAse_micromips = 0x00000800, // MICROMIPS ASE eMIPSAse_xpa = 0x00001000, // XPA ASE - eMIPSAse_mask = 0x00001fff + eMIPSAse_mask = 0x00001fff, + eMIPSABI_O32 = 0x00002000, + eMIPSABI_N32 = 0x00004000, + eMIPSABI_N64 = 0x00008000, + eMIPSABI_mask = 0x000ff000 }; enum Core Modified: lldb/trunk/source/Core/ArchSpec.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ArchSpec.cpp?rev=247134&r1=247133&r2=247134&view=diff ============================================================================== --- lldb/trunk/source/Core/ArchSpec.cpp (original) +++ lldb/trunk/source/Core/ArchSpec.cpp Wed Sep 9 05:32:20 2015 @@ -602,7 +602,15 @@ ArchSpec::GetAddressByteSize() const { const CoreDefinition *core_def = FindCoreDefinition (m_core); if (core_def) - return core_def->addr_byte_size; + { + if (core_def->machine == llvm::Triple::mips64 || core_def->machine == llvm::Triple::mips64el) + { + // For N32/O32 applications Address size is 4 bytes. + if (m_flags & (eMIPSABI_N32 | eMIPSABI_O32)) + return 4; + } + return core_def->addr_byte_size; + } return 0; } Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=247134&r1=247133&r2=247134&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Wed Sep 9 05:32:20 2015 @@ -1517,8 +1517,8 @@ ObjectFileELF::GetSectionHeaderInfo(Sect I != section_headers.end(); ++I) { static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink"); - const ELFSectionHeaderInfo &header = *I; - const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size; + const ELFSectionHeaderInfo &sheader = *I; + const uint64_t section_size = sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size; ConstString name(shstr_data.PeekCStr(I->sh_name)); I->section_name = name; @@ -1526,23 +1526,33 @@ ObjectFileELF::GetSectionHeaderInfo(Sect if (arch_spec.GetMachine() == llvm::Triple::mips || arch_spec.GetMachine() == llvm::Triple::mipsel || arch_spec.GetMachine() == llvm::Triple::mips64 || arch_spec.GetMachine() == llvm::Triple::mips64el) { - if (header.sh_type == SHT_MIPS_ABIFLAGS) + uint32_t arch_flags = arch_spec.GetFlags (); + DataExtractor data; + if (sheader.sh_type == SHT_MIPS_ABIFLAGS) { - DataExtractor data; - if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) + + if (section_size && (data.SetData (object_data, sheader.sh_offset, section_size) == section_size)) { lldb::offset_t ase_offset = 12; // MIPS ABI Flags Version: 0 - uint32_t arch_flags = arch_spec.GetFlags (); arch_flags |= data.GetU32 (&ase_offset); - arch_spec.SetFlags (arch_flags); } } + // Settings appropriate ArchSpec ABI Flags + if (header.e_flags & llvm::ELF::EF_MIPS_ABI2) + { + arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32; + } + else if (header.e_flags & llvm::ELF::EF_MIPS_ABI_O32) + { + arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32; + } + arch_spec.SetFlags (arch_flags); } if (name == g_sect_name_gnu_debuglink) { DataExtractor data; - if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) + if (section_size && (data.SetData (object_data, sheader.sh_offset, section_size) == section_size)) { lldb::offset_t gnu_debuglink_offset = 0; gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset); @@ -1552,7 +1562,7 @@ ObjectFileELF::GetSectionHeaderInfo(Sect } // Process ELF note section entries. - bool is_note_header = (header.sh_type == SHT_NOTE); + bool is_note_header = (sheader.sh_type == SHT_NOTE); // The section header ".note.android.ident" is stored as a // PROGBITS type header but it is actually a note header. @@ -1564,7 +1574,7 @@ ObjectFileELF::GetSectionHeaderInfo(Sect { // Allow notes to refine module info. DataExtractor data; - if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) + if (section_size && (data.SetData (object_data, sheader.sh_offset, section_size) == section_size)) { Error error = RefineModuleDetailsFromNote (data, arch_spec, uuid); if (error.Fail ()) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits