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: 3c475679ba]
Этот коммит содержится в:
foreman
2014-10-08 12:12:00 -04:00
родитель e6c40cb647
Коммит e34143e323
+102 -141
Просмотреть файл
@@ -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<amd::option::Options*>(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<amd::option::Options*>(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<amd::option::Options*>(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<amd::option::Options*>(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: