diff options
author | Daniel Dunbar <daniel@zuster.org> | 2012-03-05 21:02:05 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2012-03-05 21:02:05 +0000 |
commit | 7034fb6c7be710883a970f82cb2da97bf1cf5cda (patch) | |
tree | 2e94bfe57abd9a1e9add08766ea59667d6583eff | |
parent | d38f79543136ba68cd14b1dab0856474df1fbfd5 (diff) |
ASTContext: Don't use nothrow specifications on the new operators for allocating
from the ASTContext.
- Doing so requires the compiler to generate null checks against the returned
result, but the BumpPtrAllocator never returns null pointers.
- The optimizer can usually eliminate such checks, but not always, so this
gives us tighter codegen in some places.
- It would be really nice if we could just use __builtin_unreachable or
something to tell the optimizer that the allocator never returns null, but
LLVM isn't currently that smart.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152060 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/ASTContext.h | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 723dd1748d..4a5d875373 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -1907,13 +1907,16 @@ static inline Selector GetUnarySelector(StringRef name, ASTContext& Ctx) { } // end namespace clang // operator new and delete aren't allowed inside namespaces. -// The throw specifications are mandated by the standard. + /// @brief Placement new for using the ASTContext's allocator. /// /// This placement form of operator new uses the ASTContext's allocator for -/// obtaining memory. It is a non-throwing new, which means that it returns -/// null on error. (If that is what the allocator does. The current does, so if -/// this ever changes, this operator will have to be changed, too.) +/// obtaining memory. +/// +/// We intentionally avoid using a nothrow specification here so that the calls +/// to this operator will not perform a null check on the result -- the +/// underlying allocator never returns null pointers. +/// /// Usage looks like this (assuming there's an ASTContext 'Context' in scope): /// @code /// // Default alignment (8) @@ -1931,7 +1934,7 @@ static inline Selector GetUnarySelector(StringRef name, ASTContext& Ctx) { /// allocator supports it). /// @return The allocated memory. Could be NULL. inline void *operator new(size_t Bytes, const clang::ASTContext &C, - size_t Alignment) throw () { + size_t Alignment) { return C.Allocate(Bytes, Alignment); } /// @brief Placement delete companion to the new above. @@ -1940,14 +1943,17 @@ inline void *operator new(size_t Bytes, const clang::ASTContext &C, /// invoking it directly; see the new operator for more details. This operator /// is called implicitly by the compiler if a placement new expression using /// the ASTContext throws in the object constructor. -inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) - throw () { +inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) { C.Deallocate(Ptr); } /// This placement form of operator new[] uses the ASTContext's allocator for -/// obtaining memory. It is a non-throwing new[], which means that it returns -/// null on error. +/// obtaining memory. +/// +/// We intentionally avoid using a nothrow specification here so that the calls +/// to this operator will not perform a null check on the result -- the +/// underlying allocator never returns null pointers. +/// /// Usage looks like this (assuming there's an ASTContext 'Context' in scope): /// @code /// // Default alignment (8) @@ -1965,7 +1971,7 @@ inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t) /// allocator supports it). /// @return The allocated memory. Could be NULL. inline void *operator new[](size_t Bytes, const clang::ASTContext& C, - size_t Alignment = 8) throw () { + size_t Alignment = 8) { return C.Allocate(Bytes, Alignment); } @@ -1975,8 +1981,7 @@ inline void *operator new[](size_t Bytes, const clang::ASTContext& C, /// invoking it directly; see the new[] operator for more details. This operator /// is called implicitly by the compiler if a placement new[] expression using /// the ASTContext throws in the object constructor. -inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) - throw () { +inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t) { C.Deallocate(Ptr); } |