forked from OSchip/llvm-project
[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:
parent
10e6cefd82
commit
477eb42f85
|
@ -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.
|
||||
|
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
@ -1697,8 +1697,7 @@ ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_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 §ion_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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue