summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2011-04-27 04:37:08 +0000
committerAnders Carlsson <andersca@mac.com>2011-04-27 04:37:08 +0000
commitc5d3ba1aad51caed70e0f2e6e52fe6d4436bcae4 (patch)
treefb624c1707f6608d02c3a29dbd9df894ba43fe85 /clang/lib/CodeGen
parentae79fdf170eab5b9fa3a5bb81bf9ad8c6408d592 (diff)
downloadbcm5719-llvm-c5d3ba1aad51caed70e0f2e6e52fe6d4436bcae4.tar.gz
bcm5719-llvm-c5d3ba1aad51caed70e0f2e6e52fe6d4436bcae4.zip
When compiling with -fno-threadsafe-statics, guard variables for globals with internal linkage don't have to be i64, i8 works just fine!
llvm-svn: 130286
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/ItaniumCXXABI.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index a53ef1a2659..f2786462232 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -1066,10 +1066,18 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
// global initialization is always single-threaded.
bool ThreadsafeStatics = (getContext().getLangOptions().ThreadsafeStatics &&
D.isLocalVarDecl());
-
- // Guard variables are 64 bits in the generic ABI and 32 bits on ARM.
- const llvm::IntegerType *GuardTy
- = (IsARM ? Builder.getInt32Ty() : Builder.getInt64Ty());
+
+ const llvm::IntegerType *GuardTy;
+
+ // If we have a global variable with internal linkage and thread-safe statics
+ // are disabled, we can just let the guard variable be of type i8.
+ bool UseInt8GuardVariable = !ThreadsafeStatics && GV->hasInternalLinkage();
+ if (UseInt8GuardVariable)
+ GuardTy = Builder.getInt8Ty();
+ else {
+ // Guard variables are 64 bits in the generic ABI and 32 bits on ARM.
+ GuardTy = (IsARM ? Builder.getInt32Ty() : Builder.getInt64Ty());
+ }
const llvm::PointerType *GuardPtrTy = GuardTy->getPointerTo();
// Create the guard variable.
@@ -1100,7 +1108,7 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
// if (__cxa_guard_acquire(&obj_guard))
// ...
// }
- if (IsARM) {
+ if (IsARM && !UseInt8GuardVariable) {
llvm::Value *V = Builder.CreateLoad(GuardVariable);
V = Builder.CreateAnd(V, Builder.getInt32(1));
IsInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
OpenPOWER on IntegriCloud