xref: /freebsd-src/contrib/llvm-project/llvm/lib/Support/RISCVAttributeParser.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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 
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 
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 
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 
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