[lldb-dev] [PATCH] Dealing with CPU subtypes (architecture variants)
Todd Fiala
tfiala at google.com
Tue Aug 26 08:32:36 PDT 2014
> So I've written a specific routine which extracts the variant spec from
the e_flags. What I'm not too happy about, and would appreciate lldb-dev's
opinion on, is if it is ok for the extraction routine
(kalimbaVariantFromElfFlags) to remain in ObjectFileELF.cpp?
Currently we have Linux/*BSD detection logic (i.e. OS detection code)
within ObjectFileELF. Based on that precedent, I think having
cpu_arch-specific detection in ObjectFileELF is fine. We could abstract
that all and register them somehow to separate them out, but at this point
I don't think the extra complexity is worth it. We can always revisit
later.
On Tue, Aug 26, 2014 at 8:14 AM, Todd Fiala <tfiala at google.com> wrote:
> > Furthermore how do I get any new files into the xcode project file,
> given that I have no xcode system - shall I just change the make and cmake
> build and rely on an Apple person to fix any xcode build breakage?
>
> That's correct. One of the community will fix it up. Enough of us build
> with enough build systems that I'm sure we'll catch it relatively quickly.
> (We ultimately expect build bots to catch these but we are still having to
> do this "manually" while we get that together).
>
>
> On Tue, Aug 26, 2014 at 5:56 AM, Matthew Gardiner <mg11 at csr.com> wrote:
>
>> Hi folks,
>>
>> The kalimba architecture has a number of variants. The ones of interest
>> to me being 3, 4 and 5. I have added some additional entries to the
>> g_elf_arch_entries to describe these variants. However, up until now, no
>> subtypes (architecture variants), for ELF objectfiles exist in lldb. So
>> I've found it necessary to modify the invocation of
>> ArchSpec.SetArchitecture from ObjectFileELF to deal with this.
>>
>> Now the kalimba variant specification can be deduced by parsing the
>> e_flags field from the ELF header. So I've written a specific routine which
>> extracts the variant spec from the e_flags. What I'm not too happy about,
>> and would appreciate lldb-dev's opinion on, is if it is ok for the
>> extraction routine (kalimbaVariantFromElfFlags) to remain in
>> ObjectFileELF.cpp? If not, where should the routine go? Furthermore how do
>> I get any new files into the xcode project file, given that I have no xcode
>> system - shall I just change the make and cmake build and rely on an Apple
>> person to fix any xcode build breakage?
>>
>> Below is a diff of what I have done recognize kalimba variants, basically:
>>
>> 1. add new entries to ArchSpec::enum Core, and g_elf_arch_entries
>> 2. supply routine to extract the kalimba variant from the e_flags
>> 3. if e_machine == EM_CSR_KALIMBA, extract the kalimba variant and pass
>> it to SetArchitecture as the cpu sub type.
>>
>> --- a/include/lldb/Core/ArchSpec.h 2014-08-18
>> +++ b/include/lldb/Core/ArchSpec.h 2014-08-18
>> @@ -103,6 +103,9 @@
>> eCore_uknownMach64,
>>
>> eCore_kalimba,
>> + eCore_kalimba3,
>> + eCore_kalimba4,
>> + eCore_kalimba5,
>>
>> kNumCores,
>>
>> --- a/source/Core/ArchSpec.cpp 2014-08-05
>> +++ b/source/Core/ArchSpec.cpp 2014-08-05
>> @@ -115,7 +115,10 @@
>> { eByteOrderLittle, 4, 4, 4 , llvm::Triple::UnknownArch ,
>> ArchSpec::eCore_uknownMach32 , "unknown-mach-32" },
>> { eByteOrderLittle, 8, 4, 4 , llvm::Triple::UnknownArch ,
>> ArchSpec::eCore_uknownMach64 , "unknown-mach-64" },
>>
>> - { eByteOrderLittle, 4, 1, 1 , llvm::Triple::kalimba ,
>> ArchSpec::eCore_kalimba , "kalimba" }
>> + { eByteOrderLittle, 4, 1, 1 , llvm::Triple::kalimba ,
>> ArchSpec::eCore_kalimba , "kalimba" },
>> + { eByteOrderLittle, 4, 1, 1 , llvm::Triple::kalimba ,
>> ArchSpec::eCore_kalimba3 , "kalimba3" },
>> + { eByteOrderLittle, 4, 1, 1 , llvm::Triple::kalimba ,
>> ArchSpec::eCore_kalimba4 , "kalimba4" },
>> + { eByteOrderLittle, 4, 1, 1 , llvm::Triple::kalimba ,
>> ArchSpec::eCore_kalimba5 , "kalimba5" }
>> };
>>
>> // Ensure that we have an entry in the g_core_definitions for each core.
>> If you comment out an entry above,
>> @@ -257,7 +260,10 @@
>> { ArchSpec::eCore_x86_64_x86_64 , llvm::ELF::EM_X86_64 ,
>> LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // AMD64
>> { ArchSpec::eCore_mips64 , llvm::ELF::EM_MIPS ,
>> LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // MIPS
>> { ArchSpec::eCore_hexagon_generic , llvm::ELF::EM_HEXAGON,
>> LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // HEXAGON
>> - { ArchSpec::eCore_kalimba , llvm::ELF::EM_CSR_KALIMBA,
>> LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu } // KALIMBA
>> + { ArchSpec::eCore_kalimba , llvm::ELF::EM_CSR_KALIMBA,
>> LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // KALIMBA
>> + { ArchSpec::eCore_kalimba3 , llvm::ELF::EM_CSR_KALIMBA, 3,
>> 0xFFFFFFFFu, 0xFFFFFFFFu }, // KALIMBA
>> + { ArchSpec::eCore_kalimba4 , llvm::ELF::EM_CSR_KALIMBA, 4,
>> 0xFFFFFFFFu, 0xFFFFFFFFu }, // KALIMBA
>> + { ArchSpec::eCore_kalimba5 , llvm::ELF::EM_CSR_KALIMBA, 5,
>> 0xFFFFFFFFu, 0xFFFFFFFFu } // KALIMBA
>>
>> };
>>
>> --- a/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp 2014-07-22
>> +++ b/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp 2014-07-22
>> @@ -257,6 +257,27 @@
>> 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;
>> +}
>> +
>> +
>> // Arbitrary constant used as UUID prefix for core files.
>> const uint32_t
>> ObjectFileELF::g_core_uuid_magic(0xE210C);
>> @@ -544,9 +565,15 @@
>> {
>> ModuleSpec spec;
>> spec.GetFileSpec() = file;
>> +
>> + const uint32_t sub_type =
>> + llvm::ELF::EM_CSR_KALIMBA == header.e_machine ?
>> + kalimbaVariantFromElfFlags(header.e_flags) :
>> + LLDB_INVALID_CPUTYPE;
>> spec.GetArchitecture().SetArchitecture(eArchTypeELF,
>> header.e_machine,
>> - LLDB_INVALID_CPUTYPE);
>> + sub_type);
>> +
>> if (spec.GetArchitecture().IsValid())
>> {
>> llvm::Triple::OSType ostype;
>> @@ -1269,7 +1296,12 @@
>> // 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 =
>> + llvm::ELF::EM_CSR_KALIMBA == header.e_machine ?
>> + kalimbaVariantFromElfFlags(header.e_flags) :
>> + LLDB_INVALID_CPUTYPE;
>> + arch_spec.SetArchitecture (eArchTypeELF, header.e_machine,
>> sub_type);
>> +
>> switch (arch_spec.GetAddressByteSize())
>> {
>> case 4:
>>
>> I'd appreciate people's opinion on this diff, before I commit anything.
>> (The reason I need to know the variant type, is because some kalimba
>> variants have a different notion of "byte-size" i.e. minimum addressable
>> unit. For example for kalimba3 the minimum addressable unit from the data
>> bus is 24-bits, whereas for kalimba4 it is the more conventional 8-bits.
>> I'd like to reserve the problems/challenges this presents for me, regarding
>> my kalimba lldb port, to a future email).
>>
>> thanks
>> Matt
>>
>>
>> Member of the CSR plc group of companies. CSR plc registered in England
>> and Wales, registered number 4187346, registered office Churchill House,
>> Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom
>> More information can be found at www.csr.com. Keep up to date with CSR
>> on our technical blog, www.csr.com/blog, CSR people blog,
>> www.csr.com/people, YouTube, www.youtube.com/user/CSRplc, Facebook,
>> www.facebook.com/pages/CSR/191038434253534, or follow us on Twitter at
>> www.twitter.com/CSR_plc.
>> New for 2014, you can now access the wide range of products powered by
>> aptX at www.aptx.com.
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>>
>
>
>
> --
> Todd Fiala | Software Engineer | tfiala at google.com | 650-943-3180
>
--
Todd Fiala | Software Engineer | tfiala at google.com | 650-943-3180
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20140826/cc0c4787/attachment.html>
More information about the lldb-dev
mailing list