1 //===- MipsAbiFlags.h -----------------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #ifndef TARGET_MIPS_MIPSABIFLAGS_H_ 10 #define TARGET_MIPS_MIPSABIFLAGS_H_ 11 12 #include "mcld/Support/MemoryRegion.h" 13 14 #include <llvm/ADT/Optional.h> 15 #include <llvm/Object/ELFTypes.h> 16 17 namespace mcld { 18 19 class Input; 20 class LDSection; 21 22 /** \class MipsAbiFlags 23 * \brief Representation of .MIPS.abiflags section. 24 */ 25 class MipsAbiFlags { 26 public: 27 /// size of underlaid ELF section structure 28 static uint64_t size(); 29 30 /// write ELF section structure to the memory region 31 static uint64_t emit(const MipsAbiFlags& pInfo, MemoryRegion& pRegion); 32 33 /// fill the structure by the data from the input section 34 static bool fillBySection(const Input& pInput, const LDSection& pSection, 35 MipsAbiFlags& mipsAbi); 36 37 /// fill the structure by the data from ELF header flags 38 static bool fillByElfFlags(const Input& pInput, uint64_t elfFlags, 39 MipsAbiFlags& mipsAbi); 40 41 /// check compatibility between two structures 42 static bool isCompatible(const Input& pInput, const MipsAbiFlags& elf, 43 const MipsAbiFlags& abi); 44 45 /// merge new abi settings to the old structure 46 static bool merge(const Input& pInput, MipsAbiFlags& oldFlags, 47 const MipsAbiFlags& newFlags); 48 49 private: 50 uint32_t m_IsaLevel; 51 uint32_t m_IsaRev; 52 uint32_t m_IsaExt; 53 uint32_t m_GprSize; 54 uint32_t m_Cpr1Size; 55 uint32_t m_Cpr2Size; 56 uint32_t m_FpAbi; 57 uint32_t m_Ases; 58 uint32_t m_Flags1; 59 }; 60 61 } // namespace mcld 62 63 #endif // TARGET_MIPS_MIPSABIFLAGS_H_ 64