1581ba352SKai Wang //===-- RISCVAttributeParser.cpp - RISCV Attribute Parser -----------------===//
2581ba352SKai Wang //
3581ba352SKai Wang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4581ba352SKai Wang // See https://llvm.org/LICENSE.txt for license information.
5581ba352SKai Wang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6581ba352SKai Wang //
7581ba352SKai Wang //===----------------------------------------------------------------------===//
8581ba352SKai Wang 
9581ba352SKai Wang #include "llvm/Support/RISCVAttributeParser.h"
10581ba352SKai Wang #include "llvm/ADT/StringExtras.h"
11581ba352SKai Wang 
12581ba352SKai Wang using namespace llvm;
13581ba352SKai Wang 
14581ba352SKai Wang const RISCVAttributeParser::DisplayHandler
15581ba352SKai Wang     RISCVAttributeParser::displayRoutines[] = {
16581ba352SKai Wang         {
17581ba352SKai Wang             RISCVAttrs::ARCH,
18581ba352SKai Wang             &ELFAttributeParser::stringAttribute,
19581ba352SKai Wang         },
20581ba352SKai Wang         {
21581ba352SKai Wang             RISCVAttrs::PRIV_SPEC,
22581ba352SKai Wang             &ELFAttributeParser::integerAttribute,
23581ba352SKai Wang         },
24581ba352SKai Wang         {
25581ba352SKai Wang             RISCVAttrs::PRIV_SPEC_MINOR,
26581ba352SKai Wang             &ELFAttributeParser::integerAttribute,
27581ba352SKai Wang         },
28581ba352SKai Wang         {
29581ba352SKai Wang             RISCVAttrs::PRIV_SPEC_REVISION,
30581ba352SKai Wang             &ELFAttributeParser::integerAttribute,
31581ba352SKai Wang         },
32581ba352SKai Wang         {
33581ba352SKai Wang             RISCVAttrs::STACK_ALIGN,
34581ba352SKai Wang             &RISCVAttributeParser::stackAlign,
35581ba352SKai Wang         },
36581ba352SKai Wang         {
37581ba352SKai Wang             RISCVAttrs::UNALIGNED_ACCESS,
38581ba352SKai Wang             &RISCVAttributeParser::unalignedAccess,
39581ba352SKai Wang         }};
40581ba352SKai Wang 
unalignedAccess(unsigned tag)41581ba352SKai Wang Error RISCVAttributeParser::unalignedAccess(unsigned tag) {
42581ba352SKai Wang   static const char *strings[] = {"No unaligned access", "Unaligned access"};
43581ba352SKai Wang   return parseStringAttribute("Unaligned_access", tag, makeArrayRef(strings));
44581ba352SKai Wang }
45581ba352SKai Wang 
stackAlign(unsigned tag)46581ba352SKai Wang Error RISCVAttributeParser::stackAlign(unsigned tag) {
47581ba352SKai Wang   uint64_t value = de.getULEB128(cursor);
48581ba352SKai Wang   std::string description =
49581ba352SKai Wang       "Stack alignment is " + utostr(value) + std::string("-bytes");
50581ba352SKai Wang   printAttribute(tag, value, description);
51581ba352SKai Wang   return Error::success();
52581ba352SKai Wang }
53581ba352SKai Wang 
handler(uint64_t tag,bool & handled)54581ba352SKai Wang Error RISCVAttributeParser::handler(uint64_t tag, bool &handled) {
55581ba352SKai Wang   handled = false;
56*f15014ffSBenjamin Kramer   for (unsigned AHI = 0, AHE = array_lengthof(displayRoutines); AHI != AHE;
57581ba352SKai Wang        ++AHI) {
58581ba352SKai Wang     if (uint64_t(displayRoutines[AHI].attribute) == tag) {
59581ba352SKai Wang       if (Error e = (this->*displayRoutines[AHI].routine)(tag))
60581ba352SKai Wang         return e;
61581ba352SKai Wang       handled = true;
62581ba352SKai Wang       break;
63581ba352SKai Wang     }
64581ba352SKai Wang   }
65581ba352SKai Wang 
66581ba352SKai Wang   return Error::success();
67581ba352SKai Wang }
68