win32 fixes

This commit is contained in:
Ivan 2017-10-15 18:45:58 +03:00
parent 6dcf13a300
commit 3c57670c5c
2 changed files with 27 additions and 11 deletions

View file

@ -96,6 +96,12 @@ void getPredefinedSymbols(IRState *irs,
"_tls_index", "_tls_index",
llvm::Type::getInt32Ty(irs->context())), llvm::Type::getInt32Ty(irs->context())),
GlobalValVisibility::Declaration)); GlobalValVisibility::Declaration));
if (triple->isArch32Bit()) {
symList.insert(std::make_pair(getPredefinedSymbol(irs->module,
"_tls_array",
llvm::Type::getInt32Ty(irs->context())),
GlobalValVisibility::Declaration));
}
} }
} }

View file

@ -92,20 +92,29 @@ struct llvm_init_obj {
}; };
std::string decorate(const std::string& name) { std::string decorate(const std::string& name) {
#ifdef __APPLE__ #if defined(__APPLE__)
return "_" + name;
#elif defined(_WIN32) && defined(_M_IX86)
assert(!name.empty());
if (0x1 == name[0]) {
return name.substr(1);
}
return "_" + name; return "_" + name;
#else #else
return name; return name;
#endif #endif
} }
std::string undecorate(const std::string& name) { auto getSymbolInPorcess(const std::string& name)
#ifdef __APPLE__ ->decltype (llvm::RTDyldMemoryManager::getSymbolAddressInProcess(name)) {
assert(!name.empty()); assert(!name.empty());
assert("_" == name[0]); #if defined(_WIN32)
return name.substr(1); if ('_' == name[0]) {
return llvm::RTDyldMemoryManager::getSymbolAddressInProcess(name.substr(1));
}
return llvm::RTDyldMemoryManager::getSymbolAddressInProcess(name);
#else #else
return name; return llvm::RTDyldMemoryManager::getSymbolAddressInProcess(name);
#endif #endif
} }
@ -165,12 +174,12 @@ public:
return llvm::JITSymbol(nullptr); return llvm::JITSymbol(nullptr);
}, },
[&](const std::string& name) { [&](const std::string& name) {
auto it = symMap.find(undecorate(name)); auto it = symMap.find(name);
if (symMap.end() != it) { if (symMap.end() != it) {
return llvm::JITSymbol(reinterpret_cast<llvm::JITTargetAddress>(it->second), return llvm::JITSymbol(reinterpret_cast<llvm::JITTargetAddress>(it->second),
llvm::JITSymbolFlags::Exported); llvm::JITSymbolFlags::Exported);
} }
if (auto SymAddr = llvm::RTDyldMemoryManager::getSymbolAddressInProcess(name)) { if (auto SymAddr = getSymbolInPorcess(name)) {
return llvm::JITSymbol(SymAddr, llvm::JITSymbolFlags::Exported); return llvm::JITSymbol(SymAddr, llvm::JITSymbolFlags::Exported);
} }
return llvm::JITSymbol(nullptr); return llvm::JITSymbol(nullptr);
@ -318,7 +327,7 @@ void rtCompileProcessImplSoInternal(const RtComileModuleList* modlist_head, cons
} }
for (auto&& sym: toArray(current->symList, current->symListSize)) { for (auto&& sym: toArray(current->symList, current->symListSize)) {
symMap.insert(std::make_pair(sym.name, sym.sym)); symMap.insert(std::make_pair(decorate(sym.name), sym.sym));
} }
} }
current = current->next; current = current->next;
@ -330,10 +339,11 @@ void rtCompileProcessImplSoInternal(const RtComileModuleList* modlist_head, cons
JitFinaliser jitFinalizer(myJit); JitFinaliser jitFinalizer(myJit);
interruptPoint(context, "Resolve functions"); interruptPoint(context, "Resolve functions");
for (auto&& fun: functions) { for (auto&& fun: functions) {
auto symbol = myJit.findSymbol(decorate(fun.first)); auto decorated = decorate(fun.first);
auto symbol = myJit.findSymbol(decorated);
auto addr = resolveSymbol(symbol); auto addr = resolveSymbol(symbol);
if (nullptr == addr) { if (nullptr == addr) {
std::string desc = std::string("Symbol not found in jitted code: ") + fun.first; std::string desc = std::string("Symbol not found in jitted code: \"") + fun.first + "\" (\"" + decorated + "\")";
fatal(context, desc); fatal(context, desc);
} }
else { else {