14a025622SSebastian Neubauer //===- llvm/unittest/CodeGen/AMDGPUMetadataTest.cpp -----------------------===//
24a025622SSebastian Neubauer //
34a025622SSebastian Neubauer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44a025622SSebastian Neubauer // See https://llvm.org/LICENSE.txt for license information.
54a025622SSebastian Neubauer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64a025622SSebastian Neubauer //
74a025622SSebastian Neubauer //===----------------------------------------------------------------------===//
84a025622SSebastian Neubauer //
94a025622SSebastian Neubauer /// \file
104a025622SSebastian Neubauer /// Test that amdgpu metadata that is added in a pass is read by the asm emitter
114a025622SSebastian Neubauer /// and stored in the ELF.
124a025622SSebastian Neubauer //
134a025622SSebastian Neubauer //===----------------------------------------------------------------------===//
144a025622SSebastian Neubauer
154a025622SSebastian Neubauer #include "llvm/IR/LegacyPassManager.h"
164a025622SSebastian Neubauer #include "llvm/MC/TargetRegistry.h"
17*3c4410dfSserge-sans-paille #include "llvm/Pass.h"
184a025622SSebastian Neubauer #include "llvm/Support/TargetSelect.h"
194a025622SSebastian Neubauer #include "llvm/Target/TargetMachine.h"
204a025622SSebastian Neubauer #include "gtest/gtest.h"
214a025622SSebastian Neubauer
224a025622SSebastian Neubauer namespace llvm {
234a025622SSebastian Neubauer
244a025622SSebastian Neubauer namespace {
254a025622SSebastian Neubauer // Pass that adds global metadata
264a025622SSebastian Neubauer struct AddMetadataPass : public ModulePass {
274a025622SSebastian Neubauer std::string PalMDString;
284a025622SSebastian Neubauer
294a025622SSebastian Neubauer public:
304a025622SSebastian Neubauer static char ID;
AddMetadataPassllvm::__anon6d9bceff0111::AddMetadataPass314a025622SSebastian Neubauer AddMetadataPass(std::string PalMDString)
324a025622SSebastian Neubauer : ModulePass(ID), PalMDString(PalMDString) {}
runOnModulellvm::__anon6d9bceff0111::AddMetadataPass334a025622SSebastian Neubauer bool runOnModule(Module &M) override {
344a025622SSebastian Neubauer auto &Ctx = M.getContext();
354a025622SSebastian Neubauer auto *MD = M.getOrInsertNamedMetadata("amdgpu.pal.metadata.msgpack");
364a025622SSebastian Neubauer auto *PalMD = MDString::get(Ctx, PalMDString);
374a025622SSebastian Neubauer auto *TMD = MDTuple::get(Ctx, {PalMD});
384a025622SSebastian Neubauer MD->addOperand(TMD);
394a025622SSebastian Neubauer return true;
404a025622SSebastian Neubauer }
414a025622SSebastian Neubauer };
424a025622SSebastian Neubauer char AddMetadataPass::ID = 0;
434a025622SSebastian Neubauer } // end anonymous namespace
444a025622SSebastian Neubauer
454a025622SSebastian Neubauer class AMDGPUSelectionDAGTest : public testing::Test {
464a025622SSebastian Neubauer protected:
SetUpTestCase()474a025622SSebastian Neubauer static void SetUpTestCase() {
484a025622SSebastian Neubauer InitializeAllTargets();
494a025622SSebastian Neubauer InitializeAllTargetMCs();
504a025622SSebastian Neubauer }
514a025622SSebastian Neubauer
SetUp()524a025622SSebastian Neubauer void SetUp() override {
534a025622SSebastian Neubauer std::string Error;
544a025622SSebastian Neubauer const Target *T = TargetRegistry::lookupTarget("amdgcn--amdpal", Error);
554a025622SSebastian Neubauer if (!T)
564a025622SSebastian Neubauer GTEST_SKIP();
574a025622SSebastian Neubauer
584a025622SSebastian Neubauer TargetOptions Options;
594a025622SSebastian Neubauer TM = std::unique_ptr<LLVMTargetMachine>(
604a025622SSebastian Neubauer static_cast<LLVMTargetMachine *>(T->createTargetMachine(
614a025622SSebastian Neubauer "amdgcn--amdpal", "gfx1010", "", Options, None)));
624a025622SSebastian Neubauer if (!TM)
634a025622SSebastian Neubauer GTEST_SKIP();
644a025622SSebastian Neubauer
654a025622SSebastian Neubauer LLVMContext Context;
664a025622SSebastian Neubauer std::unique_ptr<Module> M(new Module("TestModule", Context));
674a025622SSebastian Neubauer M->setDataLayout(TM->createDataLayout());
684a025622SSebastian Neubauer
694a025622SSebastian Neubauer legacy::PassManager PM;
704a025622SSebastian Neubauer PM.add(new AddMetadataPass(PalMDString));
714a025622SSebastian Neubauer raw_svector_ostream OutStream(Elf);
724a025622SSebastian Neubauer if (TM->addPassesToEmitFile(PM, OutStream, nullptr,
734a025622SSebastian Neubauer CodeGenFileType::CGFT_ObjectFile))
744a025622SSebastian Neubauer report_fatal_error("Target machine cannot emit a file of this type");
754a025622SSebastian Neubauer
764a025622SSebastian Neubauer PM.run(*M);
774a025622SSebastian Neubauer }
784a025622SSebastian Neubauer
794a025622SSebastian Neubauer static std::string PalMDString;
804a025622SSebastian Neubauer
814a025622SSebastian Neubauer LLVMContext Context;
824a025622SSebastian Neubauer std::unique_ptr<LLVMTargetMachine> TM;
834a025622SSebastian Neubauer std::unique_ptr<Module> M;
844a025622SSebastian Neubauer SmallString<1024> Elf;
854a025622SSebastian Neubauer };
864a025622SSebastian Neubauer std::string AMDGPUSelectionDAGTest::PalMDString =
874a025622SSebastian Neubauer "\x81\xB0"
884a025622SSebastian Neubauer "amdpal.pipelines\x91\x81\xA4.api\xA6Vulkan";
894a025622SSebastian Neubauer
TEST_F(AMDGPUSelectionDAGTest,checkMetadata)904a025622SSebastian Neubauer TEST_F(AMDGPUSelectionDAGTest, checkMetadata) {
914a025622SSebastian Neubauer // Check that the string is contained in the ELF
924a025622SSebastian Neubauer EXPECT_NE(Elf.find("Vulkan"), std::string::npos);
934a025622SSebastian Neubauer }
944a025622SSebastian Neubauer
954a025622SSebastian Neubauer } // end namespace llvm
96