xref: /llvm-project/llvm/unittests/Support/RISCVAttributeParserTest.cpp (revision 459a82e6890ff41e30d486f36c8c7ec22628bb7a)
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