LGTM, then. Please commit. — Marshall
On Wed, Jun 4, 2014 at 9:42 AM, Richard Smith <[email protected]> wrote: > On 4 Jun 2014 08:02, "Marshall Clow" <[email protected]> wrote: > > > > > > On Jun 3, 2014, at 3:14 PM, Richard Smith <[email protected]> wrote: > > > > > Hi! > > > > > > This patch causes libc++ to use Clang's new __builtin_operator_new and > __builtin_operator_delete builtins when possible. These builtins allow > optimizations that the standard builtins do not: in particular, if we can > remove all uses of an allocation, this permits removing the allocation > itself too. > > > > > > In particular, this allows code using std::vector and its kin to be > optimized away to nothing. Previously it would get optimized to the point > where only the allocation and deallocation remained. > > > > > > This change has been applied to most calls to ::operator new and > ::operator delete in libc++; I believe such optimizations are permitted by > the specification of all affected library components. > > > > > > The exceptions are: > > > * get_temporary_buffer wants to call nothrow new, and we don't > support that with the builtins (that would require teaching Clang about > std::nothrow_t) > > > * __refstring is not affected; this doesn't seem particularly > worthwhile since the only purpose for it is ABI interoperability with GCC > > > > > > One other caveat: the patch adds an include of <new> to <valarray>. > <new> is extremely light, so I doubt this is a problem, but I thought it > was worth calling out. > > > > The code here looks quite straightforward. > > I don’t see any problems - but I do have questions. > > > > How does __builtin_operator_new/__builtin_operator_delete work if a user > provides their own > > global operator new/delete ? > > > > For example, given code like this: > > > > $ cat junk1.cpp > > > > int main () { > > // something that eventually calls __builtin_operator_new > > } > > > > $ cat junk2.cpp > > #include <new> > > > > char buffer[10240]; > > size_t offset = 0; > > > > void * operator new(size_t sz) throw(std::bad_alloc) { > > void *p = &buffer[offset]; > > offset += sz; > > return p; > > } > > void operator delete(void *) {} > > > > does the user’s operator new get called? > > Yes, if the allocation isn't optimised out. (The builtins behave just like > the allocation / deallocation in a new-expression or delete-expression.) >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
