diff options
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetMachine.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll | 16 | 
2 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index 11a4f991fed..b3ed96e815b 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -283,9 +283,11 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,      this->Options.TrapUnreachable = true;    } -  // Enable GlobalISel at or below EnableGlobalISelAt0. +  // Enable GlobalISel at or below EnableGlobalISelAt0, unless this is +  // MachO/CodeModel::Large, which GlobalISel does not support.    if (getOptLevel() <= EnableGlobalISelAtO && -      TT.getArch() != Triple::aarch64_32) { +      TT.getArch() != Triple::aarch64_32 && +      !(getCodeModel() == CodeModel::Large && TT.isOSBinFormatMachO())) {      setGlobalISel(true);      setGlobalISelAbort(GlobalISelAbortMode::Disable);    } diff --git a/llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll b/llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll new file mode 100644 index 00000000000..8ad93af8e72 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/arm64-code-model-large-darwin.ll @@ -0,0 +1,16 @@ +; Check that AArch64 is honoring code-model=large at -O0 and -O2. +; +; RUN: llc -mtriple=arm64-apple-darwin19 -code-model=large -O0 -o - %s | FileCheck %s +; RUN: llc -mtriple=arm64-apple-darwin19 -code-model=large -O2 -o - %s | FileCheck %s + +; CHECK: adrp    [[REG1:x[0-9]+]], _bar@GOTPAGE +; CHECK: ldr     [[REG1]], {{\[}}[[REG1]], _bar@GOTPAGEOFF] +; CHECK: blr     [[REG1]] + +declare void @bar() + +define void @foo() { +  call void @bar() +  ret void +} +  | 

