summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2019-05-10 02:16:37 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2019-05-10 02:16:37 +0000
commitc39a243da651991c5037dee7bae2d6e7d8c37196 (patch)
tree07acc5517b6e2de2fd4e282541b3f41d90fcfa36 /clang/lib/Basic
parentbdb21337e6e1732c9895966449c33c408336d295 (diff)
downloadbcm5719-llvm-c39a243da651991c5037dee7bae2d6e7d8c37196.tar.gz
bcm5719-llvm-c39a243da651991c5037dee7bae2d6e7d8c37196.zip
Assume `__cxa_allocate_exception` returns an under-aligned memory on
Darwin if the version of libc++abi isn't new enough to include the fix in r319123 This patch resurrects r264998, which was committed to work around a bug in libc++abi that was causing _cxa_allocate_exception to return a memory that wasn't double-word aligned. http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160328/154332.html In addition, this patch makes clang issue a warning if the type of the thrown object requires an alignment that is larger than the minimum guaranteed by the target C++ runtime. rdar://problem/49864414 Differential Revision: https://reviews.llvm.org/D61667 llvm-svn: 360404
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r--clang/lib/Basic/Targets/OSTargets.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h
index a0e8061dc18..86ec88fdc85 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -133,6 +133,37 @@ public:
/// attribute on declarations that can be dynamically replaced.
bool hasProtectedVisibility() const override { return false; }
+ unsigned getExnObjectAlignment() const override {
+ // Older versions of libc++abi guarantee an alignment of only 8-bytes for
+ // exception objects because of a bug in __cxa_exception that was
+ // eventually fixed in r319123.
+ llvm::VersionTuple MinVersion;
+ const llvm::Triple &T = this->getTriple();
+
+ // Compute the earliest OS versions that have the fix to libc++abi.
+ switch (T.getOS()) {
+ case llvm::Triple::Darwin:
+ case llvm::Triple::MacOSX: // Earliest supporting version is 10.14.
+ MinVersion = llvm::VersionTuple(10U, 14U);
+ break;
+ case llvm::Triple::IOS:
+ case llvm::Triple::TvOS: // Earliest supporting version is 12.0.0.
+ MinVersion = llvm::VersionTuple(12U);
+ break;
+ case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0.
+ MinVersion = llvm::VersionTuple(5U);
+ break;
+ default:
+ llvm_unreachable("Unexpected OS");
+ }
+
+ unsigned Major, Minor, Micro;
+ T.getOSVersion(Major, Minor, Micro);
+ if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion)
+ return 64;
+ return OSTargetInfo<Target>::getExnObjectAlignment();
+ }
+
TargetInfo::IntType getLeastIntTypeByWidth(unsigned BitWidth,
bool IsSigned) const final {
// Darwin uses `long long` for `int_least64_t` and `int_fast64_t`.
OpenPOWER on IntegriCloud