From e34143e323e02c8080642d9bb9b60575270e7d7a Mon Sep 17 00:00:00 2001
From: foreman
Date: Wed, 8 Oct 2014 12:12:00 -0400
Subject: [PATCH] P4 to Git Change 1085416 by emankov@em-hsa-amd on 2014/10/08
11:37:27
ECR #333753 - Compiler Lib: Compilation from ACL_TYPE_HSAIL_TEXT fix
+ Make HSAIL compilation work from aclSOURCE section also (as it was) besides aclCODEGEN
+ Refactoring, simplification & annotating of if_aclCompile() function
Testing: smoke_clang, pre check-in, aoc2 tests (not integrated yet)
Reviewers: Brian Sumner, Artem Tamazov
Affected files ...
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/v0_8/if_acl.cpp#54 edit
[ROCm/clr commit: 3c475679ba7f45ac727fcb51451d603345779ad9]
---
.../lib/backends/common/v0_8/if_acl.cpp | 243 ++++++++----------
1 file changed, 102 insertions(+), 141 deletions(-)
diff --git a/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp b/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
index bcf0739a5c..ec1b28879a 100644
--- a/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
+++ b/projects/clr/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
@@ -1281,9 +1281,14 @@ if_aclCompile(aclCompiler *cl,
aclType to,
aclLogFunction compile_callback)
{
- if (bin == NULL || cl == NULL) {
+ if (!bin || !cl) {
return ACL_INVALID_ARG;
}
+ if (((from == ACL_TYPE_X86_TEXT || from == ACL_TYPE_X86_BINARY) && !isCpuTarget(bin->target)) ||
+ ((from == ACL_TYPE_AMDIL_TEXT || from == ACL_TYPE_AMDIL_BINARY) && !isAMDILTarget(bin->target)) ||
+ ((from == ACL_TYPE_HSAIL_TEXT || from == ACL_TYPE_HSAIL_BINARY) && !isHSAILTarget(bin->target))) {
+ return ACL_INVALID_BINARY;
+ }
acl_error error_code = IsValidCompilationOptions(bin, compile_callback);
if (error_code != ACL_SUCCESS) {
return error_code;
@@ -1296,7 +1301,7 @@ if_aclCompile(aclCompiler *cl,
#else
llvm::sys::PrintStackTraceOnErrorSignal();
#endif
- } else
+ } else
#endif
{
llvm::InitializeAllAsmParsers();
@@ -1304,113 +1309,88 @@ if_aclCompile(aclCompiler *cl,
llvm::PassRegistry &Registry = *llvm::PassRegistry::getPassRegistry();
llvm::initializeSPIRVerifierPass(Registry);
}
- // Default 'to' is ISA.
+ // Default 'to' is ACL_TYPE_ISA
if (to == ACL_TYPE_DEFAULT) {
to = ACL_TYPE_ISA;
}
- if ((from == ACL_TYPE_X86_TEXT
- || from == ACL_TYPE_X86_BINARY)
- && (bin->target.arch_id != aclX86
- && bin->target.arch_id != aclX64)) {
- return ACL_INVALID_BINARY;
- }
-
- if ((from == ACL_TYPE_AMDIL_TEXT
- || from == ACL_TYPE_AMDIL_BINARY)
- && !isAMDILTarget(bin->target)) {
- return ACL_INVALID_BINARY;
- }
-
- if ((from == ACL_TYPE_HSAIL_TEXT
- || from == ACL_TYPE_HSAIL_BINARY)
- && bin->target.arch_id != aclHSAIL
- && bin->target.arch_id != aclHSAIL64) {
- return ACL_INVALID_BINARY;
- }
- if ((from == ACL_TYPE_HSAIL_TEXT && to == ACL_TYPE_HSAIL_BINARY)
- || (from == ACL_TYPE_HSAIL_BINARY && to == ACL_TYPE_HSAIL_TEXT)
- || (from == ACL_TYPE_AMDIL_TEXT && to == ACL_TYPE_AMDIL_BINARY)
- || (from == ACL_TYPE_AMDIL_BINARY && to == ACL_TYPE_AMDIL_TEXT)
- || (from == ACL_TYPE_SPIR_TEXT && to == ACL_TYPE_SPIR_BINARY)
- || (from == ACL_TYPE_SPIR_BINARY && to == ACL_TYPE_SPIR_TEXT)
- || (from == ACL_TYPE_LLVMIR_TEXT && to == ACL_TYPE_LLVMIR_BINARY)
- || (from == ACL_TYPE_LLVMIR_BINARY && to == ACL_TYPE_LLVMIR_TEXT)
- || (from == ACL_TYPE_X86_TEXT && to == ACL_TYPE_X86_BINARY)
- || (from == ACL_TYPE_X86_BINARY && to == ACL_TYPE_X86_TEXT)
- ) {
- amd::option::Options* Opts = reinterpret_cast(bin->options);
- const char *kernel = Opts->oVariables->Kernel;
- return aclConvertType(cl, bin, kernel, from);
- }
-
- if ((from == ACL_TYPE_AMDIL_TEXT
- || from == ACL_TYPE_AMDIL_BINARY
- || from == ACL_TYPE_X86_TEXT
- || from == ACL_TYPE_X86_BINARY)
- && to != ACL_TYPE_ISA) {
- return ACL_INVALID_ARG;
- }
-
- if ((from == ACL_TYPE_HSAIL_TEXT
- || from == ACL_TYPE_HSAIL_BINARY)
- && (to != ACL_TYPE_CG && to != ACL_TYPE_ISA)) {
- return ACL_INVALID_ARG;
- }
-
- if (from == ACL_TYPE_HSAIL_TEXT) {
+ if ((from == ACL_TYPE_HSAIL_TEXT && (to == ACL_TYPE_HSAIL_BINARY ||
+ to == ACL_TYPE_CG ||
+ to == ACL_TYPE_ISA)) ||
+ (from == ACL_TYPE_HSAIL_BINARY && (to == ACL_TYPE_HSAIL_TEXT ||
+ to == ACL_TYPE_CG ||
+ to == ACL_TYPE_ISA)) ||
+ (from == ACL_TYPE_AMDIL_TEXT && to == ACL_TYPE_AMDIL_BINARY) ||
+ (from == ACL_TYPE_AMDIL_BINARY && to == ACL_TYPE_AMDIL_TEXT) ||
+ (from == ACL_TYPE_SPIR_TEXT && to == ACL_TYPE_SPIR_BINARY) ||
+ (from == ACL_TYPE_SPIR_BINARY && to == ACL_TYPE_SPIR_TEXT) ||
+ (from == ACL_TYPE_LLVMIR_TEXT && to == ACL_TYPE_LLVMIR_BINARY)||
+ (from == ACL_TYPE_LLVMIR_BINARY && to == ACL_TYPE_LLVMIR_TEXT) ||
+ (from == ACL_TYPE_X86_TEXT && to == ACL_TYPE_X86_BINARY) ||
+ (from == ACL_TYPE_X86_BINARY && to == ACL_TYPE_X86_TEXT)) {
amd::option::Options* Opts = reinterpret_cast(bin->options);
const char *kernel = Opts->oVariables->Kernel;
error_code = aclConvertType(cl, bin, kernel, from);
- if (error_code != ACL_SUCCESS)
+ // if compilation to ACL_TYPE_ISA, then continue from ACL_TYPE_CG
+ if (to == ACL_TYPE_ISA && error_code == ACL_SUCCESS) {
+ from = ACL_TYPE_CG;
+ } else {
return error_code;
- if (to == ACL_TYPE_CG)
- return ACL_SUCCESS;
- from = ACL_TYPE_CG;
+ }
}
-
- bool stages[5] = {false};
- uint8_t sectable[ACL_TYPE_LAST] =
- { 0, 0, 1, 1, 1, 1, 0, 6, 0, 3, 4, 4, 4, 0, 5, 0, 1 };
- aclSections d_section[7] =
- { aclSOURCE, aclLLVMIR, aclSPIR, aclSOURCE, aclCODEGEN, aclTEXT, aclINTERNAL };
+ if ((from == ACL_TYPE_AMDIL_TEXT || from == ACL_TYPE_AMDIL_BINARY ||
+ from == ACL_TYPE_X86_TEXT || from == ACL_TYPE_X86_BINARY ||
+ from == ACL_TYPE_HSAIL_TEXT || from == ACL_TYPE_HSAIL_BINARY) &&
+ to != ACL_TYPE_ISA) {
+ return ACL_INVALID_ARG;
+ }
+ uint8_t sectable[ACL_TYPE_LAST] = {0, 0, 1, 1, 1, 1, 0, 6, 0, 3, 4, 4, 4, 0, 5, 0, 1};
+ aclSections d_section[7] = {aclSOURCE, aclLLVMIR, aclSPIR, aclSOURCE, aclCODEGEN, aclTEXT, aclINTERNAL};
uint8_t start = sectable[from];
uint8_t stop = sectable[to];
const void* data = NULL;
size_t data_size = 0;
- if (from == ACL_TYPE_DEFAULT) {
- aclSections sections[] = { aclSOURCE, aclSPIR, aclLLVMIR, aclCODEGEN, aclTEXT };
- uint8_t table[] = { 0, 1, 1, 4, 5 };
- aclType type[] = { ACL_TYPE_SOURCE, ACL_TYPE_SPIR_BINARY, ACL_TYPE_LLVMIR_BINARY,
- ACL_TYPE_CG, ACL_TYPE_ISA };
- for (int y = 0, x = sizeof(sections) / sizeof(sections[0]) - 1;
- x >= y; --x) {
- data = (const char*)cl->clAPI.extSec(cl, bin, &data_size,
- sections[x], &error_code);
- if (data != NULL && data_size > 0 && error_code == ACL_SUCCESS) {
+ switch (from) {
+ default:
+ data = cl->clAPI.extSec(cl, bin, &data_size, d_section[start], &error_code);
+ break;
+ case ACL_TYPE_DEFAULT: {
+ aclSections sections[] = {aclSOURCE, aclSPIR, aclLLVMIR, aclCODEGEN, aclTEXT};
+ uint8_t table[] = {0, 1, 1, 4, 5};
+ aclType type[] = {ACL_TYPE_SOURCE, ACL_TYPE_SPIR_BINARY, ACL_TYPE_LLVMIR_BINARY, ACL_TYPE_CG, ACL_TYPE_ISA};
+ for (int y = 0, x = sizeof(sections) / sizeof(sections[0]) - 1; x >= y; --x) {
+ data = (const char*)cl->clAPI.extSec(cl, bin, &data_size, sections[x], &error_code);
+ if (data && data_size > 0 && error_code == ACL_SUCCESS) {
start = table[x];
from = type[x];
break;
}
}
- } else {
- if (from == ACL_TYPE_SPIR_BINARY ||
- from == ACL_TYPE_SPIR_TEXT) {
- data = cl->clAPI.extSec(cl, bin, &data_size, aclSPIR, &error_code);
- }
- else if (from == ACL_TYPE_RSLLVMIR_BINARY) {
- data = cl->clAPI.extSec(cl, bin, &data_size, aclLLVMIR, &error_code);
- }
- else if (from == ACL_TYPE_HSAIL_BINARY) {
- data = cl->clAPI.extSec(cl, bin, &data_size, aclSOURCE, &error_code);
+ break;
+ }
+ case ACL_TYPE_SPIR_BINARY:
+ case ACL_TYPE_SPIR_TEXT:
+ data = cl->clAPI.extSec(cl, bin, &data_size, aclSPIR, &error_code);
+ break;
+ case ACL_TYPE_RSLLVMIR_BINARY:
+ data = cl->clAPI.extSec(cl, bin, &data_size, aclLLVMIR, &error_code);
+ break;
+ case ACL_TYPE_HSAIL_BINARY:
+ data = cl->clAPI.extSec(cl, bin, &data_size, aclSOURCE, &error_code);
// if for ACL_TYPE_HSAIL_BINARY stage BRIG (data) is not presented in aclSOURCE (.source) section of BIF,
- // then it should be in multiple corresponding .brig_ sections in BIF, so continue to compile
- if (error_code == ACL_ELF_ERROR) {
- error_code = ACL_SUCCESS;
- }
+ // then it should be in multiple corresponding .brig_ sections in BIF, so continue to compile (data might be NULL)
+ if (error_code == ACL_ELF_ERROR) {
+ error_code = ACL_SUCCESS;
}
- else {
+ break;
+ case ACL_TYPE_CG:
+ // there is no data for codegen phase (data might be NULL),
+ // BRIG should be in its multiple corresponding .brig_ sections in BIF
+ if (isHSAILTarget(bin->target)) {
+ from = ACL_TYPE_CG;
+ } else {
data = cl->clAPI.extSec(cl, bin, &data_size, d_section[start], &error_code);
}
+ break;
}
if (error_code != ACL_SUCCESS) {
return error_code;
@@ -1419,16 +1399,12 @@ if_aclCompile(aclCompiler *cl,
// the correct pointers unless they are custom loaded, then we should
// not modify them. This code is ugly and needs to be designed better.
if (start == 0) {
- if (from == ACL_TYPE_OPENCL
- || from == ACL_TYPE_SOURCE
- || from == ACL_TYPE_DEFAULT) {
- const oclBIFSymbolStruct* symbol
- = findBIF30SymStruct(symOpenclCompilerOptions);
- assert(symbol && "symbol not found");
- std::string optSec = std::string(symbol->str[PRE]) + std::string(symbol->str[POST]);
- assert(symbol->sections[0] == aclCOMMENT
- && symbol->sections[0] == symbol->sections[1]
- && "not in comment section");
+ if (from == ACL_TYPE_OPENCL || from == ACL_TYPE_SOURCE || from == ACL_TYPE_DEFAULT) {
+ const oclBIFSymbolStruct* sym = findBIF30SymStruct(symOpenclCompilerOptions);
+ assert(sym && "symbol not found");
+ assert(sym->sections[0] == aclCOMMENT && sym->sections[0] == sym->sections[1] &&
+ "not in comment section");
+ std::string optSec = std::string(sym->str[PRE]) + std::string(sym->str[POST]);
saveOptionsToComments(cl, bin, options, optSec);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &SPIRInit, &OCLInit);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &AMDILInit, &OCLInit);
@@ -1438,52 +1414,34 @@ if_aclCompile(aclCompiler *cl,
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &HSAILFEFini, &OCLFini);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.toISA, &AMDILFEToISA, NULL);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.toISA, &HSAILFEToISA, NULL);
- if (to == ACL_TYPE_LLVMIR_BINARY
- || to == ACL_TYPE_LLVMIR_TEXT) {
+ if (to == ACL_TYPE_LLVMIR_BINARY || to == ACL_TYPE_LLVMIR_TEXT) {
cl->feAPI.toISA = NULL;
cl->feAPI.toIR = &OCLFEToLLVMIR;
- } else if(to == ACL_TYPE_SPIR_BINARY
- || to == ACL_TYPE_SPIR_TEXT) {
+ } else if(to == ACL_TYPE_SPIR_BINARY || to == ACL_TYPE_SPIR_TEXT) {
cl->feAPI.toISA = NULL;
cl->feAPI.toIR = &OCLFEToSPIR;
}
- } else if (from == ACL_TYPE_AMDIL_TEXT) {
+ } else if (from == ACL_TYPE_AMDIL_TEXT || from == ACL_TYPE_HSAIL_TEXT) {
+ const oclBIFSymbolStruct* sym = findBIF30SymStruct(symAMDILCompilerOptions);
+ assert(sym && "symbol not found");
+ assert(sym->sections[0] == aclCOMMENT && "not in comment section");
amd::option::Options* Opts = reinterpret_cast(bin->options);
const char *kernel = Opts->oVariables->Kernel;
- const oclBIFSymbolStruct* symbol
- = findBIF30SymStruct(symAMDILCompilerOptions);
- assert(symbol && "symbol not found");
- std::string optSec = std::string(symbol->str[PRE])
- + std::string((kernel == NULL) ? "main" : kernel)
- + std::string(symbol->str[POST]);
- assert(symbol->sections[0] == aclCOMMENT && "not in comment section");
+ std::string optSec = std::string(sym->str[PRE]) +
+ std::string((!kernel) ? "main" : kernel) +
+ std::string(sym->str[POST]);
saveOptionsToComments(cl, bin, options, optSec);
if (to == ACL_TYPE_ISA || to == ACL_TYPE_DEFAULT) {
stop = 1;
- cl->feAPI.init = &AMDILInit;
- cl->feAPI.fini = &AMDILFini;
- cl->feAPI.toISA = &AMDILFEToISA;
- cl->feAPI.toIR = NULL;
- cl->feAPI.toModule = NULL;
- } else {
- return ACL_UNSUPPORTED;
- }
- } else if (from == ACL_TYPE_HSAIL_TEXT) {
- amd::option::Options* Opts = reinterpret_cast(bin->options);
- const char *kernel = Opts->oVariables->Kernel;
- const oclBIFSymbolStruct* symbol
- = findBIF30SymStruct(symHSACompilerOptions);
- assert(symbol && "symbol not found");
- std::string optSec = std::string(symbol->str[PRE])
- + std::string((kernel == NULL) ? "main" : kernel)
- + std::string(symbol->str[POST]);
- assert(symbol->sections[0] == aclCOMMENT && "not in comment section");
- saveOptionsToComments(cl, bin, options, optSec);
- if (to == ACL_TYPE_ISA || to == ACL_TYPE_DEFAULT) {
- stop = 1;
- CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &OCLInit, &HSAILFEInit);
- CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &OCLFini, &HSAILFEFini);
- CONDITIONAL_CMP_ASSIGN(cl->feAPI.toISA, &OCLFEToISA, &HSAILFEToISA);
+ if (from == ACL_TYPE_AMDIL_TEXT) {
+ cl->feAPI.init = &AMDILInit;
+ cl->feAPI.fini = &AMDILFini;
+ cl->feAPI.toISA = &AMDILFEToISA;
+ } else {
+ CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &OCLInit, &HSAILFEInit);
+ CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &OCLFini, &HSAILFEFini);
+ CONDITIONAL_CMP_ASSIGN(cl->feAPI.toISA, &OCLFEToISA, &HSAILFEToISA);
+ }
cl->feAPI.toIR = NULL;
cl->feAPI.toModule = NULL;
} else {
@@ -1501,27 +1459,26 @@ if_aclCompile(aclCompiler *cl,
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &HSAILFEFini, &SPIRFini);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.toModule, &OCLFEToModule, &SPIRToModule);
} else if (from == ACL_TYPE_LLVMIR_BINARY || from == ACL_TYPE_LLVMIR_TEXT ||
- from == ACL_TYPE_SPIR_BINARY || from == ACL_TYPE_SPIR_TEXT ||
- from == ACL_TYPE_RSLLVMIR_BINARY) {
+ from == ACL_TYPE_SPIR_BINARY || from == ACL_TYPE_SPIR_TEXT ||
+ from == ACL_TYPE_RSLLVMIR_BINARY) {
CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &SPIRInit, &OCLInit);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &AMDILInit, &OCLInit);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.init, &HSAILFEInit, &OCLInit);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &SPIRFini, &OCLFini);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &AMDILFini, &OCLFini);
CONDITIONAL_CMP_ASSIGN(cl->feAPI.fini, &HSAILFEFini, &OCLFini);
-
- if (from == ACL_TYPE_RSLLVMIR_BINARY) {
- cl->feAPI.toModule = &RSLLVMIRToModule;
- }
+ if (from == ACL_TYPE_RSLLVMIR_BINARY) {
+ cl->feAPI.toModule = &RSLLVMIRToModule;
+ }
}
}
-
if (start > stop) {
return ACL_INVALID_ARG;
}
if (start == stop) {
return ACL_SUCCESS;
}
+ bool stages[5] = {false};
for (uint8_t x = start; x < stop; ++x) {
stages[x] = true;
}
@@ -1809,6 +1766,10 @@ if_aclConvertType(aclCompiler *cl,
from_data = cl->clAPI.extSec(cl, bin, &from_data_size,
symbol->sections[0], &error_code);
}
+ // HSAIL is in aclSOURCE section (might be used while compiling from HSAIL by -hsail option)
+ if (!from_data) {
+ from_data = cl->clAPI.extSec(cl, bin, &from_data_size, aclSOURCE, &error_code);
+ }
break;
}
case ACL_TYPE_HSAIL_BINARY: