| //===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Support/CSKYAttributeParser.h" | |
| #include "llvm/ADT/StringExtras.h" | |
| #include "llvm/Support/Errc.h" | |
| using namespace llvm; | |
| const CSKYAttributeParser::DisplayHandler | |
| CSKYAttributeParser::displayRoutines[] = { | |
| { | |
| CSKYAttrs::CSKY_ARCH_NAME, | |
| &ELFAttributeParser::stringAttribute, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_CPU_NAME, | |
| &ELFAttributeParser::stringAttribute, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_ISA_FLAGS, | |
| &ELFAttributeParser::integerAttribute, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_ISA_EXT_FLAGS, | |
| &ELFAttributeParser::integerAttribute, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_DSP_VERSION, | |
| &CSKYAttributeParser::dspVersion, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_VDSP_VERSION, | |
| &CSKYAttributeParser::vdspVersion, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_VERSION, | |
| &CSKYAttributeParser::fpuVersion, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_ABI, | |
| &CSKYAttributeParser::fpuABI, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_ROUNDING, | |
| &CSKYAttributeParser::fpuRounding, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_DENORMAL, | |
| &CSKYAttributeParser::fpuDenormal, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_EXCEPTION, | |
| &CSKYAttributeParser::fpuException, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_NUMBER_MODULE, | |
| &ELFAttributeParser::stringAttribute, | |
| }, | |
| { | |
| CSKYAttrs::CSKY_FPU_HARDFP, | |
| &CSKYAttributeParser::fpuHardFP, | |
| }}; | |
| Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) { | |
| handled = false; | |
| for (const auto &AH : displayRoutines) { | |
| if (uint64_t(AH.attribute) == tag) { | |
| if (Error e = (this->*AH.routine)(tag)) | |
| return e; | |
| handled = true; | |
| break; | |
| } | |
| } | |
| return Error::success(); | |
| } | |
| Error CSKYAttributeParser::dspVersion(unsigned tag) { | |
| static const char *strings[] = {"Error", "DSP Extension", "DSP 2.0"}; | |
| return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::vdspVersion(unsigned tag) { | |
| static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"}; | |
| return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::fpuVersion(unsigned tag) { | |
| static const char *strings[] = {"Error", "FPU Version 1", "FPU Version 2", | |
| "FPU Version 3"}; | |
| return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::fpuABI(unsigned tag) { | |
| static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"}; | |
| return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::fpuRounding(unsigned tag) { | |
| static const char *strings[] = {"None", "Needed"}; | |
| return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::fpuDenormal(unsigned tag) { | |
| static const char *strings[] = {"None", "Needed"}; | |
| return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::fpuException(unsigned tag) { | |
| static const char *strings[] = {"None", "Needed"}; | |
| return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, ArrayRef(strings)); | |
| } | |
| Error CSKYAttributeParser::fpuHardFP(unsigned tag) { | |
| uint64_t value = de.getULEB128(cursor); | |
| ListSeparator LS(" "); | |
| std::string description; | |
| if (value & 0x1) { | |
| description += LS; | |
| description += "Half"; | |
| } | |
| if ((value >> 1) & 0x1) { | |
| description += LS; | |
| description += "Single"; | |
| } | |
| if ((value >> 2) & 0x1) { | |
| description += LS; | |
| description += "Double"; | |
| } | |
| if (description.empty()) { | |
| printAttribute(tag, value, ""); | |
| return createStringError(errc::invalid_argument, | |
| "unknown Tag_CSKY_FPU_HARDFP value: " + | |
| Twine(value)); | |
| } | |
| printAttribute(tag, value, description); | |
| return Error::success(); | |
| } |