mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
ARM: permit tail calls to weak externals on COFF
Weak externals are resolved statically, so we can actually generate the tail call on PE/COFF targets without breaking the requirements. It is questionable whether we want to propagate the current behaviour for MachO as the requirements are part of the ARM ELF specifications, and it seems that prior to the SVN r215890, we would have tail'ed the call. For now, be conservative and only permit it on PE/COFF where the call will always be fully resolved. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225119 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e05b232c20
commit
97f8f69a7f
@ -2358,7 +2358,9 @@ bool AArch64TargetLowering::isEligibleForTailCallOptimization(
|
|||||||
// cannot rely on the linker replacing the tail call with a return.
|
// cannot rely on the linker replacing the tail call with a return.
|
||||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||||
const GlobalValue *GV = G->getGlobal();
|
const GlobalValue *GV = G->getGlobal();
|
||||||
if (GV->hasExternalWeakLinkage())
|
const Triple TT(getTargetMachine().getTargetTriple());
|
||||||
|
if (GV->hasExternalWeakLinkage() &&
|
||||||
|
(!TT.isOSWindows() || TT.isOSBinFormatELF() || TT.isOSBinFormatMachO()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2026,7 +2026,9 @@ ARMTargetLowering::IsEligibleForTailCallOptimization(SDValue Callee,
|
|||||||
// cannot rely on the linker replacing the tail call with a return.
|
// cannot rely on the linker replacing the tail call with a return.
|
||||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||||
const GlobalValue *GV = G->getGlobal();
|
const GlobalValue *GV = G->getGlobal();
|
||||||
if (GV->hasExternalWeakLinkage())
|
const Triple TT(getTargetMachine().getTargetTriple());
|
||||||
|
if (GV->hasExternalWeakLinkage() &&
|
||||||
|
(!TT.isOSWindows() || TT.isOSBinFormatELF() || TT.isOSBinFormatMachO()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
19
test/CodeGen/ARM/tail-call-weak.ll
Normal file
19
test/CodeGen/ARM/tail-call-weak.ll
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
; RUN: llc -mtriple thumbv7-windows-coff -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-COFF
|
||||||
|
; RUN: llc -mtriple thumbv7-elf -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-ELF
|
||||||
|
; RUN: llc -mtriple thumbv7-macho -filetype asm -o - %s | FileCheck %s -check-prefix CHECK-MACHO
|
||||||
|
|
||||||
|
declare i8* @f()
|
||||||
|
declare extern_weak i8* @g(i8*)
|
||||||
|
|
||||||
|
; weak symbol resolution occurs statically in PE/COFF, ensure that we permit
|
||||||
|
; tail calls on weak externals when targeting a COFF environment.
|
||||||
|
define void @test() {
|
||||||
|
%call = tail call i8* @f()
|
||||||
|
%call1 = tail call i8* @g(i8* %call)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK-COFF: b g
|
||||||
|
; CHECK-ELF: bl g
|
||||||
|
; CHECK-MACHO: blx _g
|
||||||
|
|
Loading…
Reference in New Issue
Block a user