mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
055a23f745
Leverage ARM ELF build attribute section to create ELF attribute section for RISC-V. Extract the common part of parsing logic for this section into ELFAttributeParser.[cpp|h] and ELFAttributes.[cpp|h]. Differential Revision: https://reviews.llvm.org/D74023
71 lines
2.4 KiB
C++
71 lines
2.4 KiB
C++
//===----- unittests/RISCVAttributeParserTest.cpp -------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "llvm/Support/RISCVAttributeParser.h"
|
|
#include "llvm/Support/ARMBuildAttributes.h"
|
|
#include "llvm/Support/ELFAttributes.h"
|
|
#include "gtest/gtest.h"
|
|
#include <string>
|
|
|
|
using namespace llvm;
|
|
|
|
struct RISCVAttributeSection {
|
|
unsigned Tag;
|
|
unsigned Value;
|
|
|
|
RISCVAttributeSection(unsigned tag, unsigned value)
|
|
: Tag(tag), Value(value) {}
|
|
|
|
void write(raw_ostream &OS) {
|
|
OS.flush();
|
|
// length = length + "riscv\0" + TagFile + ByteSize + Tag + Value;
|
|
// length = 17 bytes
|
|
|
|
OS << 'A' << (uint8_t)17 << (uint8_t)0 << (uint8_t)0 << (uint8_t)0;
|
|
OS << "riscv" << '\0';
|
|
OS << (uint8_t)1 << (uint8_t)7 << (uint8_t)0 << (uint8_t)0 << (uint8_t)0;
|
|
OS << (uint8_t)Tag << (uint8_t)Value;
|
|
}
|
|
};
|
|
|
|
static bool testAttribute(unsigned Tag, unsigned Value, unsigned ExpectedTag,
|
|
unsigned ExpectedValue) {
|
|
std::string buffer;
|
|
raw_string_ostream OS(buffer);
|
|
RISCVAttributeSection Section(Tag, Value);
|
|
Section.write(OS);
|
|
ArrayRef<uint8_t> Bytes(reinterpret_cast<const uint8_t *>(OS.str().c_str()),
|
|
OS.str().size());
|
|
|
|
RISCVAttributeParser Parser;
|
|
cantFail(Parser.parse(Bytes, support::little));
|
|
|
|
Optional<unsigned> Attr = Parser.getAttributeValue(ExpectedTag);
|
|
return Attr.hasValue() && Attr.getValue() == ExpectedValue;
|
|
}
|
|
|
|
static bool testTagString(unsigned Tag, const char *name) {
|
|
return ELFAttrs::attrTypeAsString(Tag, RISCVAttrs::RISCVAttributeTags)
|
|
.str() == name;
|
|
}
|
|
|
|
TEST(StackAlign, testAttribute) {
|
|
EXPECT_TRUE(testTagString(4, "Tag_stack_align"));
|
|
EXPECT_TRUE(
|
|
testAttribute(4, 4, RISCVAttrs::STACK_ALIGN, RISCVAttrs::ALIGN_4));
|
|
EXPECT_TRUE(
|
|
testAttribute(4, 16, RISCVAttrs::STACK_ALIGN, RISCVAttrs::ALIGN_16));
|
|
}
|
|
|
|
TEST(UnalignedAccess, testAttribute) {
|
|
EXPECT_TRUE(testTagString(6, "Tag_unaligned_access"));
|
|
EXPECT_TRUE(testAttribute(6, 0, RISCVAttrs::UNALIGNED_ACCESS,
|
|
RISCVAttrs::NOT_ALLOWED));
|
|
EXPECT_TRUE(
|
|
testAttribute(6, 1, RISCVAttrs::UNALIGNED_ACCESS, RISCVAttrs::ALLOWED));
|
|
}
|