1*81ad6265SDimitry Andric //===-- CSKYELFStreamer.cpp - CSKY ELF Target Streamer Methods ------------===// 2*81ad6265SDimitry Andric // 3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*81ad6265SDimitry Andric // 7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 8*81ad6265SDimitry Andric // 9*81ad6265SDimitry Andric // This file provides CSKY specific target streamer methods. 10*81ad6265SDimitry Andric // 11*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 12*81ad6265SDimitry Andric 13*81ad6265SDimitry Andric #include "CSKYELFStreamer.h" 14*81ad6265SDimitry Andric #include "CSKYMCTargetDesc.h" 15*81ad6265SDimitry Andric #include "MCTargetDesc/CSKYAsmBackend.h" 16*81ad6265SDimitry Andric #include "MCTargetDesc/CSKYBaseInfo.h" 17*81ad6265SDimitry Andric #include "llvm/BinaryFormat/ELF.h" 18*81ad6265SDimitry Andric #include "llvm/MC/MCAssembler.h" 19*81ad6265SDimitry Andric #include "llvm/MC/MCContext.h" 20*81ad6265SDimitry Andric #include "llvm/MC/MCSectionELF.h" 21*81ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 22*81ad6265SDimitry Andric #include "llvm/MC/MCSymbolELF.h" 23*81ad6265SDimitry Andric #include "llvm/Support/CSKYAttributes.h" 24*81ad6265SDimitry Andric #include "llvm/Support/CSKYTargetParser.h" 25*81ad6265SDimitry Andric #include "llvm/Support/Casting.h" 26*81ad6265SDimitry Andric #include "llvm/Support/LEB128.h" 27*81ad6265SDimitry Andric 28*81ad6265SDimitry Andric using namespace llvm; 29*81ad6265SDimitry Andric 30*81ad6265SDimitry Andric // This part is for ELF object output. 31*81ad6265SDimitry Andric CSKYTargetELFStreamer::CSKYTargetELFStreamer(MCStreamer &S, 32*81ad6265SDimitry Andric const MCSubtargetInfo &STI) 33*81ad6265SDimitry Andric : CSKYTargetStreamer(S), CurrentVendor("csky") { 34*81ad6265SDimitry Andric MCAssembler &MCA = getStreamer().getAssembler(); 35*81ad6265SDimitry Andric const FeatureBitset &Features = STI.getFeatureBits(); 36*81ad6265SDimitry Andric 37*81ad6265SDimitry Andric unsigned EFlags = MCA.getELFHeaderEFlags(); 38*81ad6265SDimitry Andric 39*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_ABIV2; 40*81ad6265SDimitry Andric 41*81ad6265SDimitry Andric if (Features[CSKY::ProcCK801]) 42*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_801; 43*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK802]) 44*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_802; 45*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK803]) 46*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_803; 47*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK804]) 48*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_803; 49*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK805]) 50*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_805; 51*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK807]) 52*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_807; 53*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK810]) 54*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_810; 55*81ad6265SDimitry Andric else if (Features[CSKY::ProcCK860]) 56*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_860; 57*81ad6265SDimitry Andric else 58*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_810; 59*81ad6265SDimitry Andric 60*81ad6265SDimitry Andric if (Features[CSKY::FeatureFPUV2_SF] || Features[CSKY::FeatureFPUV3_SF]) 61*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_FLOAT; 62*81ad6265SDimitry Andric 63*81ad6265SDimitry Andric EFlags |= ELF::EF_CSKY_EFV1; 64*81ad6265SDimitry Andric 65*81ad6265SDimitry Andric MCA.setELFHeaderEFlags(EFlags); 66*81ad6265SDimitry Andric } 67*81ad6265SDimitry Andric 68*81ad6265SDimitry Andric MCELFStreamer &CSKYTargetELFStreamer::getStreamer() { 69*81ad6265SDimitry Andric return static_cast<MCELFStreamer &>(Streamer); 70*81ad6265SDimitry Andric } 71*81ad6265SDimitry Andric 72*81ad6265SDimitry Andric void CSKYTargetELFStreamer::emitAttribute(unsigned Attribute, unsigned Value) { 73*81ad6265SDimitry Andric setAttributeItem(Attribute, Value, /*OverwriteExisting=*/true); 74*81ad6265SDimitry Andric } 75*81ad6265SDimitry Andric 76*81ad6265SDimitry Andric void CSKYTargetELFStreamer::emitTextAttribute(unsigned Attribute, 77*81ad6265SDimitry Andric StringRef String) { 78*81ad6265SDimitry Andric setAttributeItem(Attribute, String, /*OverwriteExisting=*/true); 79*81ad6265SDimitry Andric } 80*81ad6265SDimitry Andric 81*81ad6265SDimitry Andric void CSKYTargetELFStreamer::finishAttributeSection() { 82*81ad6265SDimitry Andric if (Contents.empty()) 83*81ad6265SDimitry Andric return; 84*81ad6265SDimitry Andric 85*81ad6265SDimitry Andric if (AttributeSection) { 86*81ad6265SDimitry Andric Streamer.switchSection(AttributeSection); 87*81ad6265SDimitry Andric } else { 88*81ad6265SDimitry Andric MCAssembler &MCA = getStreamer().getAssembler(); 89*81ad6265SDimitry Andric AttributeSection = MCA.getContext().getELFSection( 90*81ad6265SDimitry Andric ".csky.attributes", ELF::SHT_CSKY_ATTRIBUTES, 0); 91*81ad6265SDimitry Andric Streamer.switchSection(AttributeSection); 92*81ad6265SDimitry Andric Streamer.emitInt8(ELFAttrs::Format_Version); 93*81ad6265SDimitry Andric } 94*81ad6265SDimitry Andric 95*81ad6265SDimitry Andric // Vendor size + Vendor name + '\0' 96*81ad6265SDimitry Andric const size_t VendorHeaderSize = 4 + CurrentVendor.size() + 1; 97*81ad6265SDimitry Andric 98*81ad6265SDimitry Andric // Tag + Tag Size 99*81ad6265SDimitry Andric const size_t TagHeaderSize = 1 + 4; 100*81ad6265SDimitry Andric 101*81ad6265SDimitry Andric const size_t ContentsSize = calculateContentSize(); 102*81ad6265SDimitry Andric 103*81ad6265SDimitry Andric Streamer.emitInt32(VendorHeaderSize + TagHeaderSize + ContentsSize); 104*81ad6265SDimitry Andric Streamer.emitBytes(CurrentVendor); 105*81ad6265SDimitry Andric Streamer.emitInt8(0); // '\0' 106*81ad6265SDimitry Andric 107*81ad6265SDimitry Andric Streamer.emitInt8(ELFAttrs::File); 108*81ad6265SDimitry Andric Streamer.emitInt32(TagHeaderSize + ContentsSize); 109*81ad6265SDimitry Andric 110*81ad6265SDimitry Andric // Size should have been accounted for already, now 111*81ad6265SDimitry Andric // emit each field as its type (ULEB or String). 112*81ad6265SDimitry Andric for (AttributeItem item : Contents) { 113*81ad6265SDimitry Andric Streamer.emitULEB128IntValue(item.Tag); 114*81ad6265SDimitry Andric switch (item.Type) { 115*81ad6265SDimitry Andric default: 116*81ad6265SDimitry Andric llvm_unreachable("Invalid attribute type"); 117*81ad6265SDimitry Andric case AttributeType::Numeric: 118*81ad6265SDimitry Andric Streamer.emitULEB128IntValue(item.IntValue); 119*81ad6265SDimitry Andric break; 120*81ad6265SDimitry Andric case AttributeType::Text: 121*81ad6265SDimitry Andric Streamer.emitBytes(item.StringValue); 122*81ad6265SDimitry Andric Streamer.emitInt8(0); // '\0' 123*81ad6265SDimitry Andric break; 124*81ad6265SDimitry Andric case AttributeType::NumericAndText: 125*81ad6265SDimitry Andric Streamer.emitULEB128IntValue(item.IntValue); 126*81ad6265SDimitry Andric Streamer.emitBytes(item.StringValue); 127*81ad6265SDimitry Andric Streamer.emitInt8(0); // '\0' 128*81ad6265SDimitry Andric break; 129*81ad6265SDimitry Andric } 130*81ad6265SDimitry Andric } 131*81ad6265SDimitry Andric 132*81ad6265SDimitry Andric Contents.clear(); 133*81ad6265SDimitry Andric } 134*81ad6265SDimitry Andric 135*81ad6265SDimitry Andric size_t CSKYTargetELFStreamer::calculateContentSize() const { 136*81ad6265SDimitry Andric size_t Result = 0; 137*81ad6265SDimitry Andric for (AttributeItem item : Contents) { 138*81ad6265SDimitry Andric switch (item.Type) { 139*81ad6265SDimitry Andric case AttributeType::Hidden: 140*81ad6265SDimitry Andric break; 141*81ad6265SDimitry Andric case AttributeType::Numeric: 142*81ad6265SDimitry Andric Result += getULEB128Size(item.Tag); 143*81ad6265SDimitry Andric Result += getULEB128Size(item.IntValue); 144*81ad6265SDimitry Andric break; 145*81ad6265SDimitry Andric case AttributeType::Text: 146*81ad6265SDimitry Andric Result += getULEB128Size(item.Tag); 147*81ad6265SDimitry Andric Result += item.StringValue.size() + 1; // string + '\0' 148*81ad6265SDimitry Andric break; 149*81ad6265SDimitry Andric case AttributeType::NumericAndText: 150*81ad6265SDimitry Andric Result += getULEB128Size(item.Tag); 151*81ad6265SDimitry Andric Result += getULEB128Size(item.IntValue); 152*81ad6265SDimitry Andric Result += item.StringValue.size() + 1; // string + '\0'; 153*81ad6265SDimitry Andric break; 154*81ad6265SDimitry Andric } 155*81ad6265SDimitry Andric } 156*81ad6265SDimitry Andric return Result; 157*81ad6265SDimitry Andric } 158*81ad6265SDimitry Andric 159*81ad6265SDimitry Andric void CSKYELFStreamer::EmitMappingSymbol(StringRef Name) { 160*81ad6265SDimitry Andric if (Name == "$d" && State == EMS_Data) 161*81ad6265SDimitry Andric return; 162*81ad6265SDimitry Andric if (Name == "$t" && State == EMS_Text) 163*81ad6265SDimitry Andric return; 164*81ad6265SDimitry Andric if (Name == "$t" && State == EMS_None) { 165*81ad6265SDimitry Andric State = EMS_Text; 166*81ad6265SDimitry Andric return; 167*81ad6265SDimitry Andric } 168*81ad6265SDimitry Andric 169*81ad6265SDimitry Andric State = (Name == "$t" ? EMS_Text : EMS_Data); 170*81ad6265SDimitry Andric 171*81ad6265SDimitry Andric auto *Symbol = cast<MCSymbolELF>(getContext().getOrCreateSymbol( 172*81ad6265SDimitry Andric Name + "." + Twine(MappingSymbolCounter++))); 173*81ad6265SDimitry Andric emitLabel(Symbol); 174*81ad6265SDimitry Andric 175*81ad6265SDimitry Andric Symbol->setType(ELF::STT_NOTYPE); 176*81ad6265SDimitry Andric Symbol->setBinding(ELF::STB_LOCAL); 177*81ad6265SDimitry Andric } 178*81ad6265SDimitry Andric 179*81ad6265SDimitry Andric void CSKYTargetELFStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) { 180*81ad6265SDimitry Andric StringRef CPU = STI.getCPU(); 181*81ad6265SDimitry Andric CSKY::ArchKind ArchID = CSKY::parseCPUArch(CPU); 182*81ad6265SDimitry Andric 183*81ad6265SDimitry Andric if (ArchID == CSKY::ArchKind::CK804) 184*81ad6265SDimitry Andric ArchID = CSKY::ArchKind::CK803; 185*81ad6265SDimitry Andric 186*81ad6265SDimitry Andric StringRef CPU_ARCH = CSKY::getArchName(ArchID); 187*81ad6265SDimitry Andric 188*81ad6265SDimitry Andric if (ArchID == CSKY::ArchKind::INVALID) { 189*81ad6265SDimitry Andric CPU = "ck810"; 190*81ad6265SDimitry Andric CPU_ARCH = "ck810"; 191*81ad6265SDimitry Andric } 192*81ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_ARCH_NAME, CPU_ARCH); 193*81ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_CPU_NAME, CPU); 194*81ad6265SDimitry Andric 195*81ad6265SDimitry Andric unsigned ISAFlag = 0; 196*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasE1)) 197*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_E1; 198*81ad6265SDimitry Andric 199*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasE2)) 200*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_1E2; 201*81ad6265SDimitry Andric 202*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has2E3)) 203*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_2E3; 204*81ad6265SDimitry Andric 205*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasMP)) 206*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_MP; 207*81ad6265SDimitry Andric 208*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3E3r1)) 209*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R1; 210*81ad6265SDimitry Andric 211*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3r1E3r2)) 212*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R2; 213*81ad6265SDimitry Andric 214*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3r2E3r3)) 215*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E3R3; 216*81ad6265SDimitry Andric 217*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has3E7)) 218*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_3E7; 219*81ad6265SDimitry Andric 220*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasMP1E2)) 221*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_MP_1E2; 222*81ad6265SDimitry Andric 223*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has7E10)) 224*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_7E10; 225*81ad6265SDimitry Andric 226*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::Has10E60)) 227*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_10E60; 228*81ad6265SDimitry Andric 229*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureTrust)) 230*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_TRUST; 231*81ad6265SDimitry Andric 232*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureJAVA)) 233*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_JAVA; 234*81ad6265SDimitry Andric 235*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureCache)) 236*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_CACHE; 237*81ad6265SDimitry Andric 238*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureNVIC)) 239*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_NVIC; 240*81ad6265SDimitry Andric 241*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP)) 242*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP; 243*81ad6265SDimitry Andric 244*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasDSP1E2)) 245*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_1E2; 246*81ad6265SDimitry Andric 247*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasDSPE60)) 248*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::V2_ISA_DSPE60; 249*81ad6265SDimitry Andric 250*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSPV2)) 251*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_ENHANCE; 252*81ad6265SDimitry Andric 253*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP_Silan)) 254*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_DSP_SILAN; 255*81ad6265SDimitry Andric 256*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV1_128)) 257*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP; 258*81ad6265SDimitry Andric 259*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV2)) 260*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2; 261*81ad6265SDimitry Andric 262*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasVDSP2E3)) 263*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2E3; 264*81ad6265SDimitry Andric 265*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasVDSP2E60F)) 266*81ad6265SDimitry Andric ISAFlag |= CSKYAttrs::ISA_VDSP_2E60F; 267*81ad6265SDimitry Andric 268*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_ISA_FLAGS, ISAFlag); 269*81ad6265SDimitry Andric 270*81ad6265SDimitry Andric unsigned ISAExtFlag = 0; 271*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOATE1)) 272*81ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_E1; 273*81ad6265SDimitry Andric 274*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT1E2)) 275*81ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E2; 276*81ad6265SDimitry Andric 277*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT1E3)) 278*81ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_1E3; 279*81ad6265SDimitry Andric 280*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT3E4)) 281*81ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_3E4; 282*81ad6265SDimitry Andric 283*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::HasFLOAT7E60)) 284*81ad6265SDimitry Andric ISAExtFlag |= CSKYAttrs::ISA_FLOAT_7E60; 285*81ad6265SDimitry Andric 286*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_ISA_EXT_FLAGS, ISAExtFlag); 287*81ad6265SDimitry Andric 288*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSP)) 289*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, 290*81ad6265SDimitry Andric CSKYAttrs::DSP_VERSION_EXTENSION); 291*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureDSPV2)) 292*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_DSP_VERSION, CSKYAttrs::DSP_VERSION_2); 293*81ad6265SDimitry Andric 294*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureVDSPV2)) 295*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_VDSP_VERSION, CSKYAttrs::VDSP_VERSION_2); 296*81ad6265SDimitry Andric 297*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_SF) || 298*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV2_DF)) 299*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_2); 300*81ad6265SDimitry Andric else if (STI.hasFeature(CSKY::FeatureFPUV3_HF) || 301*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF) || 302*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF)) 303*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_VERSION, CSKYAttrs::FPU_VERSION_3); 304*81ad6265SDimitry Andric 305*81ad6265SDimitry Andric bool hasAnyFloatExt = STI.hasFeature(CSKY::FeatureFPUV2_SF) || 306*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV2_DF) || 307*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_HF) || 308*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF) || 309*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF); 310*81ad6265SDimitry Andric 311*81ad6265SDimitry Andric if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat) && 312*81ad6265SDimitry Andric STI.hasFeature(CSKY::ModeHardFloatABI)) 313*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_HARD); 314*81ad6265SDimitry Andric else if (hasAnyFloatExt && STI.hasFeature(CSKY::ModeHardFloat)) 315*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFTFP); 316*81ad6265SDimitry Andric else 317*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_ABI, CSKYAttrs::FPU_ABI_SOFT); 318*81ad6265SDimitry Andric 319*81ad6265SDimitry Andric unsigned HardFPFlag = 0; 320*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV3_HF)) 321*81ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_HALF; 322*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_SF) || 323*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_SF)) 324*81ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_SINGLE; 325*81ad6265SDimitry Andric if (STI.hasFeature(CSKY::FeatureFPUV2_DF) || 326*81ad6265SDimitry Andric STI.hasFeature(CSKY::FeatureFPUV3_DF)) 327*81ad6265SDimitry Andric HardFPFlag |= CSKYAttrs::FPU_HARDFP_DOUBLE; 328*81ad6265SDimitry Andric 329*81ad6265SDimitry Andric if (HardFPFlag != 0) { 330*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_DENORMAL, CSKYAttrs::NEEDED); 331*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_EXCEPTION, CSKYAttrs::NEEDED); 332*81ad6265SDimitry Andric emitTextAttribute(CSKYAttrs::CSKY_FPU_NUMBER_MODULE, "IEEE 754"); 333*81ad6265SDimitry Andric emitAttribute(CSKYAttrs::CSKY_FPU_HARDFP, HardFPFlag); 334*81ad6265SDimitry Andric } 335*81ad6265SDimitry Andric } 336