[PATCH] Fix sanitizer build on sparc (PR sanitizer/59758)
Konstantin Serebryany
konstantin.s.serebryany@gmail.com
Tue Feb 18 19:12:00 GMT 2014
On Tue, Feb 18, 2014 at 10:00 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>
> On Tue, Feb 18, 2014 at 06:55:51PM +0100, Jose E. Marchesi wrote:
> > This patch fixes builds with --enable-sanitizer, which seems to be the
> > default for sparc now.
> >
> > Build tested in a sparc64-*-linux-gnu system with linux 3.8.13 headers.
> >
> > 2014-02-18 Jose E. Marchesi <jose.marchesi@oracle.com>
> >
> > PR sanitizer/59758
> > * sanitizer_common/sanitizer_platform_limits_posix.h (__sanitizer):
> > Define struct__old_kernel_stat_sz, struct_kernel_stat_sz and
> > struct_kernel_stat64_sz for sparc targets (both 32 and 64 bits).
> > (__sanitizer_ipc_perm): Adjust for sparc targets.
> > (__sanitizer_shmid_ds): Likewise.
> > (__sanitizer_sigaction): Likewise.
> > (IOC_SIZE): Likewise.
> >
> > * sanitizer_common/sanitizer_platform_limits_linux.cc (time_t):
> > defined as __kernel_time_t, which is needed for sparc.
> > (struct___old_kernel_stat_sz): Don't check if __sparc__ is defined.
>
> Please talk to Konstantin about getting this into the upstream compiler-rt
> repository, we don't need to wait for a merge from there, so once it
> is accepted there, the same patch can be applied to gcc too.
Right. Please read
https://code.google.com/p/address-sanitizer/wiki/HowToContribute
--kcc
>
> > Index: libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
> > ===================================================================
> > --- libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h (revision 207826)
> > +++ libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h (working copy)
> > @@ -67,6 +67,14 @@
> > const unsigned struct___old_kernel_stat_sz = 0;
> > const unsigned struct_kernel_stat_sz = 144;
> > const unsigned struct_kernel_stat64_sz = 104;
> > +#elif defined(__sparc__) && defined(__arch64__)
> > + const unsigned struct___old_kernel_stat_sz = 0;
> > + const unsigned struct_kernel_stat_sz = 104;
> > + const unsigned struct_kernel_stat64_sz = 144;
> > +#elif defined(__sparc__) && !defined(__arch64__)
> > + const unsigned struct___old_kernel_stat_sz = 0;
> > + const unsigned struct_kernel_stat_sz = 120;
> > + const unsigned struct_kernel_stat64_sz = 104;
> > #endif
> > struct __sanitizer_perf_event_attr {
> > unsigned type;
> > @@ -145,6 +153,18 @@
> > unsigned __seq;
> > u64 __unused1;
> > u64 __unused2;
> > +#elif defined(__sparc__)
> > +# if defined(__arch64__)
> > + unsigned mode;
> > + unsigned short __pad1;
> > +# else
> > + unsigned short __pad1;
> > + unsigned short mode;
> > + unsigned short __pad2;
> > +# endif
> > + unsigned short __seq;
> > + unsigned long long __unused1;
> > + unsigned long long __unused2;
> > #else
> > unsigned short mode;
> > unsigned short __pad1;
> > @@ -162,6 +182,26 @@
> >
> > struct __sanitizer_shmid_ds {
> > __sanitizer_ipc_perm shm_perm;
> > + #if defined(__sparc__)
> > + # if !defined(__arch64__)
> > + u32 __pad1;
> > + # endif
> > + s64 shm_atime;
> > + # if !defined(__arch64__)
> > + u32 __pad2;
> > + # endif
> > + s64 shm_dtime;
> > + # if !defined(__arch64__)
> > + u32 __pad3;
> > + # endif
> > + s64 shm_ctime;
> > + uptr shm_segsz;
> > + int shm_cpid;
> > + int shm_lpid;
> > + u64 shm_nattch;
> > + u64 __glibc_reserved1;
> > + u64 __glibc_reserved2;
> > + #else
> > #ifndef __powerpc__
> > uptr shm_segsz;
> > #elif !defined(__powerpc64__)
> > @@ -199,6 +239,7 @@
> > uptr __unused4;
> > uptr __unused5;
> > #endif
> > +#endif
> > };
> > #endif // SANITIZER_LINUX && !SANITIZER_ANDROID
> >
> > @@ -365,7 +406,11 @@
> > void (*sa_sigaction)(int sig, void *siginfo, void *uctx);
> > };
> > __sanitizer_sigset_t sa_mask;
> > +#if defined(__sparc__)
> > + unsigned long sa_flags;
> > +#else
> > int sa_flags;
> > +#endif
> > #if SANITIZER_LINUX
> > void (*sa_restorer)();
> > #endif
> > @@ -511,7 +556,16 @@
> > };
> > #endif
> >
> > -#define IOC_SIZE(nr) (((nr) >> 16) & 0x3fff)
> > +#if defined(__sparc__)
> > +// In sparc the 14 bits SIZE field overlaps with the
> > +// least significant bit of DIR, so either IOC_READ or
> > +// IOC_WRITE shall be 1 in order to get a non-zero SIZE.
> > +# define IOC_SIZE(nr) \
> > + ((((((nr) >> 29) & 0x7) & (4U|2U)) == 0)? \
> > + 0: (((nr) >> 16) & 0x3fff))
> > +#else
> > +# define IOC_SIZE(nr) (((nr) >> 16) & 0x3fff)
> > +#endif
> >
> > extern unsigned struct_arpreq_sz;
> > extern unsigned struct_ifreq_sz;
> > Index: libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cc
> > ===================================================================
> > --- libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cc (revision 207826)
> > +++ libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cc (working copy)
> > @@ -36,6 +36,7 @@
> > #define uid_t __kernel_uid_t
> > #define gid_t __kernel_gid_t
> > #define off_t __kernel_off_t
> > +#define time_t __kernel_time_t
> > // This header seems to contain the definitions of _kernel_ stat* structs.
> > #include <asm/stat.h>
> > #undef ino_t
> > @@ -62,7 +63,7 @@
> > unsigned struct_statfs64_sz = sizeof(struct statfs64);
> > } // namespace __sanitizer
> >
> > -#if !defined(__powerpc64__) && !defined(__x86_64__)
> > +#if !defined(__powerpc64__) && !defined(__x86_64__) && !defined(__sparc__)
> > COMPILER_CHECK(struct___old_kernel_stat_sz == sizeof(struct __old_kernel_stat));
> > #endif
>
> Jakub
More information about the Gcc-patches
mailing list