[Lldb-commits] [lldb] r269181 - [LLDB][MIPS] Setting appropriate ArchSpec::m_flags based on ABI

Sagar Thakur via lldb-commits lldb-commits at lists.llvm.org
Wed May 11 06:08:29 PDT 2016


Author: slthakur
Date: Wed May 11 08:08:29 2016
New Revision: 269181

URL: http://llvm.org/viewvc/llvm-project?rev=269181&view=rev
Log:
[LLDB][MIPS] Setting appropriate ArchSpec::m_flags based on ABI

Patch by Nitesh Jain.

Summary: The ArchSpec::m_flags will be set based on ELF flag ABI.

Reviewers: ovyalov, clayborg
Subscribers: lldb-commits, mohit.bhakkad, sagar, jaydeep, bhushan
Differential: D18858

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=269181&r1=269180&r2=269181&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/ArchSpec.h (original)
+++ lldb/trunk/include/lldb/Core/ArchSpec.h Wed May 11 08:08:29 2016
@@ -69,6 +69,9 @@ public:
         eMIPSABI_O32        = 0x00002000,
         eMIPSABI_N32        = 0x00004000,
         eMIPSABI_N64        = 0x00008000,
+        eMIPSABI_O64        = 0x00020000,
+        eMIPSABI_EABI32     = 0x00040000,
+        eMIPSABI_EABI64     = 0x00080000,
         eMIPSABI_mask       = 0x000ff000
     };
 
@@ -289,6 +292,14 @@ public:
     const char *
     GetArchitectureName () const;
 
+    //-----------------------------------------------------------------
+    /// if MIPS architecture return true.
+    ///
+    ///  @return a boolean value.
+    //-----------------------------------------------------------------
+    bool
+    IsMIPS() const;
+
     //------------------------------------------------------------------
     /// Returns a string representing current architecture as a target CPU
     /// for tools like compiler, disassembler etc.

Modified: lldb/trunk/source/Core/ArchSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ArchSpec.cpp?rev=269181&r1=269180&r2=269181&view=diff
==============================================================================
--- lldb/trunk/source/Core/ArchSpec.cpp (original)
+++ lldb/trunk/source/Core/ArchSpec.cpp Wed May 11 08:08:29 2016
@@ -507,6 +507,18 @@ ArchSpec::GetArchitectureName () const
     return "unknown";
 }
 
+bool 
+ArchSpec::IsMIPS() const
+{
+    const llvm::Triple::ArchType machine = GetMachine();
+    if(machine == llvm::Triple::mips ||
+       machine == llvm::Triple::mipsel ||
+       machine == llvm::Triple::mips64 ||
+       machine == llvm::Triple::mips64el)
+       return true;
+    return false;
+}
+
 std::string
 ArchSpec::GetClangTargetCPU ()
 {

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=269181&r1=269180&r2=269181&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Wed May 11 08:08:29 2016
@@ -1697,8 +1697,7 @@ ObjectFileELF::GetSectionHeaderInfo(Sect
 
                 I->section_name = name;
 
-                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 (arch_spec.IsMIPS())
                 {
                     uint32_t arch_flags = arch_spec.GetFlags ();
                     DataExtractor data;
@@ -1712,13 +1711,27 @@ ObjectFileELF::GetSectionHeaderInfo(Sect
                         }
                     }
                     // Settings appropriate ArchSpec ABI Flags
-                    if (header.e_flags & llvm::ELF::EF_MIPS_ABI2)
+                    switch(header.e_flags & llvm::ELF::EF_MIPS_ABI)
                     {
-                        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;
+                        case llvm::ELF::EF_MIPS_ABI_O32:
+                            arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
+                            break;
+                        case EF_MIPS_ABI_O64:
+                            arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
+                            break;
+                        case EF_MIPS_ABI_EABI32:
+                            arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
+                            break;
+                        case EF_MIPS_ABI_EABI64:
+                            arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
+                            break;
+                        default:
+                            // ABI Mask doesn't cover N32 and N64 ABI.
+                            if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
+                                arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
+                            else if (header.e_flags && llvm::ELF::EF_MIPS_ABI2)
+                                arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
+                                break;                    
                     }
                     arch_spec.SetFlags (arch_flags);
                 }




More information about the lldb-commits mailing list