diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2015-05-26 08:48:14 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2015-05-26 08:48:14 +0000 |
commit | 9af978195458682d681901a952c9a87a8646fa68 (patch) | |
tree | 49e97774302369ffe0fa2525a358834dd3d49bb9 | |
parent | f58341c6eea59a500b59c7ecec270c1cd8ef0e5c (diff) | |
download | bcm5719-llvm-9af978195458682d681901a952c9a87a8646fa68.tar.gz bcm5719-llvm-9af978195458682d681901a952c9a87a8646fa68.zip |
[mips] Move some structures represent MIPS specific ELF sections from LLD to LLVM
That allows to reuse the code in other tools like llvm-readobj etc.
No functional changes.
llvm-svn: 238188
-rw-r--r-- | llvm/include/llvm/Object/ELFTypes.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/include/llvm/Object/ELFTypes.h b/llvm/include/llvm/Object/ELFTypes.h index 1952b9480d0..287d3670678 100644 --- a/llvm/include/llvm/Object/ELFTypes.h +++ b/llvm/include/llvm/Object/ELFTypes.h @@ -489,6 +489,43 @@ struct Elf_Phdr_Impl<ELFType<TargetEndianness, MaxAlign, true> > { Elf_Xword p_align; // Segment alignment constraint }; +// MIPS .reginfo section +template <class ELFT> +struct Elf_Mips_RegInfo; + +template <llvm::support::endianness TargetEndianness, std::size_t MaxAlign> +struct Elf_Mips_RegInfo<ELFType<TargetEndianness, MaxAlign, false>> { + LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, false) + Elf_Word ri_gprmask; // bit-mask of used general registers + Elf_Word ri_cprmask[4]; // bit-mask of used co-processor registers + Elf_Addr ri_gp_value; // gp register value +}; + +template <llvm::support::endianness TargetEndianness, std::size_t MaxAlign> +struct Elf_Mips_RegInfo<ELFType<TargetEndianness, MaxAlign, true>> { + LLVM_ELF_IMPORT_TYPES(TargetEndianness, MaxAlign, true) + Elf_Word ri_gprmask; // bit-mask of used general registers + Elf_Word ri_pad; // unused padding field + Elf_Word ri_cprmask[4]; // bit-mask of used co-processor registers + Elf_Addr ri_gp_value; // gp register value +}; + +// .MIPS.options section +template <class ELFT> struct Elf_Mips_Options { + LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) + uint8_t kind; // Determines interpretation of variable part of descriptor + uint8_t size; // Byte size of descriptor, including this header + Elf_Half section; // Section header index of section affected, + // or 0 for global options + Elf_Word info; // Kind-specific information + + const Elf_Mips_RegInfo<ELFT> &getRegInfo() const { + assert(kind == llvm::ELF::ODK_REGINFO); + return *reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>( + (const uint8_t *)this + sizeof(Elf_Mips_Options)); + } +}; + // .MIPS.abiflags section content template <class ELFT> struct Elf_Mips_ABIFlags { LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) |