181ad6265SDimitry Andric //===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric
981ad6265SDimitry Andric #include "llvm/Support/CSKYAttributeParser.h"
1081ad6265SDimitry Andric #include "llvm/ADT/StringExtras.h"
1181ad6265SDimitry Andric #include "llvm/Support/Errc.h"
1281ad6265SDimitry Andric
1381ad6265SDimitry Andric using namespace llvm;
1481ad6265SDimitry Andric
1581ad6265SDimitry Andric const CSKYAttributeParser::DisplayHandler
1681ad6265SDimitry Andric CSKYAttributeParser::displayRoutines[] = {
1781ad6265SDimitry Andric {
1881ad6265SDimitry Andric CSKYAttrs::CSKY_ARCH_NAME,
1981ad6265SDimitry Andric &ELFAttributeParser::stringAttribute,
2081ad6265SDimitry Andric },
2181ad6265SDimitry Andric {
2281ad6265SDimitry Andric CSKYAttrs::CSKY_CPU_NAME,
2381ad6265SDimitry Andric &ELFAttributeParser::stringAttribute,
2481ad6265SDimitry Andric },
2581ad6265SDimitry Andric {
2681ad6265SDimitry Andric CSKYAttrs::CSKY_ISA_FLAGS,
2781ad6265SDimitry Andric &ELFAttributeParser::integerAttribute,
2881ad6265SDimitry Andric },
2981ad6265SDimitry Andric {
3081ad6265SDimitry Andric CSKYAttrs::CSKY_ISA_EXT_FLAGS,
3181ad6265SDimitry Andric &ELFAttributeParser::integerAttribute,
3281ad6265SDimitry Andric },
3381ad6265SDimitry Andric {
3481ad6265SDimitry Andric CSKYAttrs::CSKY_DSP_VERSION,
3581ad6265SDimitry Andric &CSKYAttributeParser::dspVersion,
3681ad6265SDimitry Andric },
3781ad6265SDimitry Andric {
3881ad6265SDimitry Andric CSKYAttrs::CSKY_VDSP_VERSION,
3981ad6265SDimitry Andric &CSKYAttributeParser::vdspVersion,
4081ad6265SDimitry Andric },
4181ad6265SDimitry Andric {
4281ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_VERSION,
4381ad6265SDimitry Andric &CSKYAttributeParser::fpuVersion,
4481ad6265SDimitry Andric },
4581ad6265SDimitry Andric {
4681ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_ABI,
4781ad6265SDimitry Andric &CSKYAttributeParser::fpuABI,
4881ad6265SDimitry Andric },
4981ad6265SDimitry Andric {
5081ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_ROUNDING,
5181ad6265SDimitry Andric &CSKYAttributeParser::fpuRounding,
5281ad6265SDimitry Andric },
5381ad6265SDimitry Andric {
5481ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_DENORMAL,
5581ad6265SDimitry Andric &CSKYAttributeParser::fpuDenormal,
5681ad6265SDimitry Andric },
5781ad6265SDimitry Andric {
5881ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_EXCEPTION,
5981ad6265SDimitry Andric &CSKYAttributeParser::fpuException,
6081ad6265SDimitry Andric },
6181ad6265SDimitry Andric {
6281ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_NUMBER_MODULE,
6381ad6265SDimitry Andric &ELFAttributeParser::stringAttribute,
6481ad6265SDimitry Andric },
6581ad6265SDimitry Andric {
6681ad6265SDimitry Andric CSKYAttrs::CSKY_FPU_HARDFP,
6781ad6265SDimitry Andric &CSKYAttributeParser::fpuHardFP,
6881ad6265SDimitry Andric }};
6981ad6265SDimitry Andric
handler(uint64_t tag,bool & handled)7081ad6265SDimitry Andric Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) {
7181ad6265SDimitry Andric handled = false;
72*bdd1243dSDimitry Andric for (const auto &AH : displayRoutines) {
73*bdd1243dSDimitry Andric if (uint64_t(AH.attribute) == tag) {
74*bdd1243dSDimitry Andric if (Error e = (this->*AH.routine)(tag))
7581ad6265SDimitry Andric return e;
7681ad6265SDimitry Andric handled = true;
7781ad6265SDimitry Andric break;
7881ad6265SDimitry Andric }
7981ad6265SDimitry Andric }
8081ad6265SDimitry Andric
8181ad6265SDimitry Andric return Error::success();
8281ad6265SDimitry Andric }
8381ad6265SDimitry Andric
dspVersion(unsigned tag)8481ad6265SDimitry Andric Error CSKYAttributeParser::dspVersion(unsigned tag) {
8581ad6265SDimitry Andric static const char *strings[] = {"Error", "DSP Extension", "DSP 2.0"};
86*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, ArrayRef(strings));
8781ad6265SDimitry Andric }
8881ad6265SDimitry Andric
vdspVersion(unsigned tag)8981ad6265SDimitry Andric Error CSKYAttributeParser::vdspVersion(unsigned tag) {
9081ad6265SDimitry Andric static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"};
91*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, ArrayRef(strings));
9281ad6265SDimitry Andric }
9381ad6265SDimitry Andric
fpuVersion(unsigned tag)9481ad6265SDimitry Andric Error CSKYAttributeParser::fpuVersion(unsigned tag) {
9581ad6265SDimitry Andric static const char *strings[] = {"Error", "FPU Version 1", "FPU Version 2",
9681ad6265SDimitry Andric "FPU Version 3"};
97*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, ArrayRef(strings));
9881ad6265SDimitry Andric }
9981ad6265SDimitry Andric
fpuABI(unsigned tag)10081ad6265SDimitry Andric Error CSKYAttributeParser::fpuABI(unsigned tag) {
10181ad6265SDimitry Andric static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"};
102*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, ArrayRef(strings));
10381ad6265SDimitry Andric }
10481ad6265SDimitry Andric
fpuRounding(unsigned tag)10581ad6265SDimitry Andric Error CSKYAttributeParser::fpuRounding(unsigned tag) {
10681ad6265SDimitry Andric static const char *strings[] = {"None", "Needed"};
107*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, ArrayRef(strings));
10881ad6265SDimitry Andric }
10981ad6265SDimitry Andric
fpuDenormal(unsigned tag)11081ad6265SDimitry Andric Error CSKYAttributeParser::fpuDenormal(unsigned tag) {
11181ad6265SDimitry Andric static const char *strings[] = {"None", "Needed"};
112*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, ArrayRef(strings));
11381ad6265SDimitry Andric }
11481ad6265SDimitry Andric
fpuException(unsigned tag)11581ad6265SDimitry Andric Error CSKYAttributeParser::fpuException(unsigned tag) {
11681ad6265SDimitry Andric static const char *strings[] = {"None", "Needed"};
117*bdd1243dSDimitry Andric return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, ArrayRef(strings));
11881ad6265SDimitry Andric }
11981ad6265SDimitry Andric
fpuHardFP(unsigned tag)12081ad6265SDimitry Andric Error CSKYAttributeParser::fpuHardFP(unsigned tag) {
12181ad6265SDimitry Andric uint64_t value = de.getULEB128(cursor);
12281ad6265SDimitry Andric ListSeparator LS(" ");
12381ad6265SDimitry Andric
12481ad6265SDimitry Andric std::string description;
12581ad6265SDimitry Andric
12681ad6265SDimitry Andric if (value & 0x1) {
12781ad6265SDimitry Andric description += LS;
12881ad6265SDimitry Andric description += "Half";
12981ad6265SDimitry Andric }
13081ad6265SDimitry Andric if ((value >> 1) & 0x1) {
13181ad6265SDimitry Andric description += LS;
13281ad6265SDimitry Andric description += "Single";
13381ad6265SDimitry Andric }
13481ad6265SDimitry Andric if ((value >> 2) & 0x1) {
13581ad6265SDimitry Andric description += LS;
13681ad6265SDimitry Andric description += "Double";
13781ad6265SDimitry Andric }
13881ad6265SDimitry Andric
13981ad6265SDimitry Andric if (description.empty()) {
14081ad6265SDimitry Andric printAttribute(tag, value, "");
14181ad6265SDimitry Andric return createStringError(errc::invalid_argument,
14281ad6265SDimitry Andric "unknown Tag_CSKY_FPU_HARDFP value: " +
14381ad6265SDimitry Andric Twine(value));
14481ad6265SDimitry Andric }
14581ad6265SDimitry Andric
14681ad6265SDimitry Andric printAttribute(tag, value, description);
14781ad6265SDimitry Andric return Error::success();
14881ad6265SDimitry Andric }
149