173
|
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
|
|
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
|
|
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
|
|
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 }
|