| 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 | .attribute: CSKYAttrs::CSKY_ARCH_NAME, |
| 19 | .routine: &ELFCompactAttrParser::stringAttribute, |
| 20 | }, |
| 21 | { |
| 22 | .attribute: CSKYAttrs::CSKY_CPU_NAME, |
| 23 | .routine: &ELFCompactAttrParser::stringAttribute, |
| 24 | }, |
| 25 | { |
| 26 | .attribute: CSKYAttrs::CSKY_ISA_FLAGS, |
| 27 | .routine: &ELFCompactAttrParser::integerAttribute, |
| 28 | }, |
| 29 | { |
| 30 | .attribute: CSKYAttrs::CSKY_ISA_EXT_FLAGS, |
| 31 | .routine: &ELFCompactAttrParser::integerAttribute, |
| 32 | }, |
| 33 | { |
| 34 | .attribute: CSKYAttrs::CSKY_DSP_VERSION, |
| 35 | .routine: &CSKYAttributeParser::dspVersion, |
| 36 | }, |
| 37 | { |
| 38 | .attribute: CSKYAttrs::CSKY_VDSP_VERSION, |
| 39 | .routine: &CSKYAttributeParser::vdspVersion, |
| 40 | }, |
| 41 | { |
| 42 | .attribute: CSKYAttrs::CSKY_FPU_VERSION, |
| 43 | .routine: &CSKYAttributeParser::fpuVersion, |
| 44 | }, |
| 45 | { |
| 46 | .attribute: CSKYAttrs::CSKY_FPU_ABI, |
| 47 | .routine: &CSKYAttributeParser::fpuABI, |
| 48 | }, |
| 49 | { |
| 50 | .attribute: CSKYAttrs::CSKY_FPU_ROUNDING, |
| 51 | .routine: &CSKYAttributeParser::fpuRounding, |
| 52 | }, |
| 53 | { |
| 54 | .attribute: CSKYAttrs::CSKY_FPU_DENORMAL, |
| 55 | .routine: &CSKYAttributeParser::fpuDenormal, |
| 56 | }, |
| 57 | { |
| 58 | .attribute: CSKYAttrs::CSKY_FPU_EXCEPTION, |
| 59 | .routine: &CSKYAttributeParser::fpuException, |
| 60 | }, |
| 61 | { |
| 62 | .attribute: CSKYAttrs::CSKY_FPU_NUMBER_MODULE, |
| 63 | .routine: &ELFCompactAttrParser::stringAttribute, |
| 64 | }, |
| 65 | { |
| 66 | .attribute: CSKYAttrs::CSKY_FPU_HARDFP, |
| 67 | .routine: &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 *const strings[] = {"Error" , "DSP Extension" , "DSP 2.0" }; |
| 86 | return parseStringAttribute(name: "Tag_CSKY_DSP_VERSION" , tag, strings: ArrayRef(strings)); |
| 87 | } |
| 88 | |
| 89 | Error CSKYAttributeParser::vdspVersion(unsigned tag) { |
| 90 | static const char *const strings[] = {"Error" , "VDSP Version 1" , |
| 91 | "VDSP Version 2" }; |
| 92 | return parseStringAttribute(name: "Tag_CSKY_VDSP_VERSION" , tag, strings: ArrayRef(strings)); |
| 93 | } |
| 94 | |
| 95 | Error CSKYAttributeParser::fpuVersion(unsigned tag) { |
| 96 | static const char *const strings[] = {"Error" , "FPU Version 1" , |
| 97 | "FPU Version 2" , "FPU Version 3" }; |
| 98 | return parseStringAttribute(name: "Tag_CSKY_FPU_VERSION" , tag, strings: ArrayRef(strings)); |
| 99 | } |
| 100 | |
| 101 | Error CSKYAttributeParser::fpuABI(unsigned tag) { |
| 102 | static const char *const strings[] = {"Error" , "Soft" , "SoftFP" , "Hard" }; |
| 103 | return parseStringAttribute(name: "Tag_CSKY_FPU_ABI" , tag, strings: ArrayRef(strings)); |
| 104 | } |
| 105 | |
| 106 | Error CSKYAttributeParser::fpuRounding(unsigned tag) { |
| 107 | static const char *const strings[] = {"None" , "Needed" }; |
| 108 | return parseStringAttribute(name: "Tag_CSKY_FPU_ROUNDING" , tag, strings: ArrayRef(strings)); |
| 109 | } |
| 110 | |
| 111 | Error CSKYAttributeParser::fpuDenormal(unsigned tag) { |
| 112 | static const char *const strings[] = {"None" , "Needed" }; |
| 113 | return parseStringAttribute(name: "Tag_CSKY_FPU_DENORMAL" , tag, strings: ArrayRef(strings)); |
| 114 | } |
| 115 | |
| 116 | Error CSKYAttributeParser::fpuException(unsigned tag) { |
| 117 | static const char *const strings[] = {"None" , "Needed" }; |
| 118 | return parseStringAttribute(name: "Tag_CSKY_FPU_EXCEPTION" , tag, strings: ArrayRef(strings)); |
| 119 | } |
| 120 | |
| 121 | Error CSKYAttributeParser::fpuHardFP(unsigned tag) { |
| 122 | uint64_t value = de.getULEB128(C&: cursor); |
| 123 | ListSeparator LS(" " ); |
| 124 | |
| 125 | std::string description; |
| 126 | |
| 127 | if (value & 0x1) { |
| 128 | description += LS; |
| 129 | description += "Half" ; |
| 130 | } |
| 131 | if ((value >> 1) & 0x1) { |
| 132 | description += LS; |
| 133 | description += "Single" ; |
| 134 | } |
| 135 | if ((value >> 2) & 0x1) { |
| 136 | description += LS; |
| 137 | description += "Double" ; |
| 138 | } |
| 139 | |
| 140 | if (description.empty()) { |
| 141 | printAttribute(tag, value, valueDesc: "" ); |
| 142 | return createStringError(EC: errc::invalid_argument, |
| 143 | S: "unknown Tag_CSKY_FPU_HARDFP value: " + |
| 144 | Twine(value)); |
| 145 | } |
| 146 | |
| 147 | printAttribute(tag, value, valueDesc: description); |
| 148 | return Error::success(); |
| 149 | } |
| 150 | |