Path: blob/main/contrib/llvm-project/llvm/lib/Support/CSKYAttributeParser.cpp
35232 views
//===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/Support/CSKYAttributeParser.h"9#include "llvm/ADT/StringExtras.h"10#include "llvm/Support/Errc.h"1112using namespace llvm;1314const CSKYAttributeParser::DisplayHandler15CSKYAttributeParser::displayRoutines[] = {16{17CSKYAttrs::CSKY_ARCH_NAME,18&ELFAttributeParser::stringAttribute,19},20{21CSKYAttrs::CSKY_CPU_NAME,22&ELFAttributeParser::stringAttribute,23},24{25CSKYAttrs::CSKY_ISA_FLAGS,26&ELFAttributeParser::integerAttribute,27},28{29CSKYAttrs::CSKY_ISA_EXT_FLAGS,30&ELFAttributeParser::integerAttribute,31},32{33CSKYAttrs::CSKY_DSP_VERSION,34&CSKYAttributeParser::dspVersion,35},36{37CSKYAttrs::CSKY_VDSP_VERSION,38&CSKYAttributeParser::vdspVersion,39},40{41CSKYAttrs::CSKY_FPU_VERSION,42&CSKYAttributeParser::fpuVersion,43},44{45CSKYAttrs::CSKY_FPU_ABI,46&CSKYAttributeParser::fpuABI,47},48{49CSKYAttrs::CSKY_FPU_ROUNDING,50&CSKYAttributeParser::fpuRounding,51},52{53CSKYAttrs::CSKY_FPU_DENORMAL,54&CSKYAttributeParser::fpuDenormal,55},56{57CSKYAttrs::CSKY_FPU_EXCEPTION,58&CSKYAttributeParser::fpuException,59},60{61CSKYAttrs::CSKY_FPU_NUMBER_MODULE,62&ELFAttributeParser::stringAttribute,63},64{65CSKYAttrs::CSKY_FPU_HARDFP,66&CSKYAttributeParser::fpuHardFP,67}};6869Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) {70handled = false;71for (const auto &AH : displayRoutines) {72if (uint64_t(AH.attribute) == tag) {73if (Error e = (this->*AH.routine)(tag))74return e;75handled = true;76break;77}78}7980return Error::success();81}8283Error CSKYAttributeParser::dspVersion(unsigned tag) {84static const char *strings[] = {"Error", "DSP Extension", "DSP 2.0"};85return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, ArrayRef(strings));86}8788Error CSKYAttributeParser::vdspVersion(unsigned tag) {89static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"};90return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, ArrayRef(strings));91}9293Error CSKYAttributeParser::fpuVersion(unsigned tag) {94static const char *strings[] = {"Error", "FPU Version 1", "FPU Version 2",95"FPU Version 3"};96return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, ArrayRef(strings));97}9899Error CSKYAttributeParser::fpuABI(unsigned tag) {100static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"};101return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, ArrayRef(strings));102}103104Error CSKYAttributeParser::fpuRounding(unsigned tag) {105static const char *strings[] = {"None", "Needed"};106return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, ArrayRef(strings));107}108109Error CSKYAttributeParser::fpuDenormal(unsigned tag) {110static const char *strings[] = {"None", "Needed"};111return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, ArrayRef(strings));112}113114Error CSKYAttributeParser::fpuException(unsigned tag) {115static const char *strings[] = {"None", "Needed"};116return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, ArrayRef(strings));117}118119Error CSKYAttributeParser::fpuHardFP(unsigned tag) {120uint64_t value = de.getULEB128(cursor);121ListSeparator LS(" ");122123std::string description;124125if (value & 0x1) {126description += LS;127description += "Half";128}129if ((value >> 1) & 0x1) {130description += LS;131description += "Single";132}133if ((value >> 2) & 0x1) {134description += LS;135description += "Double";136}137138if (description.empty()) {139printAttribute(tag, value, "");140return createStringError(errc::invalid_argument,141"unknown Tag_CSKY_FPU_HARDFP value: " +142Twine(value));143}144145printAttribute(tag, value, description);146return Error::success();147}148149150