summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGObjC.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-09-13 07:33:34 +0000
committerJohn McCall <rjmccall@apple.com>2011-09-13 07:33:34 +0000
commit0bef0badf663fde34744872cd94f98d0afc9af0d (patch)
tree0ea9a364375e44a13be411e2e8ae6447240fd93b /clang/lib/CodeGen/CGObjC.cpp
parent69cdcec11ffe6b5594ee79b6e52679232fd96a60 (diff)
downloadbcm5719-llvm-0bef0badf663fde34744872cd94f98d0afc9af0d.tar.gz
bcm5719-llvm-0bef0badf663fde34744872cd94f98d0afc9af0d.zip
Don't use native atomics on ivars whose size is not a power of two,
even on architectures that support unaligned access (which is the only way this is otherwise legal, given that ivars apparently do not honor alignment attributes). llvm-svn: 139590
Diffstat (limited to 'clang/lib/CodeGen/CGObjC.cpp')
-rw-r--r--clang/lib/CodeGen/CGObjC.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index ca04a7b1785..ddf6e1f98a7 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -527,6 +527,14 @@ PropertyImplStrategy::PropertyImplStrategy(CodeGenModule &CGM,
// Otherwise, this is target-dependent and based on the size and
// alignment of the ivar.
+
+ // If the size of the ivar is not a power of two, give up. We don't
+ // want to get into the business of doing compare-and-swaps.
+ if (!IvarSize.isPowerOfTwo()) {
+ Kind = CopyStruct;
+ return;
+ }
+
llvm::Triple::ArchType arch =
CGM.getContext().getTargetInfo().getTriple().getArch();
OpenPOWER on IntegriCloud