From 38be78b68d389caaf6b908bd54dcd9aeaa1dd023 Mon Sep 17 00:00:00 2001 From: foreman Date: Wed, 17 Aug 2016 00:42:28 -0400 Subject: [PATCH] P4 to Git Change 1303729 by lmoriche@lmoriche_opencl_dev on 2016/08/17 00:25:37 SWDEV-94610 - Add the control functions to the link (roc::HSAILProgram::linkImpl_LC) Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#9 edit [ROCm/clr commit: eaef5b6b6114048ab2863691f7e92bfc8c09e427] --- .../rocclr/runtime/device/rocm/rocprogram.cpp | 102 ++++++++++-------- 1 file changed, 58 insertions(+), 44 deletions(-) diff --git a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp index c244a508a6..729b738354 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp @@ -610,60 +610,74 @@ namespace roc { // call LinkLLVMBitcode std::vector inputs; - amd::opencl_driver::Data* opencl_bc = device().compiler()->NewBufferReference( - amd::opencl_driver::DT_LLVM_BC, - (const char*) builtins_opencl_amdgcn, - builtins_opencl_amdgcn_size); - if (opencl_bc == NULL) { - buildLog_ += "Error: Failed to open the opencl.bc bitcode library.\n"; - return false; - } - - amd::opencl_driver::Data* ocml_bc = device().compiler()->NewBufferReference( - amd::opencl_driver::DT_LLVM_BC, - (const char*) builtins_ocml_amdgcn, - builtins_ocml_amdgcn_size); - if (ocml_bc == NULL) { - buildLog_ += "Error: Failed to open the ocml.bc bitcode library.\n"; - return false; - } - amd::opencl_driver::Data* ockl_bc = device().compiler()->NewBufferReference( - amd::opencl_driver::DT_LLVM_BC, - (const char*) builtins_ockl_amdgcn, - builtins_ockl_amdgcn_size); - if (ockl_bc == NULL) { - buildLog_ += "Error: Failed to open the ockl.bc bitcode library.\n"; - return false; - } - - amd::opencl_driver::Data* irif_bc = device().compiler()->NewBufferReference( - amd::opencl_driver::DT_LLVM_BC, - (const char*) builtins_irif_amdgcn, - builtins_irif_amdgcn_size); - if (irif_bc == NULL) { - buildLog_ += "Error: Failed to open the irif.bc bitcode library.\n"; - return false; - } - + // open the input IR source const std::string llvmIR = codeObjBinary_->getLlvmIR(); amd::opencl_driver::Data* llvm_src = device().compiler()->NewBufferReference( - amd::opencl_driver::DT_LLVM_BC, - llvmIR.c_str(), - llvmIR.length()); - if (llvm_src == NULL) { - buildLog_ += "Error: Failed to open the llvm.bc bitcode library.\n"; + amd::opencl_driver::DT_LLVM_BC, llvmIR.c_str(), llvmIR.length()); + + if (!llvm_src) { + buildLog_ += "Error: Failed to open the compiled program.\n"; + return false; + } + + inputs.push_back(llvm_src); //< must be the first input + + // open the bitcode libraries + amd::opencl_driver::Data* opencl_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) builtins_opencl_amdgcn, builtins_opencl_amdgcn_size); + amd::opencl_driver::Data* ocml_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) builtins_ocml_amdgcn, builtins_ocml_amdgcn_size); + amd::opencl_driver::Data* ockl_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) builtins_ockl_amdgcn, builtins_ockl_amdgcn_size); + amd::opencl_driver::Data* irif_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) builtins_irif_amdgcn, builtins_irif_amdgcn_size); + + if (!opencl_bc || !ocml_bc || !ockl_bc || !irif_bc) { + buildLog_ += "Error: Failed to open the bitcode library.\n"; return false; } - inputs.push_back(llvm_src); inputs.push_back(opencl_bc); inputs.push_back(ocml_bc); inputs.push_back(ockl_bc); inputs.push_back(irif_bc); + // open the control functions + amd::opencl_driver::Data* correctly_rounded_sqrt_off_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) correctly_rounded_sqrt_off_amdgcn, correctly_rounded_sqrt_off_amdgcn_size); + amd::opencl_driver::Data* daz_opt_off_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) daz_opt_off_amdgcn, daz_opt_off_amdgcn_size); + amd::opencl_driver::Data* finite_only_off_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) finite_only_off_amdgcn, finite_only_off_amdgcn_size); + amd::opencl_driver::Data* unsafe_math_off_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) unsafe_math_off_amdgcn, unsafe_math_off_amdgcn_size); + amd::opencl_driver::Data* isa_version_803_bc = device().compiler()->NewBufferReference( + amd::opencl_driver::DT_LLVM_BC, (const char*) isa_version_803_amdgcn, isa_version_803_amdgcn_size); + + if (!correctly_rounded_sqrt_off_bc + || !daz_opt_off_bc + || !finite_only_off_bc + || !unsafe_math_off_bc + || !isa_version_803_bc) { + buildLog_ += "Error: Failed to open the control functions.\n"; + return false; + } + + inputs.push_back(correctly_rounded_sqrt_off_bc); + inputs.push_back(daz_opt_off_bc); + inputs.push_back(finite_only_off_bc); + inputs.push_back(unsafe_math_off_bc); + inputs.push_back(isa_version_803_bc); + + // open the linked output std::vector linkOptions; amd::opencl_driver::Data* linked_bc = device().compiler()->NewBuffer( - amd::opencl_driver::DT_LLVM_BC); + amd::opencl_driver::DT_LLVM_BC); + + if (!linked_bc) { + buildLog_ += "Error: Failed to open the linked program.\n"; + return false; + } bool ret = device().compiler()->LinkLLVMBitcode(inputs, linked_bc, linkOptions); buildLog_ += device().compiler()->Output().c_str(); @@ -677,8 +691,8 @@ namespace roc { amd::opencl_driver::Buffer* out_exec = device().compiler()->NewBuffer( amd::opencl_driver::DT_EXECUTABLE); - if (out_exec == NULL) { - buildLog_ += "Error: Failed to create the output file.\n"; + if (!out_exec) { + buildLog_ += "Error: Failed to create the linked executable.\n"; return false; }