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