From fa3fd90fb000b4ed65cf69fc382998b59990cbcd Mon Sep 17 00:00:00 2001
From: foreman
Date: Wed, 30 Sep 2015 00:10:02 -0400
Subject: [PATCH] P4 to Git Change 1195730 by smekhano@stas-rampitec-hsa on
2015/09/29 20:53:01
SWDEV-77584 - HSA HLC: fixed reflection metadata generation on HSAIL OCL 1.2 path
We are producing 6 extra arguments, but metadata was produced only for 3.
Removed KE_OCL12_NUM_ARGS define to avoid confusion.
Testing: smoke, precheckin
Reviewed by Yaxun Liu
Affected files ...
... //depot/stg/opencl/drivers/opencl/compiler/llvm/include/llvm/AMDOpenCLKernenv.h#4 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/Transforms/Scalar/AMDInsertOpenCLKernenv.cpp#10 edit
---
.../lib/backends/common/v0_8/if_acl.cpp | 29 +++++++++++++++----
rocclr/compiler/lib/utils/options.cpp | 4 ++-
rocclr/runtime/device/gpu/gpuprogram.cpp | 22 ++++++++++++--
rocclr/runtime/platform/program.cpp | 26 ++++++++---------
rocclr/runtime/platform/program.hpp | 2 +-
5 files changed, 61 insertions(+), 22 deletions(-)
diff --git a/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp b/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
index ed37aaef32..95139446ef 100644
--- a/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
+++ b/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
@@ -391,14 +391,20 @@ SPIRVToModule(
acl_error *error)
{
auto compiler = reinterpret_cast(ald);
+ auto cl = compiler->CL();
+ auto bin = compiler->Elf();
#ifdef LEGACY_COMPLIB
llvm::report_fatal_error("SPIR-V not supported on legacy compiler lib");
- appendLogToCL(compiler->CL(), "SPIR-V not supported on legacy compiler lib");
+ appendLogToCL(cl, "SPIR-V not supported on legacy compiler lib");
if (error != nullptr) (*error) = ACL_SPIRV_LOAD_FAIL;
return nullptr;
#else
std::string spvImg(image, length);
- auto opt = compiler->Options();
+ /// ToDo: When there are multiple binaries, compiler->Options()
+ /// cannot carry options specified by environment variables to here
+ /// but bin->options can. This seems to be related to how runtime
+ /// sets up aclCompiler options and BIF options.
+ auto opt = reinterpret_cast(bin->options);
if (opt->isDumpFlagSet(amd::option::DUMP_SPIRV)) {
std::ofstream ofs(opt->getDumpFileName(".spv"), std::ios::binary);
ofs << spvImg;
@@ -426,14 +432,20 @@ SPIRVToModule(
}
if (!errMsg.empty()) {
- appendLogToCL(compiler->CL(), errMsg);
+ appendLogToCL(cl, errMsg);
}
if (!success || llMod == nullptr) {
if (error != nullptr) (*error) = ACL_SPIRV_LOAD_FAIL;
return nullptr;
}
- if (error != nullptr) (*error) = ACL_SUCCESS;
+ llvm::SmallVector array;
+ llvm::raw_svector_ostream outstream(array);
+ llvm::WriteBitcodeToFile(reinterpret_cast(llMod), outstream);
+ outstream.flush();
+ auto errCode = cl->clAPI.insSec(cl, bin, &array[0], array.size(), aclLLVMIR);
+ if (error != nullptr) (*error) = errCode;
+
return reinterpret_cast(llMod);
#endif // LEGACY_COMPLIB
}
@@ -1623,7 +1635,14 @@ if_aclCompile(aclCompiler *cl,
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &AMDILFini, &OCLFini);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &HSAILFEFini, &OCLFini);
if (from == ACL_TYPE_SPIRV_BINARY) {
- cl->feAPI.toModule = &SPIRVToModule;
+ if (to != ACL_TYPE_LLVMIR_BINARY)
+ cl->feAPI.toModule = &SPIRVToModule;
+ else {
+ cl->feAPI.toISA = NULL;
+ cl->feAPI.toIR = &SPIRVToModule;
+ start = 0;
+ stop = 1;
+ }
} else if (from == ACL_TYPE_RSLLVMIR_BINARY) {
cl->feAPI.toModule = &RSLLVMIRToModule;
} else {
diff --git a/rocclr/compiler/lib/utils/options.cpp b/rocclr/compiler/lib/utils/options.cpp
index f23ca1be32..131cc56eda 100644
--- a/rocclr/compiler/lib/utils/options.cpp
+++ b/rocclr/compiler/lib/utils/options.cpp
@@ -1255,6 +1255,7 @@ Options::Options() :
oVariables(NULL),
clcOptions(),
llvmOptions(),
+ kernelArgAlign(0),
basename_max(0),
OptionsLog(),
flagsSize (((OID_LAST + 31)/32) * 32),
@@ -1264,7 +1265,8 @@ Options::Options() :
dumpFileRoot(),
currKernelName(NULL),
encryptCode(0),
- MemoryHandles()
+ MemoryHandles(),
+ libraryType_(amd::LibraryUndefined)
{
oVariables = new OptionVariables();
::memset(flags, 0, sizeof(flags));
diff --git a/rocclr/runtime/device/gpu/gpuprogram.cpp b/rocclr/runtime/device/gpu/gpuprogram.cpp
index bff20bf113..014de53f12 100644
--- a/rocclr/runtime/device/gpu/gpuprogram.cpp
+++ b/rocclr/runtime/device/gpu/gpuprogram.cpp
@@ -1801,9 +1801,27 @@ HSAILProgram::linkImpl(
const void *llvmirText = aclExtractSection(dev().hsaCompiler(),
binaryElf_, &llvmirSize, aclLLVMIR, &errorCode);
if (errorCode != ACL_SUCCESS) {
- buildLog_ +="Error while linking : \
+ bool spirv = false;
+ size_t boolSize = sizeof(bool);
+ errorCode = aclQueryInfo(dev().hsaCompiler(), binaryElf_,
+ RT_CONTAINS_SPIRV, NULL, &spirv, &boolSize);
+ if (errorCode != ACL_SUCCESS) {
+ spirv = false;
+ }
+ if (spirv) {
+ errorCode = aclCompile(dev().hsaCompiler(), binaryElf_,
+ options->origOptionStr.c_str(), ACL_TYPE_SPIRV_BINARY,
+ ACL_TYPE_LLVMIR_BINARY, NULL);
+ buildLog_ += aclGetCompilerLog(dev().hsaCompiler());
+ if (errorCode != ACL_SUCCESS) {
+ buildLog_ += "Error while linking: Could not load SPIR-V" ;
+ return false;
+ }
+ } else {
+ buildLog_ +="Error while linking : \
Invalid binary (Missing LLVMIR section)" ;
- return false;
+ return false;
+ }
}
// Create a new aclBinary for each LLVMIR and save it in a list
aclBIFVersion ver = aclBinaryVersion(binaryElf_);
diff --git a/rocclr/runtime/platform/program.cpp b/rocclr/runtime/platform/program.cpp
index c579b7f6a1..cf23e45f19 100644
--- a/rocclr/runtime/platform/program.cpp
+++ b/rocclr/runtime/platform/program.cpp
@@ -43,7 +43,8 @@ Program::findSymbol(const char* kernelName) const
}
cl_int
-Program::addDeviceProgram(Device& device, const void* image, size_t length, int oclVer)
+Program::addDeviceProgram(Device& device, const void* image, size_t length,
+ bool hsail)
{
if (image != NULL &&
!aclValidateBinaryImage(image, length,
@@ -63,8 +64,7 @@ Program::addDeviceProgram(Device& device, const void* image, size_t length, int
return CL_SUCCESS;
}
- bool hsail = (oclVer >= 200) || isIL_;
- device::Program* program = rootDev.createProgram(hsail);
+ device::Program* program = rootDev.createProgram(hsail || isIL_);
if (program == NULL) {
return CL_OUT_OF_HOST_MEMORY;
}
@@ -201,15 +201,16 @@ Program::compile(
device::Program* devProgram = getDeviceProgram(**it);
if (devProgram == NULL) {
const binary_t& bin = binary(**it);
- const int oclVer = GetOclCVersion(parsedOptions.oVariables->CLStd);
- retval = addDeviceProgram(**it, bin.first, bin.second, oclVer);
+ retval = addDeviceProgram(**it, bin.first, bin.second,
+ GetOclCVersion(parsedOptions.oVariables->CLStd) >= 200);
if (retval != CL_SUCCESS) {
return retval;
}
devProgram = getDeviceProgram(**it);
}
- if (devProgram->type() == device::Program::TYPE_INTERMEDIATE) {
+ if (devProgram->type() == device::Program::TYPE_INTERMEDIATE ||
+ isIL_) {
continue;
}
// We only build a Device-Program once
@@ -300,9 +301,10 @@ Program::link(
// find the corresponding device program in each input program
std::vector inputDevPrograms(numInputs);
bool found = false;
- int maxOclVer = GetOclCVersion(parsedOptions.oVariables->CLStd);
+ bool hsail = GetOclCVersion(parsedOptions.oVariables->CLStd) >= 200;
for (size_t i = 0; i < numInputs; ++i) {
Program& inputProgram = *inputPrograms[i];
+ hsail = hsail || inputProgram.isIL_;
deviceprograms_t inputDevProgs = inputProgram.devicePrograms();
deviceprograms_t::const_iterator findIt = inputDevProgs.find(*it);
if (findIt == inputDevProgs.end()) {
@@ -315,10 +317,8 @@ Program::link(
if (pos != std::string::npos) {
std::string clStd =
inputDevPrograms[i]->compileOptions().substr((pos+8), 5);
- int oclVer = GetOclCVersion(clStd.c_str());
- maxOclVer = (maxOclVer > oclVer) ? maxOclVer : oclVer;
+ hsail = hsail || GetOclCVersion(clStd.c_str()) >= 200;
}
-
}
if (inputDevPrograms.size() == 0) {
continue;
@@ -330,7 +330,7 @@ Program::link(
device::Program* devProgram = getDeviceProgram(**it);
if (devProgram == NULL) {
const binary_t& bin = binary(**it);
- retval = addDeviceProgram(**it, bin.first, bin.second, maxOclVer);
+ retval = addDeviceProgram(**it, bin.first, bin.second, hsail);
if (retval != CL_SUCCESS) {
return retval;
}
@@ -455,12 +455,12 @@ Program::build(
device::Program* devProgram = getDeviceProgram(**it);
if (devProgram == NULL) {
const binary_t& bin = binary(**it);
- const int oclVer = GetOclCVersion(parsedOptions.oVariables->CLStd);
if (sourceCode_.empty() && (bin.first == NULL)) {
retval = false;
continue;
}
- retval = addDeviceProgram(**it, bin.first, bin.second, oclVer);
+ retval = addDeviceProgram(**it, bin.first, bin.second,
+ GetOclCVersion(parsedOptions.oVariables->CLStd) >= 200);
if (retval != CL_SUCCESS) {
return retval;
}
diff --git a/rocclr/runtime/platform/program.hpp b/rocclr/runtime/platform/program.hpp
index 16a070f4b5..e1fccc5054 100644
--- a/rocclr/runtime/platform/program.hpp
+++ b/rocclr/runtime/platform/program.hpp
@@ -139,7 +139,7 @@ public:
//! Add a binary image to this program.
cl_int addDeviceProgram(Device&, const void* image = NULL,
- size_t len = 0, int oclVer = 120);
+ size_t len = 0, bool hsail = false);
//! Find the section for the given device. Return NULL if not found.
device::Program* getDeviceProgram(const Device& device) const;