1581ba352SKai Wang //===----- unittests/RISCVAttributeParserTest.cpp -------------------------===// 2581ba352SKai Wang // 3581ba352SKai Wang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4581ba352SKai Wang // See https://llvm.org/LICENSE.txt for license information. 5581ba352SKai Wang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6581ba352SKai Wang // 7581ba352SKai Wang //===----------------------------------------------------------------------===// 8581ba352SKai Wang #include "llvm/Support/RISCVAttributeParser.h" 9581ba352SKai Wang #include "llvm/Support/ARMBuildAttributes.h" 10581ba352SKai Wang #include "llvm/Support/ELFAttributes.h" 11581ba352SKai Wang #include "gtest/gtest.h" 12581ba352SKai Wang #include <string> 13581ba352SKai Wang 14581ba352SKai Wang using namespace llvm; 15581ba352SKai Wang 16581ba352SKai Wang struct RISCVAttributeSection { 17581ba352SKai Wang unsigned Tag; 18581ba352SKai Wang unsigned Value; 19581ba352SKai Wang 20581ba352SKai Wang RISCVAttributeSection(unsigned tag, unsigned value) 21581ba352SKai Wang : Tag(tag), Value(value) {} 22581ba352SKai Wang 23581ba352SKai Wang void write(raw_ostream &OS) { 24581ba352SKai Wang OS.flush(); 25581ba352SKai Wang // length = length + "riscv\0" + TagFile + ByteSize + Tag + Value; 26581ba352SKai Wang // length = 17 bytes 27581ba352SKai Wang 28581ba352SKai Wang OS << 'A' << (uint8_t)17 << (uint8_t)0 << (uint8_t)0 << (uint8_t)0; 29581ba352SKai Wang OS << "riscv" << '\0'; 30581ba352SKai Wang OS << (uint8_t)1 << (uint8_t)7 << (uint8_t)0 << (uint8_t)0 << (uint8_t)0; 31581ba352SKai Wang OS << (uint8_t)Tag << (uint8_t)Value; 32581ba352SKai Wang } 33581ba352SKai Wang }; 34581ba352SKai Wang 35581ba352SKai Wang static bool testAttribute(unsigned Tag, unsigned Value, unsigned ExpectedTag, 36581ba352SKai Wang unsigned ExpectedValue) { 37581ba352SKai Wang std::string buffer; 38581ba352SKai Wang raw_string_ostream OS(buffer); 39581ba352SKai Wang RISCVAttributeSection Section(Tag, Value); 40581ba352SKai Wang Section.write(OS); 41*459a82e6SJOE1994 ArrayRef<uint8_t> Bytes(reinterpret_cast<const uint8_t *>(buffer.c_str()), 42*459a82e6SJOE1994 buffer.size()); 43581ba352SKai Wang 44581ba352SKai Wang RISCVAttributeParser Parser; 454a0ccfa8SKazu Hirata cantFail(Parser.parse(Bytes, llvm::endianness::little)); 46581ba352SKai Wang 476aebb5d1SFangrui Song std::optional<unsigned> Attr = Parser.getAttributeValue(ExpectedTag); 48d152e50cSKazu Hirata return Attr && *Attr == ExpectedValue; 49581ba352SKai Wang } 50581ba352SKai Wang 51581ba352SKai Wang static bool testTagString(unsigned Tag, const char *name) { 5276374573SMehdi Amini return ELFAttrs::attrTypeAsString(Tag, RISCVAttrs::getRISCVAttributeTags()) 53581ba352SKai Wang .str() == name; 54581ba352SKai Wang } 55581ba352SKai Wang 56581ba352SKai Wang TEST(StackAlign, testAttribute) { 57581ba352SKai Wang EXPECT_TRUE(testTagString(4, "Tag_stack_align")); 5880ee6083SCraig Topper EXPECT_TRUE(testAttribute(4, 4, RISCVAttrs::STACK_ALIGN, 4)); 5980ee6083SCraig Topper EXPECT_TRUE(testAttribute(4, 16, RISCVAttrs::STACK_ALIGN, 16)); 60581ba352SKai Wang } 61581ba352SKai Wang 62581ba352SKai Wang TEST(UnalignedAccess, testAttribute) { 63581ba352SKai Wang EXPECT_TRUE(testTagString(6, "Tag_unaligned_access")); 64581ba352SKai Wang EXPECT_TRUE(testAttribute(6, 0, RISCVAttrs::UNALIGNED_ACCESS, 65581ba352SKai Wang RISCVAttrs::NOT_ALLOWED)); 66581ba352SKai Wang EXPECT_TRUE( 67581ba352SKai Wang testAttribute(6, 1, RISCVAttrs::UNALIGNED_ACCESS, RISCVAttrs::ALLOWED)); 68581ba352SKai Wang } 69