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