diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -121,6 +121,11 @@ static cl::opt UseAbsoluteJumpTables("ppc-use-absolute-jumptables", cl::desc("use absolute jump tables on ppc"), cl::Hidden); +static cl::opt EnablePPCPCRelTLS( + "enable-ppc-pcrel-tls", + cl::desc("enable the use of PC relative memops in TLS instructions on PPC"), + cl::Hidden); + STATISTIC(NumTailCalls, "Number of tail calls"); STATISTIC(NumSiblingCalls, "Number of sibling calls"); STATISTIC(ShufflesHandledWithVPERM, "Number of shuffles lowered to a VPERM"); @@ -2920,6 +2925,9 @@ // which is the most useful form. Eventually support for small and // large models could be added if users need it, at the cost of // additional complexity. + if (Subtarget.isUsingPCRelativeCalls() && !EnablePPCPCRelTLS) + report_fatal_error("Thread local storage is not supported with pc-relative" + " addressing - please compile with -mno-pcrel"); GlobalAddressSDNode *GA = cast(Op); if (DAG.getTarget().useEmulatedTLS()) return LowerToTLSEmulatedModel(GA, DAG); diff --git a/llvm/test/CodeGen/PowerPC/pcrel-tls.ll b/llvm/test/CodeGen/PowerPC/pcrel-tls.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/pcrel-tls.ll @@ -0,0 +1,16 @@ +; RUN: not --crash llc -mcpu=pwr10 -mtriple=powerpc64le-unknown-linux-gnu \ +; RUN: -verify-machineinstrs -mattr=+pcrelative-memops -o - < %s 2>&1 | \ +; RUN: FileCheck %s --check-prefix=CHECK-PCREL +; RUN: llc -mcpu=pwr10 -mtriple=powerpc64le-unknown-linux-gnu \ +; RUN: -verify-machineinstrs -mattr=-pcrelative-memops -o - < %s 2>&1 | \ +; RUN: FileCheck %s --check-prefix=CHECK-NOPCREL + +; CHECK-PCREL: Thread local storage is not supported with pc-relative addressing +; CHECK-NOPCREL: blr + +@x = external thread_local global i32, align 4 + +define i32* @testTLS() { +entry: + ret i32* @x +}