1 //===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/Support/CSKYAttributeParser.h" 10 #include "llvm/ADT/StringExtras.h" 11 #include "llvm/Support/Errc.h" 12 13 using namespace llvm; 14 15 const CSKYAttributeParser::DisplayHandler 16 CSKYAttributeParser::displayRoutines[] = { 17 { 18 CSKYAttrs::CSKY_ARCH_NAME, 19 &ELFAttributeParser::stringAttribute, 20 }, 21 { 22 CSKYAttrs::CSKY_CPU_NAME, 23 &ELFAttributeParser::stringAttribute, 24 }, 25 { 26 CSKYAttrs::CSKY_ISA_FLAGS, 27 &ELFAttributeParser::integerAttribute, 28 }, 29 { 30 CSKYAttrs::CSKY_ISA_EXT_FLAGS, 31 &ELFAttributeParser::integerAttribute, 32 }, 33 { 34 CSKYAttrs::CSKY_DSP_VERSION, 35 &CSKYAttributeParser::dspVersion, 36 }, 37 { 38 CSKYAttrs::CSKY_VDSP_VERSION, 39 &CSKYAttributeParser::vdspVersion, 40 }, 41 { 42 CSKYAttrs::CSKY_FPU_VERSION, 43 &CSKYAttributeParser::fpuVersion, 44 }, 45 { 46 CSKYAttrs::CSKY_FPU_ABI, 47 &CSKYAttributeParser::fpuABI, 48 }, 49 { 50 CSKYAttrs::CSKY_FPU_ROUNDING, 51 &CSKYAttributeParser::fpuRounding, 52 }, 53 { 54 CSKYAttrs::CSKY_FPU_DENORMAL, 55 &CSKYAttributeParser::fpuDenormal, 56 }, 57 { 58 CSKYAttrs::CSKY_FPU_EXCEPTION, 59 &CSKYAttributeParser::fpuException, 60 }, 61 { 62 CSKYAttrs::CSKY_FPU_NUMBER_MODULE, 63 &ELFAttributeParser::stringAttribute, 64 }, 65 { 66 CSKYAttrs::CSKY_FPU_HARDFP, 67 &CSKYAttributeParser::fpuHardFP, 68 }}; 69 70 Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) { 71 handled = false; 72 for (const auto &AH : displayRoutines) { 73 if (uint64_t(AH.attribute) == tag) { 74 if (Error e = (this->*AH.routine)(tag)) 75 return e; 76 handled = true; 77 break; 78 } 79 } 80 81 return Error::success(); 82 } 83 84 Error CSKYAttributeParser::dspVersion(unsigned tag) { 85 static const char *strings[] = {"Error", "DSP Extension", "DSP 2.0"}; 86 return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, 87 makeArrayRef(strings)); 88 } 89 90 Error CSKYAttributeParser::vdspVersion(unsigned tag) { 91 static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"}; 92 return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, 93 makeArrayRef(strings)); 94 } 95 96 Error CSKYAttributeParser::fpuVersion(unsigned tag) { 97 static const char *strings[] = {"Error", "FPU Version 1", "FPU Version 2", 98 "FPU Version 3"}; 99 return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, 100 makeArrayRef(strings)); 101 } 102 103 Error CSKYAttributeParser::fpuABI(unsigned tag) { 104 static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"}; 105 return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, makeArrayRef(strings)); 106 } 107 108 Error CSKYAttributeParser::fpuRounding(unsigned tag) { 109 static const char *strings[] = {"None", "Needed"}; 110 return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, 111 makeArrayRef(strings)); 112 } 113 114 Error CSKYAttributeParser::fpuDenormal(unsigned tag) { 115 static const char *strings[] = {"None", "Needed"}; 116 return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, 117 makeArrayRef(strings)); 118 } 119 120 Error CSKYAttributeParser::fpuException(unsigned tag) { 121 static const char *strings[] = {"None", "Needed"}; 122 return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, 123 makeArrayRef(strings)); 124 } 125 126 Error CSKYAttributeParser::fpuHardFP(unsigned tag) { 127 uint64_t value = de.getULEB128(cursor); 128 ListSeparator LS(" "); 129 130 std::string description; 131 132 if (value & 0x1) { 133 description += LS; 134 description += "Half"; 135 } 136 if ((value >> 1) & 0x1) { 137 description += LS; 138 description += "Single"; 139 } 140 if ((value >> 2) & 0x1) { 141 description += LS; 142 description += "Double"; 143 } 144 145 if (description.empty()) { 146 printAttribute(tag, value, ""); 147 return createStringError(errc::invalid_argument, 148 "unknown Tag_CSKY_FPU_HARDFP value: " + 149 Twine(value)); 150 } 151 152 printAttribute(tag, value, description); 153 return Error::success(); 154 } 155