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