diff options
| author | Martin Storsjö <martin@martin.st> | 2019-12-19 14:00:44 +0200 |
|---|---|---|
| committer | Martin Storsjö <martin@martin.st> | 2019-12-23 12:13:49 +0200 |
| commit | 5a751e747dbf2c267e944aa961e21de7a815e7eb (patch) | |
| tree | 70b2949c61174ec9ca34e943a5cbd319dafd3346 /llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | |
| parent | b774aa1011a031b225624277178382bb2db7e26a (diff) | |
| download | bcm5719-llvm-5a751e747dbf2c267e944aa961e21de7a815e7eb.tar.gz bcm5719-llvm-5a751e747dbf2c267e944aa961e21de7a815e7eb.zip | |
[AArch64] [Windows] Use COFF stubs for calls to extern_weak functions
As the extern_weak target might be missing, resolving to the absolute
address zero, we can't use the normal direct PC-relative branch
instructions (as that would result in relocations out of range).
Improve the classifyGlobalFunctionReference method to set
MO_DLLIMPORT/MO_COFFSTUB, and simplify the existing code in
AArch64TargetLowering::LowerCall to use the return value from
classifyGlobalFunctionReference for these cases.
Add code in both AArch64FastISel and GlobalISel/IRTranslator to
bail out for function calls to extern weak functions on windows,
to let SelectionDAG handle them.
This matches what was done for X86 in 6bf108d77a3c.
Differential Revision: https://reviews.llvm.org/D71721
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 223ed954854..d71382868e4 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1593,7 +1593,9 @@ bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) { const Function *F = CI.getCalledFunction(); // FIXME: support Windows dllimport function calls. - if (F && F->hasDLLImportStorageClass()) + if (F && (F->hasDLLImportStorageClass() || + (MF->getTarget().getTargetTriple().isOSWindows() && + F->hasExternalWeakLinkage()))) return false; // FIXME: support control flow guard targets. |

