//===----------------------- ELFTypesTest.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/Object/ELFTypes.h" #include "gtest/gtest.h" #include using namespace llvm; using namespace llvm::object; template using Elf_Note = typename ELFT::Note; template struct NoteTestData { std::vector Data; const Elf_Note_Impl getElfNote(StringRef Name, uint32_t Type, ArrayRef Desc) { Data.resize(sizeof(Elf_Nhdr_Impl) + alignTo::Align>(Name.size()) + alignTo::Align>(Desc.size()), 0); Elf_Nhdr_Impl *Nhdr = reinterpret_cast *>(Data.data()); Nhdr->n_namesz = (Name == "") ? 0 : Name.size() + 1; Nhdr->n_descsz = Desc.size(); Nhdr->n_type = Type; auto NameOffset = Data.begin() + sizeof(*Nhdr); std::copy(Name.begin(), Name.end(), NameOffset); auto DescOffset = NameOffset + alignTo::Align>(Nhdr->n_namesz); std::copy(Desc.begin(), Desc.end(), DescOffset); return Elf_Note_Impl(*Nhdr); } }; TEST(ELFTypesTest, NoteTest) { static const uint8_t Random[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; ArrayRef RandomData = makeArrayRef(Random); NoteTestData TestData; auto Note1 = TestData.getElfNote(StringRef("AMD"), ELF::NT_AMDGPU_METADATA, RandomData); EXPECT_EQ(Note1.getName(), "AMD"); EXPECT_EQ(Note1.getType(), ELF::NT_AMDGPU_METADATA); EXPECT_EQ(Note1.getDesc(), RandomData); EXPECT_EQ(Note1.getDescAsStringRef(), StringRef(reinterpret_cast(Random), sizeof(Random))); auto Note2 = TestData.getElfNote("", ELF::NT_AMDGPU_METADATA, RandomData); EXPECT_EQ(Note2.getName(), ""); auto Note3 = TestData.getElfNote("AMD", ELF::NT_AMDGPU_METADATA, ArrayRef()); EXPECT_EQ(Note3.getDescAsStringRef(), StringRef("")); }