LLVM API Documentation
00001 //===-- MipsABIFlagsSection.cpp - Mips ELF ABI Flags Section ---*- C++ -*--===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 00010 #include "MipsABIFlagsSection.h" 00011 00012 using namespace llvm; 00013 00014 uint8_t MipsABIFlagsSection::getFpABIValue() { 00015 switch (FpABI) { 00016 case FpABIKind::ANY: 00017 return Val_GNU_MIPS_ABI_FP_ANY; 00018 case FpABIKind::XX: 00019 return Val_GNU_MIPS_ABI_FP_XX; 00020 case FpABIKind::S32: 00021 return Val_GNU_MIPS_ABI_FP_DOUBLE; 00022 case FpABIKind::S64: 00023 if (Is32BitABI) 00024 return OddSPReg ? Val_GNU_MIPS_ABI_FP_64 : Val_GNU_MIPS_ABI_FP_64A; 00025 return Val_GNU_MIPS_ABI_FP_DOUBLE; 00026 } 00027 00028 llvm_unreachable("unexpected fp abi value"); 00029 } 00030 00031 StringRef MipsABIFlagsSection::getFpABIString(FpABIKind Value) { 00032 switch (Value) { 00033 case FpABIKind::XX: 00034 return "xx"; 00035 case FpABIKind::S32: 00036 return "32"; 00037 case FpABIKind::S64: 00038 return "64"; 00039 default: 00040 llvm_unreachable("unsupported fp abi value"); 00041 } 00042 } 00043 00044 uint8_t MipsABIFlagsSection::getCPR1SizeValue() { 00045 if (FpABI == FpABIKind::XX) 00046 return (uint8_t)AFL_REG_32; 00047 return (uint8_t)CPR1Size; 00048 } 00049 00050 namespace llvm { 00051 MCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection) { 00052 // Write out a Elf_Internal_ABIFlags_v0 struct 00053 OS.EmitIntValue(ABIFlagsSection.getVersionValue(), 2); // version 00054 OS.EmitIntValue(ABIFlagsSection.getISALevelValue(), 1); // isa_level 00055 OS.EmitIntValue(ABIFlagsSection.getISARevisionValue(), 1); // isa_rev 00056 OS.EmitIntValue(ABIFlagsSection.getGPRSizeValue(), 1); // gpr_size 00057 OS.EmitIntValue(ABIFlagsSection.getCPR1SizeValue(), 1); // cpr1_size 00058 OS.EmitIntValue(ABIFlagsSection.getCPR2SizeValue(), 1); // cpr2_size 00059 OS.EmitIntValue(ABIFlagsSection.getFpABIValue(), 1); // fp_abi 00060 OS.EmitIntValue(ABIFlagsSection.getISAExtensionSetValue(), 4); // isa_ext 00061 OS.EmitIntValue(ABIFlagsSection.getASESetValue(), 4); // ases 00062 OS.EmitIntValue(ABIFlagsSection.getFlags1Value(), 4); // flags1 00063 OS.EmitIntValue(ABIFlagsSection.getFlags2Value(), 4); // flags2 00064 return OS; 00065 } 00066 }