1 //===- MipsABIFlagsSection.cpp - Mips ELF ABI Flags Section ---------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "MCTargetDesc/MipsABIFlagsSection.h"
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/MC/MCStreamer.h"
12 #include "llvm/Support/ErrorHandling.h"
13 #include "llvm/Support/MipsABIFlags.h"
14 
15 using namespace llvm;
16 
getFpABIValue()17 uint8_t MipsABIFlagsSection::getFpABIValue() {
18   switch (FpABI) {
19   case FpABIKind::ANY:
20     return Mips::Val_GNU_MIPS_ABI_FP_ANY;
21   case FpABIKind::SOFT:
22     return Mips::Val_GNU_MIPS_ABI_FP_SOFT;
23   case FpABIKind::XX:
24     return Mips::Val_GNU_MIPS_ABI_FP_XX;
25   case FpABIKind::S32:
26     return Mips::Val_GNU_MIPS_ABI_FP_DOUBLE;
27   case FpABIKind::S64:
28     if (Is32BitABI)
29       return OddSPReg ? Mips::Val_GNU_MIPS_ABI_FP_64
30                       : Mips::Val_GNU_MIPS_ABI_FP_64A;
31     return Mips::Val_GNU_MIPS_ABI_FP_DOUBLE;
32   }
33 
34   llvm_unreachable("unexpected fp abi value");
35 }
36 
getFpABIString(FpABIKind Value)37 StringRef MipsABIFlagsSection::getFpABIString(FpABIKind Value) {
38   switch (Value) {
39   case FpABIKind::XX:
40     return "xx";
41   case FpABIKind::S32:
42     return "32";
43   case FpABIKind::S64:
44     return "64";
45   default:
46     llvm_unreachable("unsupported fp abi value");
47   }
48 }
49 
getCPR1SizeValue()50 uint8_t MipsABIFlagsSection::getCPR1SizeValue() {
51   if (FpABI == FpABIKind::XX)
52     return (uint8_t)Mips::AFL_REG_32;
53   return (uint8_t)CPR1Size;
54 }
55 
56 namespace llvm {
57 
operator <<(MCStreamer & OS,MipsABIFlagsSection & ABIFlagsSection)58 MCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection) {
59   // Write out a Elf_Internal_ABIFlags_v0 struct
60   OS.emitIntValue(ABIFlagsSection.getVersionValue(), 2);      // version
61   OS.emitIntValue(ABIFlagsSection.getISALevelValue(), 1);     // isa_level
62   OS.emitIntValue(ABIFlagsSection.getISARevisionValue(), 1);  // isa_rev
63   OS.emitIntValue(ABIFlagsSection.getGPRSizeValue(), 1);      // gpr_size
64   OS.emitIntValue(ABIFlagsSection.getCPR1SizeValue(), 1);     // cpr1_size
65   OS.emitIntValue(ABIFlagsSection.getCPR2SizeValue(), 1);     // cpr2_size
66   OS.emitIntValue(ABIFlagsSection.getFpABIValue(), 1);        // fp_abi
67   OS.emitIntValue(ABIFlagsSection.getISAExtensionValue(), 4); // isa_ext
68   OS.emitIntValue(ABIFlagsSection.getASESetValue(), 4);       // ases
69   OS.emitIntValue(ABIFlagsSection.getFlags1Value(), 4);       // flags1
70   OS.emitIntValue(ABIFlagsSection.getFlags2Value(), 4);       // flags2
71   return OS;
72 }
73 
74 } // end namespace llvm
75