From 46e36f0953aabb5e5cd00ed8d296d60f9f71b424 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Mon, 17 Apr 2017 18:18:47 +0000 Subject: [PATCH] AArch64: put nonlazybind special handling behind a flag for now. It's basically a terrible idea anyway but objc_msgSend gets emitted like that. We can decide on a better way to deal with it in the unlikely event that anyone actually uses it. llvm-svn: 300474 --- llvm/lib/Target/AArch64/AArch64Subtarget.cpp | 7 ++++++- llvm/test/CodeGen/AArch64/nonlazybind.ll | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.cpp b/llvm/lib/Target/AArch64/AArch64Subtarget.cpp index e1815b7..042755b 100644 --- a/llvm/lib/Target/AArch64/AArch64Subtarget.cpp +++ b/llvm/lib/Target/AArch64/AArch64Subtarget.cpp @@ -35,6 +35,11 @@ static cl::opt UseAddressTopByteIgnored("aarch64-use-tbi", cl::desc("Assume that top byte of " "an address is ignored"), cl::init(false), cl::Hidden); +static cl::opt + UseNonLazyBind("aarch64-enable-nonlazybind", + cl::desc("Call nonlazybind functions via direct GOT load"), + cl::init(false), cl::Hidden); + AArch64Subtarget & AArch64Subtarget::initializeSubtargetDependencies(StringRef FS, StringRef CPUString) { @@ -165,7 +170,7 @@ unsigned char AArch64Subtarget::classifyGlobalFunctionReference( // NonLazyBind goes via GOT unless we know it's available locally. auto *F = dyn_cast(GV); - if (F && F->hasFnAttribute(Attribute::NonLazyBind) && + if (UseNonLazyBind && F && F->hasFnAttribute(Attribute::NonLazyBind) && !TM.shouldAssumeDSOLocal(*GV->getParent(), GV)) return AArch64II::MO_GOT; diff --git a/llvm/test/CodeGen/AArch64/nonlazybind.ll b/llvm/test/CodeGen/AArch64/nonlazybind.ll index 9f0bc46..4355d45 100644 --- a/llvm/test/CodeGen/AArch64/nonlazybind.ll +++ b/llvm/test/CodeGen/AArch64/nonlazybind.ll @@ -1,4 +1,5 @@ -; RUN: llc -mtriple=aarch64-apple-ios %s -o - | FileCheck %s +; RUN: llc -mtriple=aarch64-apple-ios %s -o - -aarch64-enable-nonlazybind | FileCheck %s +; RUN: llc -mtriple=aarch64-apple-ios %s -o - | FileCheck %s --check-prefix=CHECK-NORMAL define void @local() nonlazybind { ret void @@ -15,6 +16,10 @@ define void @test_laziness() { ; CHECK: ldr [[FUNC:x[0-9]+]], [x[[TMP]], _nonlocal@GOTPAGEOFF] ; CHECK: blr [[FUNC]] +; CHECK-NORMAL-LABEL: test_laziness: +; CHECK-NORMAL: bl _local +; CHEKC-NORMAL: bl _nonlocal + call void @local() call void @nonlocal() ret void @@ -27,6 +32,9 @@ define void @test_laziness_tail() { ; CHECK: ldr [[FUNC:x[0-9]+]], [x[[TMP]], _nonlocal@GOTPAGEOFF] ; CHECK: br [[FUNC]] +; CHECK-NORMAL-LABEL: test_laziness_tail: +; CHECK-NORMAL: b _nonlocal + tail call void @nonlocal() ret void } -- 2.7.4