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