Skip to content

Commit d4eb6c6

Browse files
committed
[sanitizer_common] Heed __ndbl_ prefix for 32-bit Linux/sparc64 interceptors
When ASan testing is enabled on SPARC as per PR llvm#107405, a couple of tests `FAIL` on Linux/sparc64: ``` AddressSanitizer-sparc-linux :: TestCases/printf-2.c AddressSanitizer-sparc-linux :: TestCases/printf-3.c AddressSanitizer-sparc-linux :: TestCases/printf-4.c AddressSanitizer-sparc-linux :: TestCases/printf-5.c SanitizerCommon-asan-sparc-Linux :: Linux/unexpected_format_specifier_test.cpp ``` It turns out the interceptors aren't used since on Linux/sparc64 `double` and `long double` are the same, and a couple of `stdio` functions are prefixed with `__nldbl_` (no long double) accordingly. This patch handles this. Tested on `sparc64-unknown-linux-gnu`.
1 parent 43c9203 commit d4eb6c6

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

+33
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,39 @@ extern const short *_toupper_tab_;
127127
extern const short *_tolower_tab_;
128128
#endif
129129

130+
#if SANITIZER_LINUX && SANITIZER_SPARC32
131+
// On 32-bit Linux/sparc64, double and long double are identical and glibc
132+
// uses a __nldbl_ (no long double) prefix for various stdio functions.
133+
# define __isoc23_fscanf __nldbl___isoc23_fscanf
134+
# define __isoc23_scanf __nldbl___isoc23_scanf
135+
# define __isoc23_sscanf __nldbl___isoc23_sscanf
136+
# define __isoc23_vfscanf __nldbl___isoc23_vfscanf
137+
# define __isoc23_vscanf __nldbl___isoc23_vscanf
138+
# define __isoc23_vsscanf __nldbl___isoc23_vsscanf
139+
# define __isoc99_fscanf __nldbl___isoc99_fscanf
140+
# define __isoc99_scanf __nldbl___isoc99_scanf
141+
# define __isoc99_sscanf __nldbl___isoc99_sscanf
142+
# define __isoc99_vfscanf __nldbl___isoc99_vfscanf
143+
# define __isoc99_vscanf __nldbl___isoc99_vscanf
144+
# define __isoc99_vsscanf __nldbl___isoc99_vsscanf
145+
# define asprintf __nldbl_asprintf
146+
# define fprintf __nldbl_fprintf
147+
# define fscanf __nldbl_fscanf
148+
# define printf __nldbl_printf
149+
# define scanf __nldbl_scanf
150+
# define snprintf __nldbl_snprintf
151+
# define sprintf __nldbl_sprintf
152+
# define sscanf __nldbl_sscanf
153+
# define vasprintf __nldbl_vasprintf
154+
# define vfprintf __nldbl_vfprintf
155+
# define vfscanf __nldbl_vfscanf
156+
# define vprintf __nldbl_vprintf
157+
# define vscanf __nldbl_vscanf
158+
# define vsnprintf __nldbl_vsnprintf
159+
# define vsprintf __nldbl_vsprintf
160+
# define vsscanf __nldbl_vsscanf
161+
#endif
162+
130163
#if SANITIZER_MUSL && \
131164
(defined(__i386__) || defined(__arm__) || SANITIZER_MIPS32 || SANITIZER_PPC32)
132165
// musl 1.2.0 on existing 32-bit architectures uses new symbol names for the

0 commit comments

Comments
 (0)