<div dir="ltr">I would appreciate if you could use <a href="http://llvm.org/docs/Phabricator.html">http://llvm.org/docs/Phabricator.html</a><div>It's a tiny extra step for you and a big help for me.</div><div>Also, don't CC Alexey any more -- he has moved to another project. (And CC me in Phabricator as 'kcc')</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 19, 2016 at 7:17 AM, Jakub Jelinek <span dir="ltr"><<a href="mailto:jakub@redhat.com" target="_blank">jakub@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi!<br>
<br>
This is the shorter version of <a href="http://gcc.gnu.org/PR77567" rel="noreferrer" target="_blank">http://gcc.gnu.org/PR77567</a> changes, which<br>
just adds the C++17 operator new/delete/new[]/delete[] entrypoints with<br>
std::align_val_t arguments, but doesn't verify the C++17 requirement that<br>
non-std::align_val_t allocation isn't mixed with std::align_val_t<br>
deallocation and vice versa, because there are no bits left right now in the<br>
libasan structures to record this, but at least it complains if you<br>
malloc/memalign and deallocate using delete operator with std::align_val_t,<br>
etc.<br>
<br>
--- compiler-rt/lib/asan/asan_new_<wbr>delete.cc.jj  2016-05-17 10:47:05.000000000 +0200<br>
+++ compiler-rt/lib/asan/asan_new_<wbr>delete.cc     2016-09-13 17:44:13.428306595 +0200<br>
@@ -45,17 +45,30 @@<br>
<br>
 using namespace __asan;  // NOLINT<br>
<br>
+// FreeBSD prior v9.2 have wrong definition of 'size_t'.<br>
+// <a href="http://svnweb.freebsd.org/base?view=revision&revision=232261" rel="noreferrer" target="_blank">http://svnweb.freebsd.org/<wbr>base?view=revision&revision=<wbr>232261</a><br>
+#if SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32<br>
+#include <sys/param.h><br>
+#if __FreeBSD_version <= 902001  // v9.2<br>
+#define size_t unsigned<br>
+#endif  // __FreeBSD_version<br>
+#endif  // SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32<br>
+<br>
 // This code has issues on OSX.<br>
 // See <a href="https://github.com/google/sanitizers/issues/131" rel="noreferrer" target="_blank">https://github.com/google/<wbr>sanitizers/issues/131</a>.<br>
<br>
-// Fake std::nothrow_t to avoid including <new>.<br>
+// Fake std::nothrow_t and std::align_val_t to avoid including <new>.<br>
 namespace std {<br>
 struct nothrow_t {};<br>
+enum class align_val_t: size_t {};<br>
 }  // namespace std<br>
<br>
 #define OPERATOR_NEW_BODY(type) \<br>
   GET_STACK_TRACE_MALLOC;\<br>
   return asan_memalign(0, size, &stack, type);<br>
+#define OPERATOR_NEW_BODY_ALIGN(type) \<br>
+  GET_STACK_TRACE_MALLOC;\<br>
+  return asan_memalign((uptr)align, size, &stack, type);<br>
<br>
 // On OS X it's not enough to just provide our own 'operator new' and<br>
 // 'operator delete' implementations, because they're going to be in the<br>
@@ -65,15 +78,6 @@ struct nothrow_t {};<br>
 // To make sure that C++ allocation/deallocation operators are overridden on<br>
 // OS X we need to intercept them using their mangled names.<br>
 #if !SANITIZER_MAC<br>
-// FreeBSD prior v9.2 have wrong definition of 'size_t'.<br>
-// <a href="http://svnweb.freebsd.org/base?view=revision&revision=232261" rel="noreferrer" target="_blank">http://svnweb.freebsd.org/<wbr>base?view=revision&revision=<wbr>232261</a><br>
-#if SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32<br>
-#include <sys/param.h><br>
-#if __FreeBSD_version <= 902001  // v9.2<br>
-#define size_t unsigned<br>
-#endif  // __FreeBSD_version<br>
-#endif  // SANITIZER_FREEBSD && SANITIZER_WORDSIZE == 32<br>
-<br>
 CXX_OPERATOR_ATTRIBUTE<br>
 void *operator new(size_t size) { OPERATOR_NEW_BODY(FROM_NEW); }<br>
 CXX_OPERATOR_ATTRIBUTE<br>
@@ -84,6 +88,18 @@ void *operator new(size_t size, std::not<br>
 CXX_OPERATOR_ATTRIBUTE<br>
 void *operator new[](size_t size, std::nothrow_t const&)<br>
 { OPERATOR_NEW_BODY(FROM_NEW_BR)<wbr>; }<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void *operator new(size_t size, std::align_val_t align)<br>
+{ OPERATOR_NEW_BODY_ALIGN(FROM_<wbr>NEW); }<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void *operator new[](size_t size, std::align_val_t align)<br>
+{ OPERATOR_NEW_BODY_ALIGN(FROM_<wbr>NEW_BR); }<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void *operator new(size_t size, std::align_val_t align, std::nothrow_t const&)<br>
+{ OPERATOR_NEW_BODY_ALIGN(FROM_<wbr>NEW); }<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void *operator new[](size_t size, std::align_val_t align, std::nothrow_t const&)<br>
+{ OPERATOR_NEW_BODY_ALIGN(FROM_<wbr>NEW_BR); }<br>
<br>
 #else  // SANITIZER_MAC<br>
 INTERCEPTOR(void *, _Znwm, size_t size) {<br>
@@ -131,6 +147,32 @@ void operator delete[](void *ptr, size_t<br>
   GET_STACK_TRACE_FREE;<br>
   asan_sized_free(ptr, size, &stack, FROM_NEW_BR);<br>
 }<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void operator delete(void *ptr, std::align_val_t) NOEXCEPT {<br>
+  OPERATOR_DELETE_BODY(FROM_NEW)<wbr>;<br>
+}<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void operator delete[](void *ptr, std::align_val_t) NOEXCEPT {<br>
+  OPERATOR_DELETE_BODY(FROM_NEW_<wbr>BR);<br>
+}<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void operator delete(void *ptr, std::align_val_t, std::nothrow_t const&) {<br>
+  OPERATOR_DELETE_BODY(FROM_NEW)<wbr>;<br>
+}<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void operator delete[](void *ptr, std::align_val_t, std::nothrow_t const&) {<br>
+  OPERATOR_DELETE_BODY(FROM_NEW_<wbr>BR);<br>
+}<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void operator delete(void *ptr, size_t size, std::align_val_t) NOEXCEPT {<br>
+  GET_STACK_TRACE_FREE;<br>
+  asan_sized_free(ptr, size, &stack, FROM_NEW);<br>
+}<br>
+CXX_OPERATOR_ATTRIBUTE<br>
+void operator delete[](void *ptr, size_t size, std::align_val_t) NOEXCEPT {<br>
+  GET_STACK_TRACE_FREE;<br>
+  asan_sized_free(ptr, size, &stack, FROM_NEW_BR);<br>
+}<br>
<br>
 #else  // SANITIZER_MAC<br>
 INTERCEPTOR(void, _ZdlPv, void *ptr) {<br>
<span class="HOEnZb"><font color="#888888"><br>
        Jakub<br>
</font></span></blockquote></div><br></div>