2
0

Revert "Bring loader in sync with stg/sc"

This reverts commit c798c60343.

Change-Id: If99e8cc9e2afb525f690e49eb6538d8e950a5615
Este cometimento está contido em:
Konstantin Zhuravlyov
2016-12-14 15:14:36 -05:00
ascendente c798c60343
cometimento 08aded148a
12 ficheiros modificados com 132 adições e 1178 eliminações
+66 -78
Ver ficheiro
@@ -72,7 +72,6 @@ public:
const amd::options::NoArgOption* DumpExec() const { return &dump_exec; }
const amd::options::NoArgOption* DumpAll() const { return &dump_all; }
const amd::options::ValueOption<std::string>* DumpDir() const { return &dump_dir; }
const amd::options::PrefixOption* Substitute() const { return &substitute; }
bool ParseOptions(const std::string& options);
void Reset();
@@ -91,7 +90,6 @@ private:
amd::options::NoArgOption dump_exec;
amd::options::NoArgOption dump_all;
amd::options::ValueOption<std::string> dump_dir;
amd::options::PrefixOption substitute;
amd::options::OptionParser option_parser;
};
@@ -102,7 +100,6 @@ LoaderOptions::LoaderOptions(std::ostream& error) :
dump_exec("dump-exec", "Dump executable to text file"),
dump_all("dump-all", "Dump all finalizer input and output (as above)"),
dump_dir("dump-dir", "Dump directory"),
substitute("substitute", "Substitute code object with given index or index range on loading from file"),
option_parser(false, error)
{
option_parser.AddOption(&help);
@@ -111,21 +108,17 @@ LoaderOptions::LoaderOptions(std::ostream& error) :
option_parser.AddOption(&dump_exec);
option_parser.AddOption(&dump_all);
option_parser.AddOption(&dump_dir);
option_parser.AddOption(&substitute);
}
bool LoaderOptions::ParseOptions(const std::string& options)
{
bool LoaderOptions::ParseOptions(const std::string& options) {
return option_parser.ParseOptions(options.c_str());
}
void LoaderOptions::Reset()
{
void LoaderOptions::Reset() {
option_parser.Reset();
}
void LoaderOptions::PrintHelp(std::ostream& out) const
{
void LoaderOptions::PrintHelp(std::ostream& out) const {
option_parser.PrintHelp(out);
}
@@ -239,11 +232,6 @@ uint64_t AmdHsaCodeLoader::FindHostAddress(uint64_t device_address)
return 0;
}
void AmdHsaCodeLoader::PrintHelp(std::ostream& out)
{
LoaderOptions().PrintHelp(out);
}
void AmdHsaCodeLoader::EnableReadOnlyMode()
{
rw_lock_.ReaderLock();
@@ -318,21 +306,62 @@ bool SymbolImpl::GetInfo(hsa_symbol_info32_t symbol_info, void *value) {
break;
}
case HSA_CODE_SYMBOL_INFO_NAME_LENGTH: {
*((uint32_t*)value) = symbol_name.size();
std::string matter = "";
if (linkage == HSA_SYMBOL_LINKAGE_PROGRAM) {
assert(name.rfind(":") == std::string::npos);
matter = name;
} else {
assert(name.rfind(":") != std::string::npos);
matter = name.substr(name.rfind(":") + 1);
}
*((uint32_t*)value) = matter.size() + 1;
break;
}
case HSA_CODE_SYMBOL_INFO_NAME: {
memset(value, 0x0, symbol_name.size());
memcpy(value, symbol_name.c_str(), symbol_name.size());
std::string matter = "";
if (linkage == HSA_SYMBOL_LINKAGE_PROGRAM) {
assert(name.rfind(":") == std::string::npos);
matter = name;
} else {
assert(name.rfind(":") != std::string::npos);
matter = name.substr(name.rfind(":") + 1);
}
memset(value, 0x0, matter.size() + 1);
memcpy(value, matter.c_str(), matter.size());
break;
}
case HSA_CODE_SYMBOL_INFO_MODULE_NAME_LENGTH: {
*((uint32_t*)value) = module_name.size();
std::string matter = "";
if (linkage == HSA_SYMBOL_LINKAGE_PROGRAM) {
assert(name.find(":") == std::string::npos);
*((uint32_t*)value) = 0;
return true;
}
assert(name.find(":") != std::string::npos);
matter = name.substr(0, name.find(":"));
*((uint32_t*)value) = matter.size() + 1;
break;
}
case HSA_CODE_SYMBOL_INFO_MODULE_NAME: {
memset(value, 0x0, module_name.size());
memcpy(value, module_name.c_str(), module_name.size());
std::string matter = "";
if (linkage == HSA_SYMBOL_LINKAGE_PROGRAM) {
assert(name.find(":") == std::string::npos);
return true;
}
assert(name.find(":") != std::string::npos);
matter = name.substr(0, name.find(":"));
memset(value, 0x0, matter.size() + 1);
memcpy(value, matter.c_str(), matter.size());
break;
}
case HSA_CODE_SYMBOL_INFO_LINKAGE: {
@@ -669,8 +698,6 @@ hsa_status_t ExecutableImpl::DefineProgramExternalVariable(
program_symbols_.insert(
std::make_pair(std::string(name),
new VariableSymbol(true,
"", // Only program linkage symbols can be
// defined.
std::string(name),
HSA_SYMBOL_LINKAGE_PROGRAM,
true,
@@ -705,8 +732,6 @@ hsa_status_t ExecutableImpl::DefineAgentExternalVariable(
auto insert_status = agent_symbols_.insert(
std::make_pair(std::make_pair(std::string(name), agent),
new VariableSymbol(true,
"", // Only program linkage symbols can be
// defined.
std::string(name),
HSA_SYMBOL_LINKAGE_PROGRAM,
true,
@@ -972,7 +997,7 @@ hsa_status_t ExecutableImpl::GetInfo(
return HSA_STATUS_SUCCESS;
}
static uint32_t NextCodeObjectNum()
static uint32_t NextLoaderDumpNum()
{
static std::atomic_uint_fast32_t dumpN(1);
return dumpN++;
@@ -1009,62 +1034,27 @@ hsa_status_t ExecutableImpl::LoadCodeObject(
return HSA_STATUS_ERROR;
}
typedef std::tuple<uint32_t, uint32_t, std::string> Substitute;
std::vector<Substitute> substitutes;
for (const std::string& s : loaderOptions.Substitute()->values()) {
std::string::size_type vi = s.find('=');
if (vi == std::string::npos) { return HSA_STATUS_ERROR; }
std::string value = s.substr(vi + 1);
std::string range = s.substr(0, vi);
std::string::size_type mi = range.find('-');
uint32_t n1 = UINT32_MAX, n2 = UINT32_MAX;
if (mi != std::string::npos) {
std::string s1, s2;
s1 = range.substr(0, mi - 1);
s2 = range.substr(mi + 1);
std::istringstream is1(s1); is1 >> n1;
std::istringstream is2(s2); is2 >> n2;
}
else {
std::istringstream is(range); is >> n1;
n2 = n1;
}
substitutes.push_back(std::make_tuple(n1, n2, value));
}
uint32_t codeNum = NextCodeObjectNum();
code.reset(new code::AmdHsaCode());
std::string substituteFileName;
for (const Substitute& ss : substitutes) {
if (codeNum >= std::get<0>(ss) && codeNum <= std::get<1>(ss)) {
substituteFileName = std::get<2>(ss);
break;
}
if (!code->InitAsHandle(code_object)) {
return HSA_STATUS_ERROR_INVALID_CODE_OBJECT;
}
std::vector<char> buffer;
if (substituteFileName.empty()) {
if (!code->InitAsHandle(code_object)) {
return HSA_STATUS_ERROR_INVALID_CODE_OBJECT;
}
} else {
if (!ReadFileIntoBuffer(substituteFileName, buffer)) {
return HSA_STATUS_ERROR_INVALID_CODE_OBJECT;
}
if (!code->InitAsBuffer(&buffer[0], buffer.size())) {
return HSA_STATUS_ERROR_INVALID_CODE_OBJECT;
}
uint32_t dumpNum = 0;
if (loaderOptions.DumpAll()->is_set() ||
loaderOptions.DumpExec()->is_set() ||
loaderOptions.DumpCode()->is_set() ||
loaderOptions.DumpIsa()->is_set()) {
dumpNum = NextLoaderDumpNum();
}
if (loaderOptions.DumpAll()->is_set() || loaderOptions.DumpCode()->is_set()) {
if (!code->SaveToFile(amd::hsa::DumpFileName(loaderOptions.DumpDir()->value(), LOADER_DUMP_PREFIX, "hsaco", codeNum))) {
if (!code->SaveToFile(amd::hsa::DumpFileName(loaderOptions.DumpDir()->value(), LOADER_DUMP_PREFIX, "hsaco", dumpNum))) {
// Ignore error.
}
}
if (loaderOptions.DumpAll()->is_set() || loaderOptions.DumpIsa()->is_set()) {
if (!code->PrintToFile(amd::hsa::DumpFileName(loaderOptions.DumpDir()->value(), LOADER_DUMP_PREFIX, "isa", codeNum))) {
if (!code->PrintToFile(amd::hsa::DumpFileName(loaderOptions.DumpDir()->value(), LOADER_DUMP_PREFIX, "isa", dumpNum))) {
// Ignore error.
}
}
@@ -1115,7 +1105,7 @@ hsa_status_t ExecutableImpl::LoadCodeObject(
code.reset();
if (loaderOptions.DumpAll()->is_set() || loaderOptions.DumpExec()->is_set()) {
if (!PrintToFile(amd::hsa::DumpFileName(loaderOptions.DumpDir()->value(), LOADER_DUMP_PREFIX, "exec", codeNum))) {
if (!PrintToFile(amd::hsa::DumpFileName(loaderOptions.DumpDir()->value(), LOADER_DUMP_PREFIX, "exec", dumpNum))) {
// Ignore error.
}
}
@@ -1250,8 +1240,7 @@ hsa_status_t ExecutableImpl::LoadDefinitionSymbol(hsa_agent_t agent,
SymbolImpl *symbol = nullptr;
if (sym->IsVariableSymbol()) {
symbol = new VariableSymbol(true,
sym->GetModuleName(),
sym->GetSymbolName(),
sym->Name(),
sym->Linkage(),
true, // sym->IsDefinition()
sym->Allocation(),
@@ -1284,8 +1273,7 @@ hsa_status_t ExecutableImpl::LoadDefinitionSymbol(hsa_agent_t agent,
size = sym->GetSection()->size() - sym->SectionOffset();
}
KernelSymbol *kernel_symbol = new KernelSymbol(true,
sym->GetModuleName(),
sym->GetSymbolName(),
sym->Name(),
sym->Linkage(),
true, // sym->IsDefinition()
kernarg_segment_size,
@@ -1298,7 +1286,7 @@ hsa_status_t ExecutableImpl::LoadDefinitionSymbol(hsa_agent_t agent,
address);
kernel_symbol->debug_info.elf_raw = code->ElfData();
kernel_symbol->debug_info.elf_size = code->ElfSize();
kernel_symbol->debug_info.kernel_name = kernel_symbol->full_name.c_str();
kernel_symbol->debug_info.kernel_name = kernel_symbol->name.c_str();
kernel_symbol->debug_info.owning_segment = (void*)SymbolSegment(agent, sym)->Address(sym->GetSection()->addr());
symbol = kernel_symbol;