https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112563

--- Comment #9 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot 
Uni-Bielefeld.DE> ---
> --- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> So, shall we go with
> --- libsanitizer/sanitizer_common/sanitizer_redefine_builtins.h.jj     
> 2023-11-15 12:45:17.359586776 +0100
> +++ libsanitizer/sanitizer_common/sanitizer_redefine_builtins.h 2023-11-21
> 18:29:52.401817763 +0100
> @@ -15,7 +15,8 @@
>  #    define SANITIZER_REDEFINE_BUILTINS_H
>
>  // The asm hack only works with GCC and Clang.
> -#    if !defined(_WIN32)
> +// It doesn't work when using Solaris as either.
> +#    if !defined(_WIN32) && !SANITIZER_SOLARIS
>
>  asm("memcpy = __sanitizer_internal_memcpy");
>  asm("memmove = __sanitizer_internal_memmove");
> @@ -50,7 +51,7 @@ using vector = Define_SANITIZER_COMMON_N
>  }  // namespace std
>
>  #      endif  // __cpluplus
> -#    endif    // !_WIN32
> +#    endif    // !_WIN32 && !SANITIZER_SOLARIS
>
>  #  endif  // SANITIZER_REDEFINE_BUILTINS_H
>  #endif    // SANITIZER_COMMON_NO_REDEFINE_BUILTINS
>
> then (either as local patch or try to push it upstream)?

That's way to heavy IMO: it punishes the Solaris/x86 as which isn't
affected and also Solaris/SPARC with gas.

I've now come up with an alternative.  It's a bit ugly, but it gets the
work done:

diff --git a/libsanitizer/sanitizer_common/sanitizer_redefine_builtins.h
b/libsanitizer/sanitizer_common/sanitizer_redefine_builtins.h
--- a/libsanitizer/sanitizer_common/sanitizer_redefine_builtins.h
+++ b/libsanitizer/sanitizer_common/sanitizer_redefine_builtins.h
@@ -17,6 +17,17 @@
 // The asm hack only works with GCC and Clang.
 #    if !defined(_WIN32)

+// FIXME: Explain.
+#    if defined(__sparc__)
+#    define ASM_MEM_DEF(FUNC) \
+        __asm__(".global " #FUNC "\n" \
+                ".type " #FUNC ",function\n" \
+                ".weak " #FUNC "\n" \
+                #FUNC ":\n");
+ASM_MEM_DEF(__sanitizer_internal_memcpy)
+ASM_MEM_DEF(__sanitizer_internal_memmove)
+ASM_MEM_DEF(__sanitizer_internal_memset)
+#    endif
 asm("memcpy = __sanitizer_internal_memcpy");
 asm("memmove = __sanitizer_internal_memmove");
 asm("memset = __sanitizer_internal_memset");

I've run libsanitizer builds on sparc without this patch (gas only since
as fails) and with it (as and gas).  It fixes the as build failure and
leaves the same number of calls to mem* functions in libasan.so as an
unpatched tree with gas.

Reply via email to