From 190eee3cc80ad22f665a2d2614a179a2f135eb83 Mon Sep 17 00:00:00 2001
From: foreman
Date: Wed, 10 Jun 2015 13:42:11 -0400
Subject: [PATCH] P4 to Git Change 1159925 by rayxiao@alit_opencl_rayxiao on
2015/06/10 13:33:10
EPR #396242 - Add T_PAD type for padding to parameters, use struct instead of array for padding. Set name of padding struct as "__paddingFields" when created.
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel.h#23 edit
... //depot/stg/opencl/drivers/opencl/compiler/clc/src/e2lType.cpp#53 edit
... //depot/stg/opencl/drivers/opencl/compiler/clc/src/oclMetallvm.cpp#46 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.cpp#3 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.cpp#67 edit
[ROCm/clr commit: 5b6d359824ba5e9d2656160af9d35b37ca394607]
---
.../rocclr/runtime/device/cpu/cpumapping.cpp | 34 ++++++++++++++++++-
.../rocclr/runtime/device/cpu/cpuprogram.cpp | 4 +--
2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/projects/clr/rocclr/runtime/device/cpu/cpumapping.cpp b/projects/clr/rocclr/runtime/device/cpu/cpumapping.cpp
index 2d86272d43..1ee5092f24 100644
--- a/projects/clr/rocclr/runtime/device/cpu/cpumapping.cpp
+++ b/projects/clr/rocclr/runtime/device/cpu/cpumapping.cpp
@@ -235,6 +235,38 @@ namespace cpu {
}
}
}
+ else if (desc[internal_index].type == T_PAD) {
+ //Struct has padding
+ hc_offset = init_offset;
+ if (desc[index_out+1].type != T_VOID) {
+ index_out++;
+ internal_index = index_out;
+ internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
+ hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset, inStruct, index_out);
+ // Adjust alignment to biggest member alignment
+ hc_alignment = 1;
+ dc_alignment = 1;
+ unsigned pad_size = hc_size;
+ internal_index = index_out;
+ if (desc[index_out+1].type != T_VOID) {
+ //Still inside padding and not done
+ index_out++;
+ internal_index = index_out;
+ next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
+ pad_size = hc_size;
+ pad_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment, next_offset, inStruct, index_out);
+ next_offset = max(next_field_map->hc_offset+next_field_map->hc_size, next_field_map->hc_offset+hc_alignment);
+ // running count of padding dc_size = hc_size + size of next member
+ return pad_size;
+ }
+ else {
+ //Moving out of struct, go to next index
+ index_out++;
+ internal_index = index_out;
+ return hc_size; //return last padding member size
+ }
+ }
+ }
else {
//Scalar parameter
hc_offset = init_offset;
@@ -278,7 +310,7 @@ namespace cpu {
}
else {
// Ignore alignment when a char occurs to account for padding
- if (type != T_STRUCT && next_field_map->hc_size == 1 && map_param_size > 1 && inStruct_flag > 0) {
+ if (type == T_PAD) {
next_field_map->dc_offset = dc_offset + dc_size;
next_offset = current_offset + hc_size;
}
diff --git a/projects/clr/rocclr/runtime/device/cpu/cpuprogram.cpp b/projects/clr/rocclr/runtime/device/cpu/cpuprogram.cpp
index 0fc539d6d0..ee9c6ab953 100644
--- a/projects/clr/rocclr/runtime/device/cpu/cpuprogram.cpp
+++ b/projects/clr/rocclr/runtime/device/cpu/cpuprogram.cpp
@@ -172,7 +172,7 @@ getParamSizeImpl(bool cpuLayer, const clk_parameter_descriptor_t* desc,
size_t* alignment, unsigned* index_out)
{
size_t size = 0;
- if(desc[index].type == T_STRUCT) {
+ if(desc[index].type == T_STRUCT || desc[index].type == T_PAD) {
size_t maxAlignment = 0;
size_t structSize = 0;
size_t structAlignment = 0;
@@ -237,7 +237,7 @@ getNumTypeDescs(const clk_parameter_descriptor_t* desc)
int numStruct = 0;
unsigned i;
for(i = 0; desc[i].type != T_VOID || numStruct > 0; ++i) {
- if (desc[i].type == T_STRUCT)
+ if (desc[i].type == T_STRUCT || desc[i].type == T_PAD)
numStruct++;
if (desc[i].type == T_VOID)
numStruct--;