[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
llvm-svn: 269181
This commit is contained in:
Sagar Thakur 2016-05-11 13:08:29 +00:00
parent 10e6cefd82
commit 477eb42f85
3 changed files with 44 additions and 8 deletions

View File

@ -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.

View File

@ -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 ()
{

View File

@ -1697,8 +1697,7 @@ ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
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(SectionHeaderColl &section_headers,
}
}
// 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);
}