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