From 095b73ae6f632c52e0f544850cc6dc4eef515b79 Mon Sep 17 00:00:00 2001 From: foreman Date: Tue, 3 Nov 2015 11:01:56 -0500 Subject: [PATCH] P4 to Git Change 1206897 by emankov@em-hsa-amd on 2015/11/03 10:43:40 SWDEV-77584 - ORCA RT: Preparations for enabling HSAIL on OpenCL 1.2 by default. Fix error (by CL 1205606) in parsing option algorithm. Compile/link options should be parsed once with additional options specified by AMD_OCL_BUILD(LINK)_OPTIONS(_APPEND) in case of optionChangable or without them, but once. One static method for parsing all options in ORCA RT is created: static bool ParseAllOptions(const std::string& options, option::Options& parsedOptions, bool optionChangable = true, bool linkOptsOnly = false) [Testing] Pre-checkin [Reviewers] German Andryeyev, Nikolay Haustov Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#75 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.hpp#37 edit --- rocclr/runtime/platform/program.cpp | 71 ++++++++++++----------------- rocclr/runtime/platform/program.hpp | 7 +-- 2 files changed, 34 insertions(+), 44 deletions(-) diff --git a/rocclr/runtime/platform/program.cpp b/rocclr/runtime/platform/program.cpp index 40f27f383d..8a8dffabdd 100644 --- a/rocclr/runtime/platform/program.cpp +++ b/rocclr/runtime/platform/program.cpp @@ -143,13 +143,11 @@ Program::compile( } } option::Options parsedOptions; - if ((optionChangable && !ParseAMDOCLBUILDOptions(parsedOptions)) || - !option::parseAllOptions(cppstr, parsedOptions)) { + if (!ParseAllOptions(cppstr, parsedOptions, optionChangable)) { programLog_ = parsedOptions.optionsLog(); LogError("Parsing compile options failed."); return CL_INVALID_COMPILER_OPTIONS; } - programLog_ = parsedOptions.optionsLog(); std::vector headers(numHeaders); for (size_t i = 0; i < numHeaders; ++i) { @@ -241,13 +239,11 @@ Program::link( } } option::Options parsedOptions; - if ((optionChangable && !ParseAMDOCLLINKOptions(parsedOptions)) || - !option::parseLinkOptions(cppstr, parsedOptions)) { + if (!ParseAllOptions(cppstr, parsedOptions, optionChangable, true)) { programLog_ = parsedOptions.optionsLog(); LogError("Parsing link options failed."); return CL_INVALID_LINKER_OPTIONS; } - programLog_ = parsedOptions.optionsLog(); // Link the program programs associated with the given devices. std::vector::const_iterator it; @@ -383,13 +379,11 @@ Program::build( } } option::Options parsedOptions; - if ((optionChangable && !ParseAMDOCLBUILDOptions(parsedOptions)) || - !option::parseAllOptions(cppstr, parsedOptions)) { + if (!ParseAllOptions(cppstr, parsedOptions, optionChangable)) { programLog_ = parsedOptions.optionsLog(); LogError("Parsing compile options failed."); return CL_INVALID_COMPILER_OPTIONS; } - programLog_ = parsedOptions.optionsLog(); // Build the program programs associated with the given devices. std::vector::const_iterator it; @@ -502,39 +496,34 @@ Program::GetOclCVersion(const char* clVer) { } bool -Program::ParseAMDOCLBUILDOptions(option::Options& options) { - std::string opts; - if (AMD_OCL_BUILD_OPTIONS != NULL) { - opts = AMD_OCL_BUILD_OPTIONS; +Program::ParseAllOptions(const std::string& options, option::Options& parsedOptions, bool optionChangable, bool linkOptsOnly) { + std::string allOpts = options; + if (optionChangable) { + if (linkOptsOnly) { + if (AMD_OCL_LINK_OPTIONS != NULL) { + allOpts.append(" "); + allOpts.append(AMD_OCL_LINK_OPTIONS); + } + if (AMD_OCL_LINK_OPTIONS_APPEND != NULL) { + allOpts.append(" "); + allOpts.append(AMD_OCL_LINK_OPTIONS_APPEND); + } + } else { + if (AMD_OCL_BUILD_OPTIONS != NULL) { + allOpts.append(" "); + allOpts.append(AMD_OCL_BUILD_OPTIONS); + } + if (!Device::appProfile()->GetBuildOptsAppend().empty()) { + allOpts.append(" "); + allOpts.append(Device::appProfile()->GetBuildOptsAppend()); + } + if (AMD_OCL_BUILD_OPTIONS_APPEND != NULL) { + allOpts.append(" "); + allOpts.append(AMD_OCL_BUILD_OPTIONS_APPEND); + } + } } - if (!Device::appProfile()->GetBuildOptsAppend().empty()) { - opts.append(" "); - opts.append(Device::appProfile()->GetBuildOptsAppend()); - } - if (AMD_OCL_BUILD_OPTIONS_APPEND != NULL) { - opts.append(" "); - opts.append(AMD_OCL_BUILD_OPTIONS_APPEND); - } - if (!amd::option::parseAllOptions(opts, options)) { - return false; - } - return true; -} - -bool -Program::ParseAMDOCLLINKOptions(option::Options& options) { - std::string opts; - if (AMD_OCL_LINK_OPTIONS != NULL) { - opts = AMD_OCL_LINK_OPTIONS; - } - if (AMD_OCL_LINK_OPTIONS_APPEND != NULL) { - opts.append(" "); - opts.append(AMD_OCL_LINK_OPTIONS_APPEND); - } - if (!amd::option::parseLinkOptions(opts, options)) { - return false; - } - return true; + return amd::option::parseAllOptions(allOpts, parsedOptions, linkOptsOnly); } bool diff --git a/rocclr/runtime/platform/program.hpp b/rocclr/runtime/platform/program.hpp index 2402d218e0..4a9d3ded77 100644 --- a/rocclr/runtime/platform/program.hpp +++ b/rocclr/runtime/platform/program.hpp @@ -189,9 +189,10 @@ public: static int GetOclCVersion(const char* clVer); - static bool ParseAMDOCLBUILDOptions(option::Options& options); - - static bool ParseAMDOCLLINKOptions(option::Options& options); + static bool ParseAllOptions(const std::string& options, + option::Options& parsedOptions, + bool optionChangable = true, + bool linkOptsOnly = false); }; /*! @}