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