1 //===----- unittests/RISCVAttributeParserTest.cpp -------------------------===// 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 #include "llvm/Support/RISCVAttributeParser.h" 9 #include "llvm/Support/ARMBuildAttributes.h" 10 #include "llvm/Support/ELFAttributes.h" 11 #include "gtest/gtest.h" 12 #include <string> 13 14 using namespace llvm; 15 16 struct RISCVAttributeSection { 17 unsigned Tag; 18 unsigned Value; 19 20 RISCVAttributeSection(unsigned tag, unsigned value) 21 : Tag(tag), Value(value) {} 22 23 void write(raw_ostream &OS) { 24 OS.flush(); 25 // length = length + "riscv\0" + TagFile + ByteSize + Tag + Value; 26 // length = 17 bytes 27 28 OS << 'A' << (uint8_t)17 << (uint8_t)0 << (uint8_t)0 << (uint8_t)0; 29 OS << "riscv" << '\0'; 30 OS << (uint8_t)1 << (uint8_t)7 << (uint8_t)0 << (uint8_t)0 << (uint8_t)0; 31 OS << (uint8_t)Tag << (uint8_t)Value; 32 } 33 }; 34 35 static bool testAttribute(unsigned Tag, unsigned Value, unsigned ExpectedTag, 36 unsigned ExpectedValue) { 37 std::string buffer; 38 raw_string_ostream OS(buffer); 39 RISCVAttributeSection Section(Tag, Value); 40 Section.write(OS); 41 ArrayRef<uint8_t> Bytes(reinterpret_cast<const uint8_t *>(buffer.c_str()), 42 buffer.size()); 43 44 RISCVAttributeParser Parser; 45 cantFail(Parser.parse(Bytes, llvm::endianness::little)); 46 47 std::optional<unsigned> Attr = Parser.getAttributeValue(ExpectedTag); 48 return Attr && *Attr == ExpectedValue; 49 } 50 51 static bool testTagString(unsigned Tag, const char *name) { 52 return ELFAttrs::attrTypeAsString(Tag, RISCVAttrs::getRISCVAttributeTags()) 53 .str() == name; 54 } 55 56 TEST(StackAlign, testAttribute) { 57 EXPECT_TRUE(testTagString(4, "Tag_stack_align")); 58 EXPECT_TRUE(testAttribute(4, 4, RISCVAttrs::STACK_ALIGN, 4)); 59 EXPECT_TRUE(testAttribute(4, 16, RISCVAttrs::STACK_ALIGN, 16)); 60 } 61 62 TEST(UnalignedAccess, testAttribute) { 63 EXPECT_TRUE(testTagString(6, "Tag_unaligned_access")); 64 EXPECT_TRUE(testAttribute(6, 0, RISCVAttrs::UNALIGNED_ACCESS, 65 RISCVAttrs::NOT_ALLOWED)); 66 EXPECT_TRUE( 67 testAttribute(6, 1, RISCVAttrs::UNALIGNED_ACCESS, RISCVAttrs::ALLOWED)); 68 } 69