diff options
author | Matthew Gardiner <mg11@csr.com> | 2014-08-27 12:09:39 +0000 |
---|---|---|
committer | Matthew Gardiner <mg11@csr.com> | 2014-08-27 12:09:39 +0000 |
commit | 5f67579f69b5c2f7d7bc5b01f3cb5603f372f262 (patch) | |
tree | 85cf7acb51a805504b259d067394a9187b07c05e /lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | |
parent | 168c8aa6795e2ae2d1f7655192aa2b64dc9cc273 (diff) | |
download | bcm5719-llvm-5f67579f69b5c2f7d7bc5b01f3cb5603f372f262.tar.gz bcm5719-llvm-5f67579f69b5c2f7d7bc5b01f3cb5603f372f262.zip |
Add support for kalimba architecture variants 3, 4 and 5.
Add entries to core_definitions and elf_arch_entries for
those variants. Select the subtype for the variant by parsing
the e_flags field of the elf header.
llvm-svn: 216541
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 946557060e2..d86aee78947 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -258,6 +258,35 @@ ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) return true; } +static uint32_t +kalimbaVariantFromElfFlags(const elf::elf_word e_flags) +{ + const uint32_t dsp_rev = e_flags & 0xFF; + uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE; + switch(dsp_rev) + { + // TODO(mg11) Support more variants + case 10: + kal_arch_variant = 3; + break; + case 14: + kal_arch_variant = 4; + break; + default: + break; + } + return kal_arch_variant; +} + +static uint32_t +subTypeFromElfHeader(const elf::ELFHeader& header) +{ + return + llvm::ELF::EM_CSR_KALIMBA == header.e_machine ? + kalimbaVariantFromElfFlags(header.e_flags) : + LLDB_INVALID_CPUTYPE; +} + // Arbitrary constant used as UUID prefix for core files. const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C); @@ -545,9 +574,12 @@ ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file, { ModuleSpec spec; spec.GetFileSpec() = file; + + const uint32_t sub_type = subTypeFromElfHeader(header); spec.GetArchitecture().SetArchitecture(eArchTypeELF, header.e_machine, - LLDB_INVALID_CPUTYPE); + sub_type); + if (spec.GetArchitecture().IsValid()) { llvm::Triple::OSType ostype; @@ -1270,7 +1302,9 @@ ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers, // We'll refine this with note data as we parse the notes. if (arch_spec.GetTriple ().getOS () == llvm::Triple::OSType::UnknownOS) { - arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, LLDB_INVALID_CPUTYPE); + const uint32_t sub_type = subTypeFromElfHeader(header); + arch_spec.SetArchitecture (eArchTypeELF, header.e_machine, sub_type); + switch (arch_spec.GetAddressByteSize()) { case 4: |