From c275d9b4b368b1e52b08e64eb11ca6cd79bddd1f Mon Sep 17 00:00:00 2001 From: German Andryeyev Date: Mon, 11 Apr 2022 10:50:02 -0400 Subject: [PATCH] SWDEV-307184 - Make sure runtime passes CO version into comgr Disable devlib linking when runtime links multiple objects from the app. Otherwise devlibs will be linked twice and may cause undefined behavior with COv5. Change-Id: I3b8640c64ff898893225fe3af5b4b4a32d42bf40 --- rocclr/compiler/lib/utils/OPTIONS.def | 8 +++++++ rocclr/device/devprogram.cpp | 31 ++++++++++++++++----------- rocclr/device/devprogram.hpp | 3 ++- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/rocclr/compiler/lib/utils/OPTIONS.def b/rocclr/compiler/lib/utils/OPTIONS.def index 005465c583..77569fe689 100644 --- a/rocclr/compiler/lib/utils/OPTIONS.def +++ b/rocclr/compiler/lib/utils/OPTIONS.def @@ -1267,6 +1267,14 @@ OPTION(OT_BOOL, \ false, 0, 0, NULL, \ "Enable the xnack feature for Finalizer/SC") +// -code-object-version= : code object version +OPTION(OT_UINT32, \ + OA_RUNTIME|OVA_OPTIONAL|OA_SEPARATOR_EQUAL, \ + "code-object-version", NULL, \ + LCCodeObjectVersion, \ + 4, 4, 5, NULL, \ + "Specify code object ABI version. Allowed values are 4, and 5. Defaults to 4. (COMGR only)") + /* Do not remove the following line. Any option should be added above this line. diff --git a/rocclr/device/devprogram.cpp b/rocclr/device/devprogram.cpp index f28a71a217..4175518043 100644 --- a/rocclr/device/devprogram.cpp +++ b/rocclr/device/devprogram.cpp @@ -346,7 +346,7 @@ amd_comgr_status_t Program::createAction(const amd_comgr_language_t oclver, bool Program::linkLLVMBitcode(const amd_comgr_data_set_t inputs, const std::vector& options, const bool requiredDump, amd::option::Options* amdOptions, amd_comgr_data_set_t* output, - char* binaryData[], size_t* binarySize) { + char* binaryData[], size_t* binarySize, const bool link_dev_libs) { amd_comgr_language_t langver; setLanguage(amdOptions->oVariables->CLStd, &langver); @@ -364,19 +364,22 @@ bool Program::linkLLVMBitcode(const amd_comgr_data_set_t inputs, amd_comgr_status_t status = createAction(langver, options, &action, &hasAction); - if (status == AMD_COMGR_STATUS_SUCCESS) { - status = amd::Comgr::create_data_set(&dataSetDevLibs); + if (link_dev_libs) { + if (status == AMD_COMGR_STATUS_SUCCESS) { + status = amd::Comgr::create_data_set(&dataSetDevLibs); + } + + if (status == AMD_COMGR_STATUS_SUCCESS) { + hasDataSetDevLibs = true; + status = amd::Comgr::do_action(AMD_COMGR_ACTION_ADD_DEVICE_LIBRARIES, action, inputs, + dataSetDevLibs); + extractBuildLog(dataSetDevLibs); + } } if (status == AMD_COMGR_STATUS_SUCCESS) { - hasDataSetDevLibs = true; - status = amd::Comgr::do_action(AMD_COMGR_ACTION_ADD_DEVICE_LIBRARIES, action, inputs, - dataSetDevLibs); - extractBuildLog(dataSetDevLibs); - } - - if (status == AMD_COMGR_STATUS_SUCCESS) { - status = amd::Comgr::do_action(AMD_COMGR_ACTION_LINK_BC_TO_BC, action, dataSetDevLibs, *output); + status = amd::Comgr::do_action(AMD_COMGR_ACTION_LINK_BC_TO_BC, action, + (link_dev_libs) ? dataSetDevLibs : inputs, *output); extractBuildLog(*output); } @@ -689,6 +692,7 @@ bool Program::compileImplLC(const std::string& sourceCode, if (device().settings().lcWavefrontSize64_) { driverOptions.push_back("-mwavefrontsize64"); } + driverOptions.push_back("-mcode-object-version=" + std::to_string(options->oVariables->LCCodeObjectVersion)); // Iterate through each source code and dump it into tmp std::fstream f; @@ -967,8 +971,9 @@ bool Program::linkImplLC(const std::vector& inputPrograms, char* binaryData = nullptr; size_t binarySize = 0; std::vector linkOptions; + constexpr bool kLinkDevLibs = false; bool ret = linkLLVMBitcode(inputs, linkOptions, false, options, &output, &binaryData, - &binarySize); + &binarySize, kLinkDevLibs); amd::Comgr::destroy_data_set(output); amd::Comgr::destroy_data_set(inputs); @@ -1202,6 +1207,7 @@ bool Program::linkImplLC(amd::option::Options* options) { if (device().settings().lcWavefrontSize64_) { linkOptions.push_back("wavefrontsize64"); } + linkOptions.push_back("code_object_v" + std::to_string(options->oVariables->LCCodeObjectVersion)); amd_comgr_status_t status = addCodeObjData(llvmBinary_.data(), llvmBinary_.size(), AMD_COMGR_DATA_KIND_BC, @@ -1277,6 +1283,7 @@ bool Program::linkImplLC(amd::option::Options* options) { if (device().settings().lcWavefrontSize64_) { codegenOptions.push_back("-mwavefrontsize64"); } + codegenOptions.push_back("-mcode-object-version=" + std::to_string(options->oVariables->LCCodeObjectVersion)); // NOTE: The params is also used to identy cached code object. This parameter // should not contain any dyanamically generated filename. diff --git a/rocclr/device/devprogram.hpp b/rocclr/device/devprogram.hpp index f9c1af19bd..099d6a37c7 100644 --- a/rocclr/device/devprogram.hpp +++ b/rocclr/device/devprogram.hpp @@ -456,7 +456,8 @@ class Program : public amd::HeapObject { bool linkLLVMBitcode(const amd_comgr_data_set_t inputs, const std::vector& options, const bool requiredDump, amd::option::Options* amdOptions, amd_comgr_data_set_t* output, - char* binaryData[] = nullptr, size_t* binarySize = nullptr); + char* binaryData[] = nullptr, size_t* binarySize = nullptr, + const bool link_dev_libs = true); //! Create the bitcode of the compiled input dataset bool compileToLLVMBitcode(const amd_comgr_data_set_t compileInputs,