From 8167dee7d5dcce97a0ee877e6aa4227bc06ec411 Mon Sep 17 00:00:00 2001 From: foreman Date: Fri, 6 Sep 2019 19:11:43 -0400 Subject: [PATCH] P4 to Git Change 1994974 by skudchad@skudchad_test2_win_opencl on 2019/09/06 19:09:36 SWDEV-199293 - Implement some hipRTC apis. ReviewBoardURL = http://ocltc.amd.com/reviews/r/17953/diff/ Affected files ... ... //depot/stg/opencl/drivers/opencl/api/hip/build/Makefile.hip#18 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_rtc.cpp#2 edit --- api/hip/hip_rtc.cpp | 216 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 188 insertions(+), 28 deletions(-) diff --git a/api/hip/hip_rtc.cpp b/api/hip/hip_rtc.cpp index a5dbd097ae..c339f01401 100644 --- a/api/hip/hip_rtc.cpp +++ b/api/hip/hip_rtc.cpp @@ -21,8 +21,9 @@ THE SOFTWARE. */ #include +#include "cl_common.hpp" #include -#include +#include const char* hiprtcGetErrorString(hiprtcResult x) { switch (x) { @@ -50,23 +51,115 @@ const char* hiprtcGetErrorString(hiprtcResult x) { return "HIPRTC_ERROR_NAME_EXPRESSION_NOT_VALID"; case HIPRTC_ERROR_INTERNAL_ERROR: return "HIPRTC_ERROR_INTERNAL_ERROR"; - default: + default: throw std::logic_error{"Invalid HIPRTC result."}; - }; + }; } -hiprtcResult hiprtcAddNameExpression(hiprtcProgram p, const char* n) { - return HIPRTC_SUCCESS; +namespace hip_impl { +inline std::string demangle(const char* x) { + if (!x) { + return {}; + } + return boost::core::demangle(x); } +} // Namespace hip_impl + +struct _hiprtcProgram { + static amd::Monitor lock_; + static std::vector> programs_; + + std::vector> headers; + std::vector> names; + std::vector loweredNames; + std::vector elf; + std::string source; + std::string name; + std::string log; + bool compiled; + + static _hiprtcProgram* build(std::string s, std::string n, + std::vector> h) { + std::unique_ptr<_hiprtcProgram> tmp{ + new _hiprtcProgram{std::move(h), {}, {}, {}, std::move(s), std::move(n), {}, false}}; + + amd::ScopedLock lock(_hiprtcProgram::lock_); + + programs_.push_back(move(tmp)); + + return programs_.back().get(); + } + + static hiprtcResult destroy(_hiprtcProgram* p) { + amd::ScopedLock lock(_hiprtcProgram::lock_); + + const auto it { + std::find_if(programs_.cbegin(), programs_.cend(), + [=](const std::unique_ptr<_hiprtcProgram>& x) + { return x.get() == p; }) }; + + if (it == programs_.cend()) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } -hiprtcResult hiprtcCompileProgram(hiprtcProgram p, int n, const char** o) -{ return HIPRTC_SUCCESS; + } + + static std::string handleMangledName(std::string name) { + name = hip_impl::demangle(name.c_str()); + + if (name.empty()) { + return name; + } + + if (name.find("void ") == 0) { + name.erase(0, strlen("void ")); + } + + auto dx {name.find_first_of("(<")}; + + if (dx == std::string::npos) { + return name; + } + + if (name[dx] == '<') { + auto cnt{1u}; + do { + ++dx; + cnt += (name[dx] == '<') ? 1 : ((name[dx] == '>') ? -1 : 0); + } while (cnt); + + name.erase(++dx); + } else { + name.erase(dx); + } + + return name; + } + + static bool isValid(_hiprtcProgram* p) { + return std::find_if(programs_.cbegin(), programs_.cend(), + [=](const std::unique_ptr<_hiprtcProgram>& x) { + return x.get() == p; }) != programs_.cend(); + } +}; + +// Init +std::vector> _hiprtcProgram::programs_{}; +amd::Monitor _hiprtcProgram::lock_("hiprtcProgram lock"); + +inline bool isValidProgram(const hiprtcProgram p) { + if (p == nullptr) { + return false; + } + + amd::ScopedLock lock(_hiprtcProgram::lock_); + + return _hiprtcProgram::isValid(p); } -hiprtcResult hiprtcCreateProgram(hiprtcProgram* p, const char* src, - const char* name, int n, const char** hdrs, - const char** incs) { +hiprtcResult hiprtcCreateProgram(hiprtcProgram* p, const char* src, const char* name, int n, + const char** hdrs, const char** incs) { if (p == nullptr) { return HIPRTC_ERROR_INVALID_PROGRAM; } @@ -77,36 +170,103 @@ hiprtcResult hiprtcCreateProgram(hiprtcProgram* p, const char* src, return HIPRTC_ERROR_INVALID_INPUT; } + std::vector> h; + + for (auto i = 0; i != n; ++i) { + h.emplace_back(incs[i], hdrs[i]); + } + *p = _hiprtcProgram::build(src, name ? name : "default_name", std::move(h)); + return HIPRTC_SUCCESS; } -hiprtcResult hiprtcDestroyProgram(hiprtcProgram* p) -{ - return HIPRTC_SUCCESS; +hiprtcResult hiprtcAddNameExpression(hiprtcProgram p, const char* n) { + return HIPRTC_SUCCESS; } -hiprtcResult hiprtcGetLoweredName(hiprtcProgram p, const char* n, - const char** ln) -{ - return HIPRTC_SUCCESS; +hiprtcResult hiprtcCompileProgram(hiprtcProgram p, int n, const char** o) { + return HIPRTC_SUCCESS; } -hiprtcResult hiprtcGetProgramLog(hiprtcProgram p, char* l) -{ +hiprtcResult hiprtcDestroyProgram(hiprtcProgram* p) { + if (p == nullptr) { return HIPRTC_SUCCESS; + } + return _hiprtcProgram::destroy(*p); } -hiprtcResult hiprtcGetProgramLogSize(hiprtcProgram p, std::size_t* sz) -{ - return HIPRTC_SUCCESS; +hiprtcResult hiprtcGetLoweredName(hiprtcProgram p, const char* n, const char** ln) { + return HIPRTC_SUCCESS; } -hiprtcResult hiprtcGetCode(hiprtcProgram p, char* c) -{ - return HIPRTC_SUCCESS; +hiprtcResult hiprtcGetProgramLog(hiprtcProgram p, char* log) { + if (log == nullptr) { + return HIPRTC_ERROR_INVALID_INPUT; + } + + if (!isValidProgram(p)) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + if (!p->compiled) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + log = std::copy_n(p->log.data(), p->log.size(), log); + *log = '\0'; + + return HIPRTC_SUCCESS; } -hiprtcResult hiprtcGetCodeSize(hiprtcProgram p, std::size_t* sz) -{ - return HIPRTC_SUCCESS; +hiprtcResult hiprtcGetProgramLogSize(hiprtcProgram p, std::size_t* sz) { + if (sz == nullptr) { + return HIPRTC_ERROR_INVALID_INPUT; + } + + if (!isValidProgram(p)) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + if (!p->compiled) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + *sz = p->log.empty() ? 0 : p->log.size() + 1; + return HIPRTC_SUCCESS; +} + +hiprtcResult hiprtcGetCode(hiprtcProgram p, char* c) { + if (c == nullptr) { + return HIPRTC_ERROR_INVALID_INPUT; + } + + if (!isValidProgram(p)) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + if (!p->compiled) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + std::copy_n(p->elf.data(), p->elf.size(), c); + + return HIPRTC_SUCCESS; +} + +hiprtcResult hiprtcGetCodeSize(hiprtcProgram p, std::size_t* sz) { + if (sz == nullptr) { + return HIPRTC_ERROR_INVALID_INPUT; + } + + if (!isValidProgram(p)) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + if (!p->compiled) { + return HIPRTC_ERROR_INVALID_PROGRAM; + } + + *sz = p->elf.size(); + + return HIPRTC_SUCCESS; } \ No newline at end of file