<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/72970>72970</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Interceptors no longer build on SPARC/Solaris with Solaris as
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jakubjelinek
</td>
</tr>
</table>
<pre>
As mentioned in https://gcc.gnu.org/PR112563, the new DECLARE_WRAPPER macro added in 37445e96d867f4266993085e821fbd4c4d8fa401 and ammended in
85d3873a45f9977f868723a221ebcb35100cac22 doesn't work on SPARC/Solaris with Solaris as.
While clang and GNU as when used from GCC seems to be forgiving on most architectures and allow both
%function and @function (with the latter not being allowed on ARM/AArch64 I believe because @ is assembler comment start there), Solaris as doesn't allow the %function form.
builtins/functions.h has a proper
#if defined(__arm__) || defined(__aarch64__)
#define SYMBOL_IS_FUNC(name) .type name,%function
#else
#define SYMBOL_IS_FUNC(name) .type name,@function
#endif
but obviously that is for *.S files, not meant for inline assembly.
So, I'd like to propose:
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_asm.h b/compiler-rt/lib/sanitizer_common/sanitizer_asm.h
index 3c9bbdc9678b..bbb18cfbdf15 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_asm.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_asm.h
@@ -62,7 +62,11 @@
#if !defined(__APPLE__)
# define ASM_HIDDEN(symbol) .hidden symbol
-# define ASM_TYPE_FUNCTION(symbol) .type symbol, %function
+# if defined(__arm__) || defined(__aarch64__)
+# define ASM_TYPE_FUNCTION(symbol) .type symbol, %function
+# else
+# define ASM_TYPE_FUNCTION(symbol) .type symbol, @function
+# endif
# define ASM_SIZE(symbol) .size symbol, .-symbol
# define ASM_SYMBOL(symbol) symbol
# define ASM_SYMBOL_INTERCEPTOR(symbol) symbol
diff --git a/compiler-rt/lib/interception/interception.h b/compiler-rt/lib/interception/interception.h
index 069f73d276f3..9d8b60b2eef5 100644
--- a/compiler-rt/lib/interception/interception.h
+++ b/compiler-rt/lib/interception/interception.h
@@ -185,6 +185,11 @@ const interpose_substitution substitution_##func_name[] \
# else
# define __ASM_WEAK_WRAPPER(func) ".weak " #func "\n"
# endif // SANITIZER_FREEBSD || SANITIZER_NETBSD
+# if defined(__arm__) || defined(__aarch64__)
+# define ASM_TYPE_FUNCTION_STR "%function"
+# else
+# define ASM_TYPE_FUNCTION_STR "@function"
+# endif
// Keep trampoline implementation in sync with sanitizer_common/sanitizer_asm.h
# define DECLARE_WRAPPER(ret_type, func, ...) \
extern "C" ret_type func(__VA_ARGS__); \
@@ -196,7 +201,8 @@ const interpose_substitution substitution_##func_name[] \
__ASM_WEAK_WRAPPER(func) \
".set " #func ", " SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \
".globl " SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \
- ".type " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", %function\n" \
+ ".type " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \
+ ASM_TYPE_FUNCTION_STR "\n" \
SANITIZER_STRINGIFY(TRAMPOLINE(func)) ":\n" \
SANITIZER_STRINGIFY(CFI_STARTPROC) "\n" \
SANITIZER_STRINGIFY(ASM_TAIL_CALL) " __interceptor_" \
(because unfortunately SANITIZER_STRINGIFY(ASM_TYPE_FUNCTION(TRAMPOLINE(func))) doesn't work).
@melver
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0WF1z4rgS_TXipQuXLX8_8GAcmEttJkMBe6dmX1yy3QZNbIuyRLLZX39LMgTDTD7uZJZKxRaSTrdO95FaMCn5tkWcEH9K_JsRO6id6Cbf2f0h_441b_F-lIvyaZJIaLBVXLRYAm9hp9ReEjchdE7ofFsU1rY9WKLbEjpfrhyH-oFLaApqh9DiI9zM0ttkNcu-rpLlcraChhWdAFaWPZwbep6PcVBGQVh5NAji2LUjHyPqVHnpFV4ZVcyzHWBtCaxpsO0nEvuG2Enkl24UuszzqzgOwyoKopC6jFIH8yJ3fce2C1ZQCqVA2RIaKngU3T2IFtbLZJUSOl-LmnVcwiNXOzg1mLR6A193vEYoatZujQef7v4EJuFxhy0cJJZQdaKBT2kKErGRoATkCJXotvyBt1ttqBFSAeuKHVdYqEOHsl9LXYtHyIXa9ZYI9atDW2iiTT_x7Oc2oZFxT3NaM6Wwg1YoyFGbMEBYalPJ6jOh8yTpil3gwQJyrDk-IORYsINEjQlmdRKbvMYOCqEZVSAV65SG75DQWIfvzMSAu95n7cXQ20p0zZGu_MBrxVtJ6PzULa0d7JgEBvtO7LE7rdblFZRY8RZLQqMsY12TZYTGQMKUhOllHzMrMv3P8_sBsP72efrlNluss_mfdymhUcsavQiw1NMeoW-lA3-fAbCW-Ito59ic0dqSVycWFIj8gYuDrJ9A7ZjSrFeiA0ITaw0Vr1FqknUQG2StMp281bI7RefpSGn_fy30-AWhYQk1v0edaJpPIVFrcTCy5FUF4_GWK2CEzgvR7HmN3bhThM5rnhM6l6zliv-DXabjL9qLr5hsrB3kvzy194K3Jf4NbhHneVnEQRjllpXnuRMVVV5Wjg-ObQee1w8ej8cf8PUUgWn_92HXiWdrnYwDSmgaAqFT8-Y40Pf0o-D0MIlMqDPM12S5vJ0NslWPOiY0JOvP2X8WNzezO0Ij-dTkojb5teNliS0cv-l5uZq2-bacmbzcLL5czTbZeWqn8JN0n2qwD2rOYPxej4Yi_Aj8j4rs4c-qvA7CevHX7BJT8n-GmNZ4GIwfppud4gLg7eHZ4m4zW6Wz5ebL6sWp71AwbxV2Be7Nei-br4j31VlD3dpBXIVuScOgci0rLqM8sHOKWL1ft--w9bZk3wNyVKsT-YSmgZZr__qsVyhEKxWYyXq_zOQhl4qrgzm8ho2MUJdQVydSZnZ6UxrB8EP8dBDfc_Ka5nPuZpkO-ddZ8sep7CE00rBGa5Raj8ju9Qsczel34qetfgzgdfIC9JUWrJO7xWbx12yVzVez2XR9c1LtueNutpmuby7l9Fsk_6Ios_VmZZwfyPu0hhcV_jbaQM1XaFeKNsz8gbgH1bFmL8wJypt9jbquYSbEXO-qbdFXeO89BWC4F13VsIRGHapMb0F6n-gDm4JlWZrYtz7nFDIf_Fthp0s8XaRQOAEfUaMs-2-SJatP6z4q7vRN_KGJZ3XEwekwo7ZDaBr9u-J4XQCXBIBRhET1gyDMsUEH-b3erBZ3nxbzb4RGm1XyefnldnE3O0Mf5XVU0suc9ya3tcjr32XhR1NjY8TE8heNXB2bR5vn4NLpYDUfNvRTZHhFpNf-nGb8__bd5BVCfxLEn1tI54tsvUlWm-XqS3oVqHc6aRabLG6zNLm9PUJAlj0fPKLLLok60hWdbliHthKdOrRMYf30mpGryuYFdrQLl1dXQmPrWdsN1g_YwaicuGXsxmyEEye0bd8PaeCNdpPQR8-OKXXi0Ha8sECkdlz4TlQxvyi9YMQn1Kau41DHjm3H9qw8Zo7jxLbPAloUGBPPxobx2qrrh0bf8kdcygNOQhqH9qhmOdby9BNCN9GDxvlhK4ln11wqeZ6muKpxsjgTKaEVUIt2ix3oa2P5jkv56NDVk6sfILjaHXKrEI2uGuqH02O878R3LHQtYTzWV1Lj9P8CAAD__1s2AAI">