1321369Sdim//===- MipsABIFlagsSection.cpp - Mips ELF ABI Flags Section ---------------===//
2274955Ssvnmir//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6274955Ssvnmir//
7274955Ssvnmir//===----------------------------------------------------------------------===//
8274955Ssvnmir
9321369Sdim#include "MCTargetDesc/MipsABIFlagsSection.h"
10321369Sdim#include "llvm/ADT/StringRef.h"
11321369Sdim#include "llvm/MC/MCStreamer.h"
12321369Sdim#include "llvm/Support/ErrorHandling.h"
13321369Sdim#include "llvm/Support/MipsABIFlags.h"
14274955Ssvnmir
15274955Ssvnmirusing namespace llvm;
16274955Ssvnmir
17274955Ssvnmiruint8_t MipsABIFlagsSection::getFpABIValue() {
18274955Ssvnmir  switch (FpABI) {
19274955Ssvnmir  case FpABIKind::ANY:
20288943Sdim    return Mips::Val_GNU_MIPS_ABI_FP_ANY;
21288943Sdim  case FpABIKind::SOFT:
22288943Sdim    return Mips::Val_GNU_MIPS_ABI_FP_SOFT;
23274955Ssvnmir  case FpABIKind::XX:
24288943Sdim    return Mips::Val_GNU_MIPS_ABI_FP_XX;
25274955Ssvnmir  case FpABIKind::S32:
26288943Sdim    return Mips::Val_GNU_MIPS_ABI_FP_DOUBLE;
27274955Ssvnmir  case FpABIKind::S64:
28274955Ssvnmir    if (Is32BitABI)
29288943Sdim      return OddSPReg ? Mips::Val_GNU_MIPS_ABI_FP_64
30288943Sdim                      : Mips::Val_GNU_MIPS_ABI_FP_64A;
31288943Sdim    return Mips::Val_GNU_MIPS_ABI_FP_DOUBLE;
32274955Ssvnmir  }
33274955Ssvnmir
34274955Ssvnmir  llvm_unreachable("unexpected fp abi value");
35274955Ssvnmir}
36274955Ssvnmir
37274955SsvnmirStringRef MipsABIFlagsSection::getFpABIString(FpABIKind Value) {
38274955Ssvnmir  switch (Value) {
39274955Ssvnmir  case FpABIKind::XX:
40274955Ssvnmir    return "xx";
41274955Ssvnmir  case FpABIKind::S32:
42274955Ssvnmir    return "32";
43274955Ssvnmir  case FpABIKind::S64:
44274955Ssvnmir    return "64";
45274955Ssvnmir  default:
46274955Ssvnmir    llvm_unreachable("unsupported fp abi value");
47274955Ssvnmir  }
48274955Ssvnmir}
49274955Ssvnmir
50274955Ssvnmiruint8_t MipsABIFlagsSection::getCPR1SizeValue() {
51274955Ssvnmir  if (FpABI == FpABIKind::XX)
52288943Sdim    return (uint8_t)Mips::AFL_REG_32;
53274955Ssvnmir  return (uint8_t)CPR1Size;
54274955Ssvnmir}
55274955Ssvnmir
56274955Ssvnmirnamespace llvm {
57321369Sdim
58274955SsvnmirMCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection) {
59274955Ssvnmir  // Write out a Elf_Internal_ABIFlags_v0 struct
60309124Sdim  OS.EmitIntValue(ABIFlagsSection.getVersionValue(), 2);      // version
61309124Sdim  OS.EmitIntValue(ABIFlagsSection.getISALevelValue(), 1);     // isa_level
62309124Sdim  OS.EmitIntValue(ABIFlagsSection.getISARevisionValue(), 1);  // isa_rev
63309124Sdim  OS.EmitIntValue(ABIFlagsSection.getGPRSizeValue(), 1);      // gpr_size
64309124Sdim  OS.EmitIntValue(ABIFlagsSection.getCPR1SizeValue(), 1);     // cpr1_size
65309124Sdim  OS.EmitIntValue(ABIFlagsSection.getCPR2SizeValue(), 1);     // cpr2_size
66309124Sdim  OS.EmitIntValue(ABIFlagsSection.getFpABIValue(), 1);        // fp_abi
67309124Sdim  OS.EmitIntValue(ABIFlagsSection.getISAExtensionValue(), 4); // isa_ext
68309124Sdim  OS.EmitIntValue(ABIFlagsSection.getASESetValue(), 4);       // ases
69309124Sdim  OS.EmitIntValue(ABIFlagsSection.getFlags1Value(), 4);       // flags1
70309124Sdim  OS.EmitIntValue(ABIFlagsSection.getFlags2Value(), 4);       // flags2
71274955Ssvnmir  return OS;
72274955Ssvnmir}
73321369Sdim
74321369Sdim} // end namespace llvm
75