mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
fix: indirect access in external functions
Read indirect_stateless_count in module external functions. If greater than 0, mark all kernels that have the has_stack_calls flag set from this module as having indirect accesses. Related-To: NEO-7712 Signed-off-by: Dominik Dabek <dominik.dabek@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
af5977766d
commit
e0ccf22557
@@ -1109,6 +1109,7 @@ ze_result_t KernelImp::initialize(const ze_kernel_desc_t *desc) {
|
||||
kernelDescriptor.kernelAttributes.hasNonKernelArgStore ||
|
||||
kernelDescriptor.kernelAttributes.hasNonKernelArgAtomic ||
|
||||
kernelDescriptor.kernelAttributes.hasIndirectStatelessAccess ||
|
||||
(moduleImp->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists && kernelDescriptor.kernelAttributes.flags.useStackCalls) ||
|
||||
NEO::KernelHelper::isAnyArgumentPtrByValue(kernelDescriptor);
|
||||
} else {
|
||||
kernelHasIndirectAccess = true;
|
||||
|
||||
@@ -1387,6 +1387,7 @@ TEST_F(KernelIndirectPropertiesFromIGCTests, givenDetectIndirectAccessInKernelEn
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgStore = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgAtomic = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasIndirectStatelessAccess = false;
|
||||
module->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists = false;
|
||||
|
||||
kernel->initialize(&desc);
|
||||
|
||||
@@ -1404,6 +1405,7 @@ TEST_F(KernelIndirectPropertiesFromIGCTests, givenDetectIndirectAccessInKernelEn
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgStore = true;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgAtomic = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasIndirectStatelessAccess = false;
|
||||
module->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists = false;
|
||||
|
||||
kernel->initialize(&desc);
|
||||
|
||||
@@ -1421,6 +1423,7 @@ TEST_F(KernelIndirectPropertiesFromIGCTests, givenDetectIndirectAccessInKernelEn
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgStore = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgAtomic = true;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasIndirectStatelessAccess = false;
|
||||
module->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists = false;
|
||||
|
||||
kernel->initialize(&desc);
|
||||
|
||||
@@ -1438,6 +1441,45 @@ TEST_F(KernelIndirectPropertiesFromIGCTests, givenDetectIndirectAccessInKernelEn
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgStore = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgAtomic = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasIndirectStatelessAccess = true;
|
||||
module->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists = false;
|
||||
|
||||
kernel->initialize(&desc);
|
||||
|
||||
EXPECT_TRUE(kernel->hasIndirectAccess());
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
|
||||
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
|
||||
|
||||
ze_kernel_desc_t desc = {};
|
||||
desc.pKernelName = kernelName.c_str();
|
||||
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgLoad = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgStore = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgAtomic = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasIndirectStatelessAccess = false;
|
||||
module->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists = true;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.flags.useStackCalls = false;
|
||||
|
||||
kernel->initialize(&desc);
|
||||
|
||||
EXPECT_FALSE(kernel->hasIndirectAccess());
|
||||
}
|
||||
|
||||
{
|
||||
std::unique_ptr<ModuleImmutableDataFixture::MockKernel> kernel;
|
||||
kernel = std::make_unique<ModuleImmutableDataFixture::MockKernel>(module.get());
|
||||
|
||||
ze_kernel_desc_t desc = {};
|
||||
desc.pKernelName = kernelName.c_str();
|
||||
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgLoad = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgStore = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasNonKernelArgAtomic = false;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.hasIndirectStatelessAccess = false;
|
||||
module->getTranslationUnit()->programInfo.functionPointerWithIndirectAccessExists = true;
|
||||
module->mockKernelImmData->mockKernelDescriptor->kernelAttributes.flags.useStackCalls = true;
|
||||
|
||||
kernel->initialize(&desc);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user