From a8d5a654c91fb0df814f4e2dc85512e01e0fda25 Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 23 Sep 2014 13:16:11 -0400
Subject: [PATCH] P4 to Git Change 1079971 by emankov@em-hsa-amd on 2014/09/23
13:05:09
ECR #333753 - Compiler Lib, ocltst: printf metadata related changes
+ fix pointer copying of printf metadata in compiler Lib, annotation
+ printf testing is added to OCLRTGetInfo (ocltst complib)
tests: pre check-in, ocltst -m oclcomplib
Reviewers: Artem Tamazov
Affected files ...
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/v0_8/if_acl.cpp#50 edit
... //depot/stg/opencl/drivers/opencl/tests/ocltst/module/complib/clSourceShaders.h#6 edit
... //depot/stg/opencl/drivers/opencl/tests/ocltst/module/complib/oclrtGetInfo.cpp#15 edit
[ROCm/clr commit: 9fe49c35164fd206d479db97a6cabe2d9bbb2c9d]
---
.../lib/backends/common/v0_8/if_acl.cpp | 27 ++++++++++++++-----
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp b/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
index cedb3bb7c7..b2126894cb 100644
--- a/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
+++ b/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
@@ -2411,27 +2411,36 @@ if_aclQueryInfo(aclCompiler *cl,
// in binary; to get the data deserializeCLMetadata() is needed
aclMetadata *deserializedMd = static_cast(alloca(roSize));
deserializeCLMetadata(reinterpret_cast(roSec), deserializedMd, roSize);
- size_t totSize = sizeof(aclArgData) * (deserializedMd->numArgs + 1);
- for (unsigned x = 0; x < deserializedMd->numArgs; ++x) {
- totSize += deserializedMd->args[x].typeStrSize + deserializedMd->args[x].argNameSize + 2;
+ size_t totSize = 0;
+ if (deserializedMd->numArgs > 0) {
+ // 1 additional elemet is the array's end marker,
+ // which points to the structure with struct_size == 0
+ totSize = sizeof(aclArgData) * (deserializedMd->numArgs + 1);
+ for (unsigned x = 0; x < deserializedMd->numArgs; ++x) {
+ totSize += deserializedMd->args[x].typeStrSize + deserializedMd->args[x].argNameSize + 2;
+ }
}
if (!ptr) {
*size = totSize;
success = true;
} else if (*size >= totSize) {
char *tmp = reinterpret_cast(ptr);
- memset(ptr, 0, *size);
size_t sizeToCopy = sizeof(aclArgData) * (deserializedMd->numArgs + 1);
memcpy(ptr, deserializedMd->args, sizeToCopy);
+ // shift pointer at the end of the POD struct aclArgData
tmp += sizeToCopy;
for (unsigned x = 0; x < deserializedMd->numArgs; ++x) {
sizeToCopy = deserializedMd->args[x].argNameSize;
+ // copying argStr data
memcpy(tmp, deserializedMd->args[x].argStr, sizeToCopy);
+ // copying pointer to argStr data
reinterpret_cast(ptr)[x].argStr = tmp;
tmp += sizeToCopy;
*(tmp++) = '\0';
sizeToCopy = deserializedMd->args[x].typeStrSize;
+ // copying typeStr data
memcpy(tmp, deserializedMd->args[x].typeStr, sizeToCopy);
+ // copying pointer to typeStr data
reinterpret_cast(ptr)[x].typeStr = tmp;
tmp += sizeToCopy;
*(tmp++) = '\0';
@@ -2447,6 +2456,8 @@ if_aclQueryInfo(aclCompiler *cl,
deserializeCLMetadata(reinterpret_cast(roSec), deserializedMd, roSize);
size_t totSize = 0;
if (deserializedMd->numPrintf > 0) {
+ // 1 additional elemet is the array's end marker,
+ // which points to the structure with struct_size == 0
totSize = sizeof(aclPrintfFmt) * (deserializedMd->numPrintf + 1);
for (unsigned x = 0; x < deserializedMd->numPrintf; ++x) {
totSize += sizeof(*aclPrintfFmt().argSizes) * deserializedMd->printf[x].numSizes;
@@ -2460,15 +2471,19 @@ if_aclQueryInfo(aclCompiler *cl,
char *tmp = reinterpret_cast(ptr);
size_t sizeToCopy = sizeof(aclPrintfFmt) * (deserializedMd->numPrintf + 1);
memcpy(ptr, deserializedMd->printf, sizeToCopy);
+ // shift pointer at the end of the POD struct aclPrintfFmt
tmp += sizeToCopy;
for (unsigned x = 0; x < deserializedMd->numPrintf; ++x) {
sizeToCopy = sizeof(*aclPrintfFmt().argSizes) * deserializedMd->printf[x].numSizes;
+ // copying argSizes data
memcpy(tmp, deserializedMd->printf[x].argSizes, sizeToCopy);
- memcpy(reinterpret_cast(ptr)[x].argSizes, tmp, sizeof(*aclPrintfFmt().argSizes));
- // reinterpret_cast(ptr)[x].argSizes = reinterpret_cast(tmp);
+ // copying pointer to argSizes data
+ memcpy(&reinterpret_cast(ptr)[x].argSizes, &tmp, sizeof(void*));
tmp += sizeToCopy;
sizeToCopy = deserializedMd->printf[x].fmtStrSize;
+ // copying fmtStr data
memcpy(tmp, deserializedMd->printf[x].fmtStr, sizeToCopy);
+ // copying pointer to fmtStr data
reinterpret_cast(ptr)[x].fmtStr = tmp;
tmp += sizeToCopy;
*(tmp++) = '\0';