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