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

Reply via email to