public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Rainer Orth <ro@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r14-9030] libsanitizer: Intercept __makecontext_v2 on Solaris/SPARC [PR113785]
Date: Fri, 16 Feb 2024 13:06:56 +0000 (GMT)	[thread overview]
Message-ID: <20240216130656.6674438582BC@sourceware.org> (raw)

https://gcc.gnu.org/g:7c6071a66f32f43cea7aa4aa32d89b338e768307

commit r14-9030-g7c6071a66f32f43cea7aa4aa32d89b338e768307
Author: Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
Date:   Fri Feb 16 14:06:24 2024 +0100

    libsanitizer: Intercept __makecontext_v2 on Solaris/SPARC [PR113785]
    
    c-c++-common/asan/swapcontext-test-1.c FAILs on Solaris/SPARC:
    
    FAIL: c-c++-common/asan/swapcontext-test-1.c   -O0  execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c   -O1  execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c   -O2  execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c   -O2 -flto  execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c -O2 -flto -flto-partition=none
    execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c -O3 -fomit-frame-pointer
    -funroll-loops -fpeel-loops -ftracer -finline-functions execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c   -O3 -g  execution test
    FAIL: c-c++-common/asan/swapcontext-test-1.c   -Os  execution test
    
    As detailed in PR sanitizer/113785, this happens because an ABI change
    in Solaris 10/SPARC caused the external symbol for makecontext to be
    changed to __makecontext_v2, which isn't intercepted.
    
    The following patch, submitted upstream at
    https://github.com/llvm/llvm-project/pull/81588, fixes that.
    
    Tested on sparc-sun-solaris2.11 and i386-pc-solaris2.11.
    
    2024-02-16  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
    
            libsanitizer:
            PR sanitizer/113785
            * asan/asan_interceptors.cpp: Cherry-pick llvm-project revision
            8c2033719a843a1880427a5e8caa5563248bce78.

Diff:
---
 libsanitizer/asan/asan_interceptors.cpp | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/libsanitizer/asan/asan_interceptors.cpp b/libsanitizer/asan/asan_interceptors.cpp
index 234b18bd83aa..635546b525ce 100644
--- a/libsanitizer/asan/asan_interceptors.cpp
+++ b/libsanitizer/asan/asan_interceptors.cpp
@@ -347,8 +347,16 @@ static void ClearShadowMemoryForContextStack(uptr stack, uptr ssize) {
   PoisonShadow(bottom, ssize, 0);
 }
 
+// Since Solaris 10/SPARC, ucp->uc_stack.ss_sp refers to the stack base address
+// as on other targets.  For binary compatibility, the new version uses a
+// different external name, so we intercept that.
+#    if SANITIZER_SOLARIS && defined(__sparc__)
+INTERCEPTOR(void, __makecontext_v2, struct ucontext_t *ucp, void (*func)(),
+            int argc, ...) {
+#    else
 INTERCEPTOR(void, makecontext, struct ucontext_t *ucp, void (*func)(), int argc,
             ...) {
+#    endif
   va_list ap;
   uptr args[64];
   // We don't know a better way to forward ... into REAL function. We can
@@ -368,7 +376,11 @@ INTERCEPTOR(void, makecontext, struct ucontext_t *ucp, void (*func)(), int argc,
       ENUMERATE_ARRAY_16(0), ENUMERATE_ARRAY_16(16), ENUMERATE_ARRAY_16(32), \
           ENUMERATE_ARRAY_16(48)
 
+#    if SANITIZER_SOLARIS && defined(__sparc__)
+  REAL(__makecontext_v2)
+#    else
   REAL(makecontext)
+#    endif
   ((struct ucontext_t *)ucp, func, argc, ENUMERATE_ARRAY_64());
 
 #    undef ENUMERATE_ARRAY_4
@@ -783,7 +795,12 @@ void InitializeAsanInterceptors() {
 
 #  if ASAN_INTERCEPT_SWAPCONTEXT
   ASAN_INTERCEPT_FUNC(swapcontext);
+  // See the makecontext interceptor above for an explanation.
+#    if SANITIZER_SOLARIS && defined(__sparc__)
+  ASAN_INTERCEPT_FUNC(__makecontext_v2);
+#    else
   ASAN_INTERCEPT_FUNC(makecontext);
+#    endif
 #  endif
 #  if ASAN_INTERCEPT__LONGJMP
   ASAN_INTERCEPT_FUNC(_longjmp);

                 reply	other threads:[~2024-02-16 13:06 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240216130656.6674438582BC@sourceware.org \
    --to=ro@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).