xref: /llvm-project/llvm/unittests/CodeGen/AMDGPUMetadataTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
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"
164169338eSNikita Popov #include "llvm/IR/Module.h"
174a025622SSebastian Neubauer #include "llvm/MC/TargetRegistry.h"
183c4410dfSserge-sans-paille #include "llvm/Pass.h"
194a025622SSebastian Neubauer #include "llvm/Support/TargetSelect.h"
204a025622SSebastian Neubauer #include "llvm/Target/TargetMachine.h"
214a025622SSebastian Neubauer #include "gtest/gtest.h"
224a025622SSebastian Neubauer 
234a025622SSebastian Neubauer namespace llvm {
244a025622SSebastian Neubauer 
254a025622SSebastian Neubauer namespace {
264a025622SSebastian Neubauer // Pass that adds global metadata
274a025622SSebastian Neubauer struct AddMetadataPass : public ModulePass {
284a025622SSebastian Neubauer   std::string PalMDString;
294a025622SSebastian Neubauer 
304a025622SSebastian Neubauer public:
314a025622SSebastian Neubauer   static char ID;
324a025622SSebastian Neubauer   AddMetadataPass(std::string PalMDString)
334a025622SSebastian Neubauer       : ModulePass(ID), PalMDString(PalMDString) {}
344a025622SSebastian Neubauer   bool runOnModule(Module &M) override {
354a025622SSebastian Neubauer     auto &Ctx = M.getContext();
364a025622SSebastian Neubauer     auto *MD = M.getOrInsertNamedMetadata("amdgpu.pal.metadata.msgpack");
374a025622SSebastian Neubauer     auto *PalMD = MDString::get(Ctx, PalMDString);
384a025622SSebastian Neubauer     auto *TMD = MDTuple::get(Ctx, {PalMD});
394a025622SSebastian Neubauer     MD->addOperand(TMD);
404a025622SSebastian Neubauer     return true;
414a025622SSebastian Neubauer   }
424a025622SSebastian Neubauer };
434a025622SSebastian Neubauer char AddMetadataPass::ID = 0;
444a025622SSebastian Neubauer } // end anonymous namespace
454a025622SSebastian Neubauer 
464a025622SSebastian Neubauer class AMDGPUSelectionDAGTest : public testing::Test {
474a025622SSebastian Neubauer protected:
484a025622SSebastian Neubauer   static void SetUpTestCase() {
494a025622SSebastian Neubauer     InitializeAllTargets();
504a025622SSebastian Neubauer     InitializeAllTargetMCs();
514a025622SSebastian Neubauer   }
524a025622SSebastian Neubauer 
534a025622SSebastian Neubauer   void SetUp() override {
544a025622SSebastian Neubauer     std::string Error;
554a025622SSebastian Neubauer     const Target *T = TargetRegistry::lookupTarget("amdgcn--amdpal", Error);
564a025622SSebastian Neubauer     if (!T)
574a025622SSebastian Neubauer       GTEST_SKIP();
584a025622SSebastian Neubauer 
594a025622SSebastian Neubauer     TargetOptions Options;
60*bb3f5e1fSMatin Raayai     TM = std::unique_ptr<TargetMachine>(T->createTargetMachine(
61*bb3f5e1fSMatin Raayai         "amdgcn--amdpal", "gfx1010", "", Options, std::nullopt));
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,
730a1aa6cdSArthur Eubanks                                 CodeGenFileType::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;
82*bb3f5e1fSMatin Raayai   std::unique_ptr<TargetMachine> 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 
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