]> granicus.if.org Git - clang/commitdiff
CodeGen: simplify the CC handling for TLS wrappers
authorSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 1 Aug 2016 21:31:24 +0000 (21:31 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 1 Aug 2016 21:31:24 +0000 (21:31 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@277390 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/ItaniumCXXABI.cpp
test/CodeGen/windows-on-arm-itanium-thread-local.c [new file with mode: 0644]

index 36eb40ef09c9ceb81444cf8c2a0a49b72d5bd6cb..2492c82f8620619c1187f757ab3cf5a03fabb33e 100644 (file)
@@ -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/test/CodeGen/windows-on-arm-itanium-thread-local.c b/test/CodeGen/windows-on-arm-itanium-thread-local.c
new file mode 100644 (file)
index 0000000..7f12c36
--- /dev/null
@@ -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()
+