1010#include " shared/source/memory_manager/graphics_allocation.h"
1111#include " shared/source/memory_manager/unified_memory_manager.h"
1212#include " shared/source/program/program_info_from_patchtokens.h"
13+ #include " shared/test/common/helpers/debug_manager_state_restore.h"
1314#include " shared/test/common/mocks/mock_csr.h"
1415#include " shared/test/common/mocks/mock_execution_environment.h"
1516#include " shared/test/common/mocks/mock_memory_manager.h"
@@ -728,12 +729,13 @@ TEST(ProgramStringSectionTest, WhenConstStringBufferIsPresentThenUseItForLinking
728729 program.getKernelInfoArray (rootDeviceIndex).clear ();
729730}
730731
731- TEST (ProgramImplicitArgsTest, whenImplicitRelocationIsPresentThenKernelRequiresImplicitArgs ) {
732+ TEST (ProgramImplicitArgsTest, givenImplicitRelocationAndStackCallsThenKernelRequiresImplicitArgs ) {
732733 auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get ()));
733734 auto rootDeviceIndex = device->getRootDeviceIndex ();
734735 MockProgram program{nullptr , false , toClDeviceVector (*device)};
735736 KernelInfo kernelInfo = {};
736737 kernelInfo.kernelDescriptor .kernelMetadata .kernelName = " onlyKernel" ;
738+ kernelInfo.kernelDescriptor .kernelAttributes .flags .useStackCalls = true ;
737739 uint8_t kernelHeapData[64 ] = {};
738740 kernelInfo.heapInfo .pKernelHeap = kernelHeapData;
739741 kernelInfo.heapInfo .KernelHeapSize = 64 ;
@@ -751,3 +753,61 @@ TEST(ProgramImplicitArgsTest, whenImplicitRelocationIsPresentThenKernelRequiresI
751753 EXPECT_TRUE (kernelInfo.kernelDescriptor .kernelAttributes .flags .requiresImplicitArgs );
752754 program.getKernelInfoArray (rootDeviceIndex).clear ();
753755}
756+
757+ TEST (ProgramImplicitArgsTest, givenImplicitRelocationAndEnabledDebuggerThenKernelRequiresImplicitArgs) {
758+ if (!defaultHwInfo->capabilityTable .debuggerSupported ) {
759+ GTEST_SKIP ();
760+ }
761+ DebugManagerStateRestore restorer;
762+ DebugManager.flags .EnableMockSourceLevelDebugger .set (1 );
763+ auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get ()));
764+
765+ EXPECT_NE (nullptr , device->getDebugger ());
766+ auto rootDeviceIndex = device->getRootDeviceIndex ();
767+ MockProgram program{nullptr , false , toClDeviceVector (*device)};
768+ KernelInfo kernelInfo = {};
769+ kernelInfo.kernelDescriptor .kernelMetadata .kernelName = " onlyKernel" ;
770+ kernelInfo.kernelDescriptor .kernelAttributes .flags .useStackCalls = false ;
771+ uint8_t kernelHeapData[64 ] = {};
772+ kernelInfo.heapInfo .pKernelHeap = kernelHeapData;
773+ kernelInfo.heapInfo .KernelHeapSize = 64 ;
774+ MockGraphicsAllocation kernelIsa (kernelHeapData, 64 );
775+ kernelInfo.kernelAllocation = &kernelIsa;
776+ program.getKernelInfoArray (rootDeviceIndex).push_back (&kernelInfo);
777+
778+ auto linkerInput = std::make_unique<WhiteBox<LinkerInput>>();
779+ linkerInput->relocations .push_back ({{implicitArgsRelocationSymbolName, 0x8 , LinkerInput::RelocationInfo::Type::AddressLow, SegmentType::Instructions}});
780+ linkerInput->traits .requiresPatchingOfInstructionSegments = true ;
781+ program.setLinkerInput (rootDeviceIndex, std::move (linkerInput));
782+ auto ret = program.linkBinary (&device->getDevice (), nullptr , nullptr , {});
783+ EXPECT_EQ (CL_SUCCESS, ret);
784+
785+ EXPECT_TRUE (kernelInfo.kernelDescriptor .kernelAttributes .flags .requiresImplicitArgs );
786+ program.getKernelInfoArray (rootDeviceIndex).clear ();
787+ }
788+
789+ TEST (ProgramImplicitArgsTest, givenImplicitRelocationAndNoStackCallsAndDisabledDebuggerThenKernelDoesntRequireImplicitArgs) {
790+ auto device = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(defaultHwInfo.get ()));
791+ EXPECT_EQ (nullptr , device->getDebugger ());
792+ auto rootDeviceIndex = device->getRootDeviceIndex ();
793+ MockProgram program{nullptr , false , toClDeviceVector (*device)};
794+ KernelInfo kernelInfo = {};
795+ kernelInfo.kernelDescriptor .kernelMetadata .kernelName = " onlyKernel" ;
796+ kernelInfo.kernelDescriptor .kernelAttributes .flags .useStackCalls = false ;
797+ uint8_t kernelHeapData[64 ] = {};
798+ kernelInfo.heapInfo .pKernelHeap = kernelHeapData;
799+ kernelInfo.heapInfo .KernelHeapSize = 64 ;
800+ MockGraphicsAllocation kernelIsa (kernelHeapData, 64 );
801+ kernelInfo.kernelAllocation = &kernelIsa;
802+ program.getKernelInfoArray (rootDeviceIndex).push_back (&kernelInfo);
803+
804+ auto linkerInput = std::make_unique<WhiteBox<LinkerInput>>();
805+ linkerInput->relocations .push_back ({{implicitArgsRelocationSymbolName, 0x8 , LinkerInput::RelocationInfo::Type::AddressLow, SegmentType::Instructions}});
806+ linkerInput->traits .requiresPatchingOfInstructionSegments = true ;
807+ program.setLinkerInput (rootDeviceIndex, std::move (linkerInput));
808+ auto ret = program.linkBinary (&device->getDevice (), nullptr , nullptr , {});
809+ EXPECT_EQ (CL_SUCCESS, ret);
810+
811+ EXPECT_FALSE (kernelInfo.kernelDescriptor .kernelAttributes .flags .requiresImplicitArgs );
812+ program.getKernelInfoArray (rootDeviceIndex).clear ();
813+ }
0 commit comments