| //===-- RISCVAttributeParser.cpp - RISCV Attribute Parser -----------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Support/RISCVAttributeParser.h" |
| #include "llvm/ADT/StringExtras.h" |
| |
| using namespace llvm; |
| |
| const RISCVAttributeParser::DisplayHandler |
| RISCVAttributeParser::displayRoutines[] = { |
| { |
| RISCVAttrs::ARCH, |
| &ELFAttributeParser::stringAttribute, |
| }, |
| { |
| RISCVAttrs::PRIV_SPEC, |
| &ELFAttributeParser::integerAttribute, |
| }, |
| { |
| RISCVAttrs::PRIV_SPEC_MINOR, |
| &ELFAttributeParser::integerAttribute, |
| }, |
| { |
| RISCVAttrs::PRIV_SPEC_REVISION, |
| &ELFAttributeParser::integerAttribute, |
| }, |
| { |
| RISCVAttrs::STACK_ALIGN, |
| &RISCVAttributeParser::stackAlign, |
| }, |
| { |
| RISCVAttrs::UNALIGNED_ACCESS, |
| &RISCVAttributeParser::unalignedAccess, |
| }}; |
| |
| Error RISCVAttributeParser::unalignedAccess(unsigned tag) { |
| static const char *strings[] = {"No unaligned access", "Unaligned access"}; |
| return parseStringAttribute("Unaligned_access", tag, ArrayRef(strings)); |
| } |
| |
| Error RISCVAttributeParser::stackAlign(unsigned tag) { |
| uint64_t value = de.getULEB128(cursor); |
| std::string description = |
| "Stack alignment is " + utostr(value) + std::string("-bytes"); |
| printAttribute(tag, value, description); |
| return Error::success(); |
| } |
| |
| Error RISCVAttributeParser::handler(uint64_t tag, bool &handled) { |
| handled = false; |
| for (const auto &AH : displayRoutines) { |
| if (uint64_t(AH.attribute) == tag) { |
| if (Error e = (this->*AH.routine)(tag)) |
| return e; |
| handled = true; |
| break; |
| } |
| } |
| |
| return Error::success(); |
| } |