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