15ffd83dbSDimitry Andric //===-- RISCVAttributeParser.cpp - RISCV Attribute Parser -----------------===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric
95ffd83dbSDimitry Andric #include "llvm/Support/RISCVAttributeParser.h"
105ffd83dbSDimitry Andric #include "llvm/ADT/StringExtras.h"
115ffd83dbSDimitry Andric
125ffd83dbSDimitry Andric using namespace llvm;
135ffd83dbSDimitry Andric
145ffd83dbSDimitry Andric const RISCVAttributeParser::DisplayHandler
155ffd83dbSDimitry Andric RISCVAttributeParser::displayRoutines[] = {
165ffd83dbSDimitry Andric {
175ffd83dbSDimitry Andric RISCVAttrs::ARCH,
185ffd83dbSDimitry Andric &ELFAttributeParser::stringAttribute,
195ffd83dbSDimitry Andric },
205ffd83dbSDimitry Andric {
215ffd83dbSDimitry Andric RISCVAttrs::PRIV_SPEC,
225ffd83dbSDimitry Andric &ELFAttributeParser::integerAttribute,
235ffd83dbSDimitry Andric },
245ffd83dbSDimitry Andric {
255ffd83dbSDimitry Andric RISCVAttrs::PRIV_SPEC_MINOR,
265ffd83dbSDimitry Andric &ELFAttributeParser::integerAttribute,
275ffd83dbSDimitry Andric },
285ffd83dbSDimitry Andric {
295ffd83dbSDimitry Andric RISCVAttrs::PRIV_SPEC_REVISION,
305ffd83dbSDimitry Andric &ELFAttributeParser::integerAttribute,
315ffd83dbSDimitry Andric },
325ffd83dbSDimitry Andric {
335ffd83dbSDimitry Andric RISCVAttrs::STACK_ALIGN,
345ffd83dbSDimitry Andric &RISCVAttributeParser::stackAlign,
355ffd83dbSDimitry Andric },
365ffd83dbSDimitry Andric {
375ffd83dbSDimitry Andric RISCVAttrs::UNALIGNED_ACCESS,
385ffd83dbSDimitry Andric &RISCVAttributeParser::unalignedAccess,
39*0fca6ea1SDimitry Andric },
40*0fca6ea1SDimitry Andric {
41*0fca6ea1SDimitry Andric RISCVAttrs::ATOMIC_ABI,
42*0fca6ea1SDimitry Andric &RISCVAttributeParser::atomicAbi,
43*0fca6ea1SDimitry Andric },
44*0fca6ea1SDimitry Andric };
45*0fca6ea1SDimitry Andric
atomicAbi(unsigned Tag)46*0fca6ea1SDimitry Andric Error RISCVAttributeParser::atomicAbi(unsigned Tag) {
47*0fca6ea1SDimitry Andric uint64_t Value = de.getULEB128(cursor);
48*0fca6ea1SDimitry Andric printAttribute(Tag, Value, "Atomic ABI is " + utostr(Value));
49*0fca6ea1SDimitry Andric return Error::success();
50*0fca6ea1SDimitry Andric }
515ffd83dbSDimitry Andric
unalignedAccess(unsigned tag)525ffd83dbSDimitry Andric Error RISCVAttributeParser::unalignedAccess(unsigned tag) {
535ffd83dbSDimitry Andric static const char *strings[] = {"No unaligned access", "Unaligned access"};
54bdd1243dSDimitry Andric return parseStringAttribute("Unaligned_access", tag, ArrayRef(strings));
555ffd83dbSDimitry Andric }
565ffd83dbSDimitry Andric
stackAlign(unsigned tag)575ffd83dbSDimitry Andric Error RISCVAttributeParser::stackAlign(unsigned tag) {
585ffd83dbSDimitry Andric uint64_t value = de.getULEB128(cursor);
595ffd83dbSDimitry Andric std::string description =
605ffd83dbSDimitry Andric "Stack alignment is " + utostr(value) + std::string("-bytes");
615ffd83dbSDimitry Andric printAttribute(tag, value, description);
625ffd83dbSDimitry Andric return Error::success();
635ffd83dbSDimitry Andric }
645ffd83dbSDimitry Andric
handler(uint64_t tag,bool & handled)655ffd83dbSDimitry Andric Error RISCVAttributeParser::handler(uint64_t tag, bool &handled) {
665ffd83dbSDimitry Andric handled = false;
67bdd1243dSDimitry Andric for (const auto &AH : displayRoutines) {
68bdd1243dSDimitry Andric if (uint64_t(AH.attribute) == tag) {
69bdd1243dSDimitry Andric if (Error e = (this->*AH.routine)(tag))
705ffd83dbSDimitry Andric return e;
715ffd83dbSDimitry Andric handled = true;
725ffd83dbSDimitry Andric break;
735ffd83dbSDimitry Andric }
745ffd83dbSDimitry Andric }
755ffd83dbSDimitry Andric
765ffd83dbSDimitry Andric return Error::success();
775ffd83dbSDimitry Andric }
78