summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2016-08-01 21:31:24 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2016-08-01 21:31:24 +0000
commit4a7130a8fb77e45f3e597a132a539ac323ac6a34 (patch)
tree9cc95945cbad8a80fd4cadd24186c4be442892b5
parent9f4dc98e96c69b3f298b0492a7ebb608c4d75ebd (diff)
downloadbcm5719-llvm-4a7130a8fb77e45f3e597a132a539ac323ac6a34.tar.gz
bcm5719-llvm-4a7130a8fb77e45f3e597a132a539ac323ac6a34.zip
CodeGen: simplify the CC handling for TLS wrappers
Use the calling convention of the wrapper directly to set the calling convention to ensure that the calling convention matches. Incorrectly setting the calling convention results in the code path being entirely nullified as InstCombine + SimplifyCFG will prune the mismatched CC calls. llvm-svn: 277390
-rw-r--r--clang/lib/CodeGen/ItaniumCXXABI.cpp3
-rw-r--r--clang/test/CodeGen/windows-on-arm-itanium-thread-local.c11
2 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index 36eb40ef09c..2492c82f862 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -2346,8 +2346,7 @@ LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF,
llvm::Function *Wrapper = getOrCreateThreadLocalWrapper(VD, Val);
llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper);
- if (isThreadWrapperReplaceable(VD, CGF.CGM))
- CallVal->setCallingConv(llvm::CallingConv::CXX_FAST_TLS);
+ CallVal->setCallingConv(Wrapper->getCallingConv());
LValue LV;
if (VD->getType()->isReferenceType())
diff --git a/clang/test/CodeGen/windows-on-arm-itanium-thread-local.c b/clang/test/CodeGen/windows-on-arm-itanium-thread-local.c
new file mode 100644
index 00000000000..7f12c367d91
--- /dev/null
+++ b/clang/test/CodeGen/windows-on-arm-itanium-thread-local.c
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -triple thumbv7--windows-itanium -fdeclspec -fms-compatibility -fms-compatibility-version=19.0 -S -emit-llvm -o - %s | FileCheck %s
+
+__declspec(thread) static void *c;
+void f(void *p) {
+ c = p;
+}
+
+// CHECK-LABEL: @f(i8* %p)
+// CHECK-NOT: call i8** @_ZTWL1c()
+// CHECK: call arm_aapcs_vfpcc i8** @_ZTWL1c()
+
OpenPOWER on IntegriCloud