1 //===-- RISCVAttributeParser.cpp - RISCV Attribute Parser -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/Support/RISCVAttributeParser.h"
10 #include "llvm/ADT/StringExtras.h"
11
12 using namespace llvm;
13
14 const RISCVAttributeParser::DisplayHandler
15 RISCVAttributeParser::displayRoutines[] = {
16 {
17 RISCVAttrs::ARCH,
18 &ELFAttributeParser::stringAttribute,
19 },
20 {
21 RISCVAttrs::PRIV_SPEC,
22 &ELFAttributeParser::integerAttribute,
23 },
24 {
25 RISCVAttrs::PRIV_SPEC_MINOR,
26 &ELFAttributeParser::integerAttribute,
27 },
28 {
29 RISCVAttrs::PRIV_SPEC_REVISION,
30 &ELFAttributeParser::integerAttribute,
31 },
32 {
33 RISCVAttrs::STACK_ALIGN,
34 &RISCVAttributeParser::stackAlign,
35 },
36 {
37 RISCVAttrs::UNALIGNED_ACCESS,
38 &RISCVAttributeParser::unalignedAccess,
39 }};
40
unalignedAccess(unsigned tag)41 Error RISCVAttributeParser::unalignedAccess(unsigned tag) {
42 static const char *strings[] = {"No unaligned access", "Unaligned access"};
43 return parseStringAttribute("Unaligned_access", tag, makeArrayRef(strings));
44 }
45
stackAlign(unsigned tag)46 Error RISCVAttributeParser::stackAlign(unsigned tag) {
47 uint64_t value = de.getULEB128(cursor);
48 std::string description =
49 "Stack alignment is " + utostr(value) + std::string("-bytes");
50 printAttribute(tag, value, description);
51 return Error::success();
52 }
53
handler(uint64_t tag,bool & handled)54 Error RISCVAttributeParser::handler(uint64_t tag, bool &handled) {
55 handled = false;
56 for (unsigned AHI = 0, AHE = array_lengthof(displayRoutines); AHI != AHE;
57 ++AHI) {
58 if (uint64_t(displayRoutines[AHI].attribute) == tag) {
59 if (Error e = (this->*displayRoutines[AHI].routine)(tag))
60 return e;
61 handled = true;
62 break;
63 }
64 }
65
66 return Error::success();
67 }
68