Skip to content

Commit

Permalink
Made hiprtc programs dispachable.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kerilk committed Jul 20, 2023
1 parent ef6c28b commit 16dd5fa
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 11 deletions.
5 changes: 5 additions & 0 deletions src/common.hh
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ struct ihipDispatch {

#define HIPTEXTUREOBJECT(x) CHIPTOHIP(x, __hip_texture)

#define PROGRAM(x) HIPTOCHIP(x, chipstar::Program)

#define HIPRTCPROGRAM(x) CHIPTOHIP(x, _hiprtcProgram)

/// The implementation of ihipEvent_t. The chipstar::Event class inherits this
/// so ihipEvent_t pointers may carry chipstar::Event instances.
struct ihipEvent_t : ihipDispatch {};
Expand All @@ -115,6 +119,7 @@ struct ihipGraph : ihipDispatch {};
struct hipGraphNode : ihipDispatch {};
struct hipGraphExec : ihipDispatch {};
struct __hip_texture : ihipDispatch {};
struct _hiprtcProgram : ihipDispatch {};

bool filterSPIRV(const char *Bytes, size_t NumBytes, std::string &Dst);
bool parseSPIR(uint32_t *Stream, size_t NumWords,
Expand Down
25 changes: 14 additions & 11 deletions src/spirv_hiprtc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ hiprtcResult hiprtcAddNameExpression(hiprtcProgram Prog,
if (!Prog || !NameExpression)
return HIPRTC_ERROR_INVALID_INPUT;

auto &Program = *(chipstar::Program *)Prog;
auto &Program = *PROGRAM(Prog);
if (Program.isAfterCompilation())
return HIPRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION;

Expand Down Expand Up @@ -395,7 +395,7 @@ hiprtcResult hiprtcCompileProgram(hiprtcProgram Prog, int NumOptions,
if (!Prog)
return HIPRTC_ERROR_INVALID_INPUT;
try {
auto &Program = *(chipstar::Program *)Prog;
auto &Program = *PROGRAM(Prog);

// Create temporary directory for compilation I/O.
auto TmpDir = createTemporaryDirectory();
Expand Down Expand Up @@ -436,8 +436,9 @@ hiprtcResult hiprtcCreateProgram(hiprtcProgram *Prog, const char *Src,
try {
// From NVRTC: 'CUDA program name. name can be NULL;
// "default_program" is used when name is NULL or "". '.
auto Program =
std::make_unique<chipstar::Program>(Name ? Name : "default_program");
void *mem = malloc(sizeof(ihipDispatch) + sizeof(chipstar::Program));
chipstar::Program *Program = CHIP_HANDLE_TO_OBJ(mem, chipstar::Program);
Program = new (Program) chipstar::Program(Name ? Name : "default_program");
Program->setSource(Src);

for (int i = 0; i < NumHeaders; i++) {
Expand Down Expand Up @@ -465,7 +466,7 @@ hiprtcResult hiprtcCreateProgram(hiprtcProgram *Prog, const char *Src,
Program->addHeader(IncludeName, HeaderPtr);
}

*Prog = (hiprtcProgram)Program.release();
*Prog = HIPRTCPROGRAM(Program);
return HIPRTC_SUCCESS;
} catch (...) {
logDebug("Caught an unknown exception\n");
Expand All @@ -477,7 +478,9 @@ hiprtcResult hiprtcDestroyProgram(hiprtcProgram *Prog) {
if (!Prog || !*Prog)
return HIPRTC_ERROR_INVALID_PROGRAM;
try {
delete (chipstar::Program *)*Prog;
chipstar::Program *Program = PROGRAM(*Prog);
Program->~Program();
free(*Prog);
*Prog = nullptr;
} catch (...) {
logDebug("Caught an unknown exception\n");
Expand All @@ -492,7 +495,7 @@ hiprtcResult hiprtcGetLoweredName(hiprtcProgram WrappedProg,
if (!WrappedProg || !NameExpression || !LoweredName)
return HIPRTC_ERROR_INVALID_INPUT;

auto &Prog = *(chipstar::Program *)WrappedProg;
auto &Prog = *PROGRAM(WrappedProg);
if (!Prog.isAfterCompilation())
return HIPRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION;

Expand All @@ -510,7 +513,7 @@ hiprtcResult hiprtcGetProgramLog(hiprtcProgram Prog, char *Log) {
if (!Prog || !Log)
return HIPRTC_ERROR_INVALID_INPUT;
try {
const auto &LogSrc = ((chipstar::Program *)Prog)->getProgramLog();
const auto &LogSrc = PROGRAM(Prog)->getProgramLog();
std::memcpy(Log, LogSrc.c_str(), LogSrc.size());
return HIPRTC_SUCCESS;
} catch (...) {
Expand All @@ -523,7 +526,7 @@ hiprtcResult hiprtcGetProgramLogSize(hiprtcProgram Prog, size_t *LogSizeRet) {
if (!Prog || !LogSizeRet)
return HIPRTC_ERROR_INVALID_INPUT;
try {
*LogSizeRet = ((chipstar::Program *)Prog)->getProgramLog().size();
*LogSizeRet = PROGRAM(Prog)->getProgramLog().size();
return HIPRTC_SUCCESS;
} catch (...) {
logDebug("Caught an unknown exception\n");
Expand All @@ -537,7 +540,7 @@ hiprtcResult hiprtcGetCode(hiprtcProgram Prog, char *Code) {
if (!Code)
return HIPRTC_ERROR_INVALID_INPUT;
try {
auto &SavedCode = ((chipstar::Program *)Prog)->getCode();
auto &SavedCode = PROGRAM(Prog)->getCode();
std::memcpy(Code, SavedCode.c_str(), SavedCode.size());
return HIPRTC_SUCCESS;
} catch (...) {
Expand All @@ -552,7 +555,7 @@ hiprtcResult hiprtcGetCodeSize(hiprtcProgram Prog, size_t *CodeSizeRet) {
if (!CodeSizeRet)
return HIPRTC_ERROR_INVALID_INPUT;
try {
*CodeSizeRet = ((chipstar::Program *)Prog)->getCode().size();
*CodeSizeRet = PROGRAM(Prog)->getCode().size();
return HIPRTC_SUCCESS;
} catch (...) {
logDebug("Caught an unknown exception\n");
Expand Down

0 comments on commit 16dd5fa

Please sign in to comment.