13d1705d0SJanek van Oirschot //===- llvm/unittests/MC/AMDGPU/PALMetadata.cpp ---------------------------===// 23d1705d0SJanek van Oirschot // 33d1705d0SJanek van Oirschot // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43d1705d0SJanek van Oirschot // See https://llvm.org/LICENSE.txt for license information. 53d1705d0SJanek van Oirschot // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63d1705d0SJanek van Oirschot // 73d1705d0SJanek van Oirschot //===----------------------------------------------------------------------===// 83d1705d0SJanek van Oirschot 93d1705d0SJanek van Oirschot #include "AMDGPUTargetMachine.h" 103d1705d0SJanek van Oirschot #include "GCNSubtarget.h" 113d1705d0SJanek van Oirschot #include "SIProgramInfo.h" 123d1705d0SJanek van Oirschot #include "Utils/AMDGPUPALMetadata.h" 133d1705d0SJanek van Oirschot #include "llvm/CodeGen/MachineModuleInfo.h" 143d1705d0SJanek van Oirschot #include "llvm/MC/MCContext.h" 153d1705d0SJanek van Oirschot #include "llvm/MC/MCExpr.h" 163d1705d0SJanek van Oirschot #include "llvm/MC/MCStreamer.h" 173d1705d0SJanek van Oirschot #include "llvm/MC/MCSymbol.h" 183d1705d0SJanek van Oirschot #include "llvm/MC/MCTargetOptions.h" 193d1705d0SJanek van Oirschot #include "llvm/MC/TargetRegistry.h" 203d1705d0SJanek van Oirschot #include "llvm/Support/TargetSelect.h" 213d1705d0SJanek van Oirschot #include "llvm/Target/TargetMachine.h" 223d1705d0SJanek van Oirschot #include "gtest/gtest.h" 233d1705d0SJanek van Oirschot 243d1705d0SJanek van Oirschot using namespace llvm; 253d1705d0SJanek van Oirschot 263d1705d0SJanek van Oirschot class PALMetadata : public testing::Test { 273d1705d0SJanek van Oirschot protected: 283d1705d0SJanek van Oirschot std::unique_ptr<GCNTargetMachine> TM; 293d1705d0SJanek van Oirschot std::unique_ptr<LLVMContext> Ctx; 303d1705d0SJanek van Oirschot std::unique_ptr<GCNSubtarget> ST; 313d1705d0SJanek van Oirschot std::unique_ptr<MachineModuleInfo> MMI; 323d1705d0SJanek van Oirschot std::unique_ptr<MachineFunction> MF; 333d1705d0SJanek van Oirschot std::unique_ptr<Module> M; 343d1705d0SJanek van Oirschot AMDGPUPALMetadata MD; 353d1705d0SJanek van Oirschot 363d1705d0SJanek van Oirschot static void SetUpTestSuite() { 373d1705d0SJanek van Oirschot LLVMInitializeAMDGPUTargetInfo(); 383d1705d0SJanek van Oirschot LLVMInitializeAMDGPUTarget(); 393d1705d0SJanek van Oirschot LLVMInitializeAMDGPUTargetMC(); 403d1705d0SJanek van Oirschot } 413d1705d0SJanek van Oirschot 423d1705d0SJanek van Oirschot PALMetadata() { 433d1705d0SJanek van Oirschot StringRef Triple = "amdgcn--amdpal"; 443d1705d0SJanek van Oirschot StringRef CPU = "gfx1010"; 453d1705d0SJanek van Oirschot StringRef FS = ""; 463d1705d0SJanek van Oirschot 473d1705d0SJanek van Oirschot std::string Error; 483d1705d0SJanek van Oirschot const Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error); 493d1705d0SJanek van Oirschot TargetOptions Options; 503d1705d0SJanek van Oirschot 513d1705d0SJanek van Oirschot TM.reset(static_cast<GCNTargetMachine *>(TheTarget->createTargetMachine( 523d1705d0SJanek van Oirschot Triple, CPU, FS, Options, std::nullopt, std::nullopt))); 533d1705d0SJanek van Oirschot 543d1705d0SJanek van Oirschot Ctx = std::make_unique<LLVMContext>(); 553d1705d0SJanek van Oirschot M = std::make_unique<Module>("Module", *Ctx); 563d1705d0SJanek van Oirschot M->setDataLayout(TM->createDataLayout()); 573d1705d0SJanek van Oirschot auto *FType = FunctionType::get(Type::getVoidTy(*Ctx), false); 583d1705d0SJanek van Oirschot auto *F = Function::Create(FType, GlobalValue::ExternalLinkage, "Test", *M); 593d1705d0SJanek van Oirschot MMI = std::make_unique<MachineModuleInfo>(TM.get()); 603d1705d0SJanek van Oirschot 613d1705d0SJanek van Oirschot ST = std::make_unique<GCNSubtarget>(TM->getTargetTriple(), 623d1705d0SJanek van Oirschot TM->getTargetCPU(), 633d1705d0SJanek van Oirschot TM->getTargetFeatureString(), *TM); 643d1705d0SJanek van Oirschot 65*63e16478SMatt Arsenault MF = std::make_unique<MachineFunction>(*F, *TM, *ST, MMI->getContext(), 1); 663d1705d0SJanek van Oirschot } 673d1705d0SJanek van Oirschot }; 683d1705d0SJanek van Oirschot 693d1705d0SJanek van Oirschot TEST_F(PALMetadata, ResourceRegisterSetORsResolvableUnknown) { 703d1705d0SJanek van Oirschot StringRef yaml = "---\n" 713d1705d0SJanek van Oirschot "amdpal.pipelines:\n" 723d1705d0SJanek van Oirschot " - .hardware_stages:\n" 733d1705d0SJanek van Oirschot " .es:\n" 743d1705d0SJanek van Oirschot " .entry_point: Test\n" 753d1705d0SJanek van Oirschot " .scratch_memory_size: 0\n" 763d1705d0SJanek van Oirschot " .sgpr_count: 0x1\n" 773d1705d0SJanek van Oirschot " .vgpr_count: 0x1\n" 783d1705d0SJanek van Oirschot " .registers:\n" 793d1705d0SJanek van Oirschot " \'0x2c4a (SPI_SHADER_PGM_RSRC1_VS)\': 0x2f0000\n" 803d1705d0SJanek van Oirschot " \'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0\n" 813d1705d0SJanek van Oirschot "...\n"; 823d1705d0SJanek van Oirschot 833d1705d0SJanek van Oirschot MCContext &MCCtx = MF->getContext(); 843d1705d0SJanek van Oirschot auto CC = CallingConv::AMDGPU_VS; 853d1705d0SJanek van Oirschot MD.setFromString(yaml); 863d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(42, MCCtx), MCCtx); 873d1705d0SJanek van Oirschot MCSymbol *Sym = MCCtx.getOrCreateSymbol("Unknown"); 883d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(Sym, MCCtx), MCCtx); 893d1705d0SJanek van Oirschot EXPECT_FALSE(MD.resolvedAllMCExpr()); 903d1705d0SJanek van Oirschot 913d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(0xff00, MCCtx), MCCtx); 923d1705d0SJanek van Oirschot Sym->setVariableValue(MCConstantExpr::create(0xffff0000, MCCtx)); 933d1705d0SJanek van Oirschot std::string Output; 943d1705d0SJanek van Oirschot MD.toString(Output); 953d1705d0SJanek van Oirschot 963d1705d0SJanek van Oirschot EXPECT_TRUE(MD.resolvedAllMCExpr()); 973d1705d0SJanek van Oirschot 983d1705d0SJanek van Oirschot auto n = Output.find("\'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0xffffff2a"); 993d1705d0SJanek van Oirschot EXPECT_TRUE(n != std::string::npos); 1003d1705d0SJanek van Oirschot } 1013d1705d0SJanek van Oirschot 1023d1705d0SJanek van Oirschot TEST_F(PALMetadata, ResourceRegisterSetORsResolvableUnknowns) { 1033d1705d0SJanek van Oirschot StringRef yaml = "---\n" 1043d1705d0SJanek van Oirschot "amdpal.pipelines:\n" 1053d1705d0SJanek van Oirschot " - .hardware_stages:\n" 1063d1705d0SJanek van Oirschot " .es:\n" 1073d1705d0SJanek van Oirschot " .entry_point: Test\n" 1083d1705d0SJanek van Oirschot " .scratch_memory_size: 0\n" 1093d1705d0SJanek van Oirschot " .sgpr_count: 0x1\n" 1103d1705d0SJanek van Oirschot " .vgpr_count: 0x1\n" 1113d1705d0SJanek van Oirschot " .registers:\n" 1123d1705d0SJanek van Oirschot " \'0x2c4a (SPI_SHADER_PGM_RSRC1_VS)\': 0x2f0000\n" 1133d1705d0SJanek van Oirschot " \'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0\n" 1143d1705d0SJanek van Oirschot "...\n"; 1153d1705d0SJanek van Oirschot 1163d1705d0SJanek van Oirschot MCContext &MCCtx = MF->getContext(); 1173d1705d0SJanek van Oirschot auto CC = CallingConv::AMDGPU_VS; 1183d1705d0SJanek van Oirschot MD.setFromString(yaml); 1193d1705d0SJanek van Oirschot MCSymbol *SymOne = MCCtx.getOrCreateSymbol("UnknownOne"); 1203d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(SymOne, MCCtx), MCCtx); 1213d1705d0SJanek van Oirschot 1223d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(42, MCCtx), MCCtx); 1233d1705d0SJanek van Oirschot 1243d1705d0SJanek van Oirschot MCSymbol *SymTwo = MCCtx.getOrCreateSymbol("UnknownTwo"); 1253d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(SymTwo, MCCtx), MCCtx); 1263d1705d0SJanek van Oirschot EXPECT_FALSE(MD.resolvedAllMCExpr()); 1273d1705d0SJanek van Oirschot 1283d1705d0SJanek van Oirschot SymOne->setVariableValue(MCConstantExpr::create(0xffff0000, MCCtx)); 1293d1705d0SJanek van Oirschot SymTwo->setVariableValue(MCConstantExpr::create(0x0000ff00, MCCtx)); 1303d1705d0SJanek van Oirschot 1313d1705d0SJanek van Oirschot std::string Output; 1323d1705d0SJanek van Oirschot MD.toString(Output); 1333d1705d0SJanek van Oirschot 1343d1705d0SJanek van Oirschot EXPECT_TRUE(MD.resolvedAllMCExpr()); 1353d1705d0SJanek van Oirschot 1363d1705d0SJanek van Oirschot auto n = Output.find("\'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0xffffff2a"); 1373d1705d0SJanek van Oirschot EXPECT_TRUE(n != std::string::npos); 1383d1705d0SJanek van Oirschot } 1393d1705d0SJanek van Oirschot 1403d1705d0SJanek van Oirschot TEST_F(PALMetadata, ResourceRegisterSetORsPreset) { 1413d1705d0SJanek van Oirschot StringRef yaml = "---\n" 1423d1705d0SJanek van Oirschot "amdpal.pipelines:\n" 1433d1705d0SJanek van Oirschot " - .hardware_stages:\n" 1443d1705d0SJanek van Oirschot " .es:\n" 1453d1705d0SJanek van Oirschot " .entry_point: Test\n" 1463d1705d0SJanek van Oirschot " .scratch_memory_size: 0\n" 1473d1705d0SJanek van Oirschot " .sgpr_count: 0x1\n" 1483d1705d0SJanek van Oirschot " .vgpr_count: 0x1\n" 1493d1705d0SJanek van Oirschot " .registers:\n" 1503d1705d0SJanek van Oirschot " \'0x2c4a (SPI_SHADER_PGM_RSRC1_VS)\': 0x2f0000\n" 1513d1705d0SJanek van Oirschot " \'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0x2a\n" 1523d1705d0SJanek van Oirschot "...\n"; 1533d1705d0SJanek van Oirschot 1543d1705d0SJanek van Oirschot MCContext &MCCtx = MF->getContext(); 1553d1705d0SJanek van Oirschot auto CC = CallingConv::AMDGPU_VS; 1563d1705d0SJanek van Oirschot MD.setFromString(yaml); 1573d1705d0SJanek van Oirschot MCSymbol *Sym = MCCtx.getOrCreateSymbol("Unknown"); 1583d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(Sym, MCCtx), MCCtx); 1593d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(0xff00, MCCtx), MCCtx); 1603d1705d0SJanek van Oirschot Sym->setVariableValue(MCConstantExpr::create(0xffff0000, MCCtx)); 1613d1705d0SJanek van Oirschot std::string Output; 1623d1705d0SJanek van Oirschot MD.toString(Output); 1633d1705d0SJanek van Oirschot 1643d1705d0SJanek van Oirschot auto n = Output.find("\'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0xffffff2a"); 1653d1705d0SJanek van Oirschot EXPECT_TRUE(n != std::string::npos); 1663d1705d0SJanek van Oirschot } 1673d1705d0SJanek van Oirschot 1683d1705d0SJanek van Oirschot TEST_F(PALMetadata, ResourceRegisterSetORs) { 1693d1705d0SJanek van Oirschot StringRef yaml = "---\n" 1703d1705d0SJanek van Oirschot "amdpal.pipelines:\n" 1713d1705d0SJanek van Oirschot " - .hardware_stages:\n" 1723d1705d0SJanek van Oirschot " .es:\n" 1733d1705d0SJanek van Oirschot " .entry_point: Test\n" 1743d1705d0SJanek van Oirschot " .scratch_memory_size: 0\n" 1753d1705d0SJanek van Oirschot " .sgpr_count: 0x1\n" 1763d1705d0SJanek van Oirschot " .vgpr_count: 0x1\n" 1773d1705d0SJanek van Oirschot " .registers:\n" 1783d1705d0SJanek van Oirschot " \'0x2c4a (SPI_SHADER_PGM_RSRC1_VS)\': 0x2f0000\n" 1793d1705d0SJanek van Oirschot " \'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0\n" 1803d1705d0SJanek van Oirschot "...\n"; 1813d1705d0SJanek van Oirschot 1823d1705d0SJanek van Oirschot MCContext &MCCtx = MF->getContext(); 1833d1705d0SJanek van Oirschot auto CC = CallingConv::AMDGPU_VS; 1843d1705d0SJanek van Oirschot MD.setFromString(yaml); 1853d1705d0SJanek van Oirschot MCSymbol *Sym = MCCtx.getOrCreateSymbol("Unknown"); 1863d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(Sym, MCCtx), MCCtx); 1873d1705d0SJanek van Oirschot MD.setRsrc2(CC, 42); 1883d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(0xff00, MCCtx), MCCtx); 1893d1705d0SJanek van Oirschot Sym->setVariableValue(MCConstantExpr::create(0xffff0000, MCCtx)); 1903d1705d0SJanek van Oirschot std::string Output; 1913d1705d0SJanek van Oirschot MD.toString(Output); 1923d1705d0SJanek van Oirschot 1933d1705d0SJanek van Oirschot auto n = Output.find("\'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0xffffff2a"); 1943d1705d0SJanek van Oirschot EXPECT_TRUE(n != std::string::npos); 1953d1705d0SJanek van Oirschot } 1963d1705d0SJanek van Oirschot 1973d1705d0SJanek van Oirschot TEST_F(PALMetadata, ResourceRegisterSetUnresolvedSym) { 1983d1705d0SJanek van Oirschot StringRef yaml = "---\n" 1993d1705d0SJanek van Oirschot "amdpal.pipelines:\n" 2003d1705d0SJanek van Oirschot " - .hardware_stages:\n" 2013d1705d0SJanek van Oirschot " .es:\n" 2023d1705d0SJanek van Oirschot " .entry_point: Test\n" 2033d1705d0SJanek van Oirschot " .scratch_memory_size: 0\n" 2043d1705d0SJanek van Oirschot " .sgpr_count: 0x1\n" 2053d1705d0SJanek van Oirschot " .vgpr_count: 0x1\n" 2063d1705d0SJanek van Oirschot " .registers:\n" 2073d1705d0SJanek van Oirschot " \'0x2c4a (SPI_SHADER_PGM_RSRC1_VS)\': 0x2f0000\n" 2083d1705d0SJanek van Oirschot " \'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0\n" 2093d1705d0SJanek van Oirschot "...\n"; 2103d1705d0SJanek van Oirschot 2113d1705d0SJanek van Oirschot MCContext &MCCtx = MF->getContext(); 2123d1705d0SJanek van Oirschot auto CC = CallingConv::AMDGPU_VS; 2133d1705d0SJanek van Oirschot MD.setFromString(yaml); 2143d1705d0SJanek van Oirschot MCSymbol *Sym = MCCtx.getOrCreateSymbol("Unknown"); 2153d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(Sym, MCCtx), MCCtx); 2163d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(0xff00, MCCtx), MCCtx); 2173d1705d0SJanek van Oirschot std::string Output; 2183d1705d0SJanek van Oirschot 2193d1705d0SJanek van Oirschot MD.toString(Output); 2203d1705d0SJanek van Oirschot EXPECT_FALSE(MD.resolvedAllMCExpr()); 2213d1705d0SJanek van Oirschot } 2223d1705d0SJanek van Oirschot 2233d1705d0SJanek van Oirschot TEST_F(PALMetadata, ResourceRegisterSetNoEmitUnresolved) { 2243d1705d0SJanek van Oirschot StringRef yaml = "---\n" 2253d1705d0SJanek van Oirschot "amdpal.pipelines:\n" 2263d1705d0SJanek van Oirschot " - .hardware_stages:\n" 2273d1705d0SJanek van Oirschot " .es:\n" 2283d1705d0SJanek van Oirschot " .entry_point: Test\n" 2293d1705d0SJanek van Oirschot " .scratch_memory_size: 0\n" 2303d1705d0SJanek van Oirschot " .sgpr_count: 0x1\n" 2313d1705d0SJanek van Oirschot " .vgpr_count: 0x1\n" 2323d1705d0SJanek van Oirschot " .registers:\n" 2333d1705d0SJanek van Oirschot " \'0x2c4a (SPI_SHADER_PGM_RSRC1_VS)\': 0x2f0000\n" 2343d1705d0SJanek van Oirschot " \'0x2c4b (SPI_SHADER_PGM_RSRC2_VS)\': 0\n" 2353d1705d0SJanek van Oirschot "...\n"; 2363d1705d0SJanek van Oirschot 2373d1705d0SJanek van Oirschot MCContext &MCCtx = MF->getContext(); 2383d1705d0SJanek van Oirschot auto CC = CallingConv::AMDGPU_VS; 2393d1705d0SJanek van Oirschot MD.setFromString(yaml); 2403d1705d0SJanek van Oirschot MCSymbol *Sym = MCCtx.getOrCreateSymbol("Unknown"); 2413d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCSymbolRefExpr::create(Sym, MCCtx), MCCtx); 2423d1705d0SJanek van Oirschot MD.setRsrc2(CC, MCConstantExpr::create(0xff00, MCCtx), MCCtx); 2433d1705d0SJanek van Oirschot 2443d1705d0SJanek van Oirschot EXPECT_FALSE(MD.resolvedAllMCExpr()); 2453d1705d0SJanek van Oirschot } 246