1cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar//===-- MipsABIFlagsSection.cpp - Mips ELF ABI Flags Section ---*- C++ -*--===//
2cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar//
33d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
43d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar//
5cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
7cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar//
8cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
9cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
10cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include "MipsABIFlagsSection.h"
11cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
12cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainarusing namespace llvm;
13cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar
14cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainaruint8_t MipsABIFlagsSection::getFpABIValue() {
15cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  switch (FpABI) {
16cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  case FpABIKind::ANY:
17cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    return Mips::Val_GNU_MIPS_ABI_FP_ANY;
18cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  case FpABIKind::SOFT:
19cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    return Mips::Val_GNU_MIPS_ABI_FP_SOFT;
20cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  case FpABIKind::XX:
21cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    return Mips::Val_GNU_MIPS_ABI_FP_XX;
22cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  case FpABIKind::S32:
23cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    return Mips::Val_GNU_MIPS_ABI_FP_DOUBLE;
24cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar  case FpABIKind::S64:
25cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    if (Is32BitABI)
26cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar      return OddSPReg ? Mips::Val_GNU_MIPS_ABI_FP_64
27cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar                      : Mips::Val_GNU_MIPS_ABI_FP_64A;
28cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar    return Mips::Val_GNU_MIPS_ABI_FP_DOUBLE;
29  }
30
31  llvm_unreachable("unexpected fp abi value");
32}
33
34StringRef MipsABIFlagsSection::getFpABIString(FpABIKind Value) {
35  switch (Value) {
36  case FpABIKind::XX:
37    return "xx";
38  case FpABIKind::S32:
39    return "32";
40  case FpABIKind::S64:
41    return "64";
42  default:
43    llvm_unreachable("unsupported fp abi value");
44  }
45}
46
47uint8_t MipsABIFlagsSection::getCPR1SizeValue() {
48  if (FpABI == FpABIKind::XX)
49    return (uint8_t)Mips::AFL_REG_32;
50  return (uint8_t)CPR1Size;
51}
52
53namespace llvm {
54MCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection) {
55  // Write out a Elf_Internal_ABIFlags_v0 struct
56  OS.EmitIntValue(ABIFlagsSection.getVersionValue(), 2);         // version
57  OS.EmitIntValue(ABIFlagsSection.getISALevelValue(), 1);        // isa_level
58  OS.EmitIntValue(ABIFlagsSection.getISARevisionValue(), 1);     // isa_rev
59  OS.EmitIntValue(ABIFlagsSection.getGPRSizeValue(), 1);         // gpr_size
60  OS.EmitIntValue(ABIFlagsSection.getCPR1SizeValue(), 1);        // cpr1_size
61  OS.EmitIntValue(ABIFlagsSection.getCPR2SizeValue(), 1);        // cpr2_size
62  OS.EmitIntValue(ABIFlagsSection.getFpABIValue(), 1);           // fp_abi
63  OS.EmitIntValue(ABIFlagsSection.getISAExtensionSetValue(), 4); // isa_ext
64  OS.EmitIntValue(ABIFlagsSection.getASESetValue(), 4);          // ases
65  OS.EmitIntValue(ABIFlagsSection.getFlags1Value(), 4);          // flags1
66  OS.EmitIntValue(ABIFlagsSection.getFlags2Value(), 4);          // flags2
67  return OS;
68}
69}
70