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