mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-04 17:11:44 +03:00
win32 fixes
This commit is contained in:
parent
6dcf13a300
commit
3c57670c5c
2 changed files with 27 additions and 11 deletions
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue