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