xref: /freebsd-src/contrib/llvm-project/llvm/lib/Support/MSP430AttributeParser.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1*349cc55cSDimitry Andric //===-- MSP430AttributeParser.cpp - MSP430 Attribute Parser ---------------===//
2*349cc55cSDimitry Andric //
3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*349cc55cSDimitry Andric //
7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8*349cc55cSDimitry Andric 
9*349cc55cSDimitry Andric #include "llvm/Support/MSP430AttributeParser.h"
10*349cc55cSDimitry Andric #include "llvm/ADT/StringExtras.h"
11*349cc55cSDimitry Andric 
12*349cc55cSDimitry Andric using namespace llvm;
13*349cc55cSDimitry Andric using namespace llvm::MSP430Attrs;
14*349cc55cSDimitry Andric 
15*349cc55cSDimitry Andric constexpr std::array<MSP430AttributeParser::DisplayHandler, 4>
16*349cc55cSDimitry Andric     MSP430AttributeParser::DisplayRoutines{
17*349cc55cSDimitry Andric         {{MSP430Attrs::TagISA, &MSP430AttributeParser::parseISA},
18*349cc55cSDimitry Andric          {MSP430Attrs::TagCodeModel, &MSP430AttributeParser::parseCodeModel},
19*349cc55cSDimitry Andric          {MSP430Attrs::TagDataModel, &MSP430AttributeParser::parseDataModel},
20*349cc55cSDimitry Andric          {MSP430Attrs::TagEnumSize, &MSP430AttributeParser::parseEnumSize}}};
21*349cc55cSDimitry Andric 
22*349cc55cSDimitry Andric Error MSP430AttributeParser::parseISA(AttrType Tag) {
23*349cc55cSDimitry Andric   static const char *StringVals[] = {"None", "MSP430", "MSP430X"};
24*349cc55cSDimitry Andric   return parseStringAttribute("ISA", Tag, makeArrayRef(StringVals));
25*349cc55cSDimitry Andric }
26*349cc55cSDimitry Andric 
27*349cc55cSDimitry Andric Error MSP430AttributeParser::parseCodeModel(AttrType Tag) {
28*349cc55cSDimitry Andric   static const char *StringVals[] = {"None", "Small", "Large"};
29*349cc55cSDimitry Andric   return parseStringAttribute("Code Model", Tag, makeArrayRef(StringVals));
30*349cc55cSDimitry Andric }
31*349cc55cSDimitry Andric 
32*349cc55cSDimitry Andric Error MSP430AttributeParser::parseDataModel(AttrType Tag) {
33*349cc55cSDimitry Andric   static const char *StringVals[] = {"None", "Small", "Large", "Restricted"};
34*349cc55cSDimitry Andric   return parseStringAttribute("Data Model", Tag, makeArrayRef(StringVals));
35*349cc55cSDimitry Andric }
36*349cc55cSDimitry Andric 
37*349cc55cSDimitry Andric Error MSP430AttributeParser::parseEnumSize(AttrType Tag) {
38*349cc55cSDimitry Andric   static const char *StringVals[] = {"None", "Small", "Integer", "Don't Care"};
39*349cc55cSDimitry Andric   return parseStringAttribute("Enum Size", Tag, makeArrayRef(StringVals));
40*349cc55cSDimitry Andric }
41*349cc55cSDimitry Andric 
42*349cc55cSDimitry Andric Error MSP430AttributeParser::handler(uint64_t Tag, bool &Handled) {
43*349cc55cSDimitry Andric   Handled = false;
44*349cc55cSDimitry Andric   for (const DisplayHandler &Disp : DisplayRoutines) {
45*349cc55cSDimitry Andric     if (uint64_t(Disp.Attribute) != Tag)
46*349cc55cSDimitry Andric       continue;
47*349cc55cSDimitry Andric     if (Error E = (this->*Disp.Routine)(static_cast<AttrType>(Tag)))
48*349cc55cSDimitry Andric       return E;
49*349cc55cSDimitry Andric     Handled = true;
50*349cc55cSDimitry Andric     break;
51*349cc55cSDimitry Andric   }
52*349cc55cSDimitry Andric   return Error::success();
53*349cc55cSDimitry Andric }
54