xref: /src/contrib/llvm-project/llvm/lib/Support/CSKYAttributeParser.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1145449b1SDimitry Andric //===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===//
2145449b1SDimitry Andric //
3145449b1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4145449b1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5145449b1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6145449b1SDimitry Andric //
7145449b1SDimitry Andric //===----------------------------------------------------------------------===//
8145449b1SDimitry Andric 
9145449b1SDimitry Andric #include "llvm/Support/CSKYAttributeParser.h"
10145449b1SDimitry Andric #include "llvm/ADT/StringExtras.h"
11145449b1SDimitry Andric #include "llvm/Support/Errc.h"
12145449b1SDimitry Andric 
13145449b1SDimitry Andric using namespace llvm;
14145449b1SDimitry Andric 
15145449b1SDimitry Andric const CSKYAttributeParser::DisplayHandler
16145449b1SDimitry Andric     CSKYAttributeParser::displayRoutines[] = {
17145449b1SDimitry Andric         {
18145449b1SDimitry Andric             CSKYAttrs::CSKY_ARCH_NAME,
19145449b1SDimitry Andric             &ELFAttributeParser::stringAttribute,
20145449b1SDimitry Andric         },
21145449b1SDimitry Andric         {
22145449b1SDimitry Andric             CSKYAttrs::CSKY_CPU_NAME,
23145449b1SDimitry Andric             &ELFAttributeParser::stringAttribute,
24145449b1SDimitry Andric         },
25145449b1SDimitry Andric         {
26145449b1SDimitry Andric             CSKYAttrs::CSKY_ISA_FLAGS,
27145449b1SDimitry Andric             &ELFAttributeParser::integerAttribute,
28145449b1SDimitry Andric         },
29145449b1SDimitry Andric         {
30145449b1SDimitry Andric             CSKYAttrs::CSKY_ISA_EXT_FLAGS,
31145449b1SDimitry Andric             &ELFAttributeParser::integerAttribute,
32145449b1SDimitry Andric         },
33145449b1SDimitry Andric         {
34145449b1SDimitry Andric             CSKYAttrs::CSKY_DSP_VERSION,
35145449b1SDimitry Andric             &CSKYAttributeParser::dspVersion,
36145449b1SDimitry Andric         },
37145449b1SDimitry Andric         {
38145449b1SDimitry Andric             CSKYAttrs::CSKY_VDSP_VERSION,
39145449b1SDimitry Andric             &CSKYAttributeParser::vdspVersion,
40145449b1SDimitry Andric         },
41145449b1SDimitry Andric         {
42145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_VERSION,
43145449b1SDimitry Andric             &CSKYAttributeParser::fpuVersion,
44145449b1SDimitry Andric         },
45145449b1SDimitry Andric         {
46145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_ABI,
47145449b1SDimitry Andric             &CSKYAttributeParser::fpuABI,
48145449b1SDimitry Andric         },
49145449b1SDimitry Andric         {
50145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_ROUNDING,
51145449b1SDimitry Andric             &CSKYAttributeParser::fpuRounding,
52145449b1SDimitry Andric         },
53145449b1SDimitry Andric         {
54145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_DENORMAL,
55145449b1SDimitry Andric             &CSKYAttributeParser::fpuDenormal,
56145449b1SDimitry Andric         },
57145449b1SDimitry Andric         {
58145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_EXCEPTION,
59145449b1SDimitry Andric             &CSKYAttributeParser::fpuException,
60145449b1SDimitry Andric         },
61145449b1SDimitry Andric         {
62145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_NUMBER_MODULE,
63145449b1SDimitry Andric             &ELFAttributeParser::stringAttribute,
64145449b1SDimitry Andric         },
65145449b1SDimitry Andric         {
66145449b1SDimitry Andric             CSKYAttrs::CSKY_FPU_HARDFP,
67145449b1SDimitry Andric             &CSKYAttributeParser::fpuHardFP,
68145449b1SDimitry Andric         }};
69145449b1SDimitry Andric 
handler(uint64_t tag,bool & handled)70145449b1SDimitry Andric Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) {
71145449b1SDimitry Andric   handled = false;
72e3b55780SDimitry Andric   for (const auto &AH : displayRoutines) {
73e3b55780SDimitry Andric     if (uint64_t(AH.attribute) == tag) {
74e3b55780SDimitry Andric       if (Error e = (this->*AH.routine)(tag))
75145449b1SDimitry Andric         return e;
76145449b1SDimitry Andric       handled = true;
77145449b1SDimitry Andric       break;
78145449b1SDimitry Andric     }
79145449b1SDimitry Andric   }
80145449b1SDimitry Andric 
81145449b1SDimitry Andric   return Error::success();
82145449b1SDimitry Andric }
83145449b1SDimitry Andric 
dspVersion(unsigned tag)84145449b1SDimitry Andric Error CSKYAttributeParser::dspVersion(unsigned tag) {
85145449b1SDimitry Andric   static const char *strings[] = {"Error", "DSP Extension", "DSP 2.0"};
86e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, ArrayRef(strings));
87145449b1SDimitry Andric }
88145449b1SDimitry Andric 
vdspVersion(unsigned tag)89145449b1SDimitry Andric Error CSKYAttributeParser::vdspVersion(unsigned tag) {
90145449b1SDimitry Andric   static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"};
91e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, ArrayRef(strings));
92145449b1SDimitry Andric }
93145449b1SDimitry Andric 
fpuVersion(unsigned tag)94145449b1SDimitry Andric Error CSKYAttributeParser::fpuVersion(unsigned tag) {
95145449b1SDimitry Andric   static const char *strings[] = {"Error", "FPU Version 1", "FPU Version 2",
96145449b1SDimitry Andric                                   "FPU Version 3"};
97e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, ArrayRef(strings));
98145449b1SDimitry Andric }
99145449b1SDimitry Andric 
fpuABI(unsigned tag)100145449b1SDimitry Andric Error CSKYAttributeParser::fpuABI(unsigned tag) {
101145449b1SDimitry Andric   static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"};
102e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, ArrayRef(strings));
103145449b1SDimitry Andric }
104145449b1SDimitry Andric 
fpuRounding(unsigned tag)105145449b1SDimitry Andric Error CSKYAttributeParser::fpuRounding(unsigned tag) {
106145449b1SDimitry Andric   static const char *strings[] = {"None", "Needed"};
107e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, ArrayRef(strings));
108145449b1SDimitry Andric }
109145449b1SDimitry Andric 
fpuDenormal(unsigned tag)110145449b1SDimitry Andric Error CSKYAttributeParser::fpuDenormal(unsigned tag) {
111145449b1SDimitry Andric   static const char *strings[] = {"None", "Needed"};
112e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, ArrayRef(strings));
113145449b1SDimitry Andric }
114145449b1SDimitry Andric 
fpuException(unsigned tag)115145449b1SDimitry Andric Error CSKYAttributeParser::fpuException(unsigned tag) {
116145449b1SDimitry Andric   static const char *strings[] = {"None", "Needed"};
117e3b55780SDimitry Andric   return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, ArrayRef(strings));
118145449b1SDimitry Andric }
119145449b1SDimitry Andric 
fpuHardFP(unsigned tag)120145449b1SDimitry Andric Error CSKYAttributeParser::fpuHardFP(unsigned tag) {
121145449b1SDimitry Andric   uint64_t value = de.getULEB128(cursor);
122145449b1SDimitry Andric   ListSeparator LS(" ");
123145449b1SDimitry Andric 
124145449b1SDimitry Andric   std::string description;
125145449b1SDimitry Andric 
126145449b1SDimitry Andric   if (value & 0x1) {
127145449b1SDimitry Andric     description += LS;
128145449b1SDimitry Andric     description += "Half";
129145449b1SDimitry Andric   }
130145449b1SDimitry Andric   if ((value >> 1) & 0x1) {
131145449b1SDimitry Andric     description += LS;
132145449b1SDimitry Andric     description += "Single";
133145449b1SDimitry Andric   }
134145449b1SDimitry Andric   if ((value >> 2) & 0x1) {
135145449b1SDimitry Andric     description += LS;
136145449b1SDimitry Andric     description += "Double";
137145449b1SDimitry Andric   }
138145449b1SDimitry Andric 
139145449b1SDimitry Andric   if (description.empty()) {
140145449b1SDimitry Andric     printAttribute(tag, value, "");
141145449b1SDimitry Andric     return createStringError(errc::invalid_argument,
142145449b1SDimitry Andric                              "unknown Tag_CSKY_FPU_HARDFP value: " +
143145449b1SDimitry Andric                                  Twine(value));
144145449b1SDimitry Andric   }
145145449b1SDimitry Andric 
146145449b1SDimitry Andric   printAttribute(tag, value, description);
147145449b1SDimitry Andric   return Error::success();
148145449b1SDimitry Andric }
149