From patchwork Mon Dec 3 18:33:12 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Sparc ASAN From: Konstantin Serebryany X-Patchwork-Id: 203411 Message-Id: To: David Miller Cc: bergner@vnet.ibm.com, gcc-patches@gcc.gnu.org, ebotcazou@adacore.com, dje.gcc@gmail.com, wmi@google.com, dvyukov@google.com Date: Mon, 3 Dec 2012 22:33:12 +0400 On Mon, Dec 3, 2012 at 10:29 PM, David Miller wrote: > From: Konstantin Serebryany > Date: Mon, 3 Dec 2012 22:18:56 +0400 > >> On Mon, Dec 3, 2012 at 10:02 PM, David Miller wrote: >>> The only changes to libsantizier is to put __sparc__ checks where >>> __powerpc__ checks exist in the unwind code. >> >> Like this? >> >> =================================================================== >> --- asan/asan_linux.cc (revision 169136) >> +++ asan/asan_linux.cc (working copy) >> @@ -158,7 +158,9 @@ >> stack->trace[0] = pc; >> if ((max_s) > 1) { >> stack->max_size = max_s; >> -#if defined(__arm__) || defined(__powerpc__) || defined(__powerpc64__) >> +#if defined(__arm__) || \ >> + defined(__powerpc__) || defined(__powerpc64__) || \ >> + defined(__sparc__) >> _Unwind_Backtrace(Unwind_Trace, stack); >> // Pop off the two ASAN functions from the backtrace. >> stack->PopStackFrames(2); > > Yes, that's perfect. > > We could also add a __sparc__ block to sanitizer_stacktrace.cc:patch_pc(). > The Sparc PC is actually 8 bytes after the caller's jump. Sparc has > a delay slot, the place to return to is 2 instructions after the call/jump, > and instructions are all 4 bytes long. Like this? > >> We either need to align the redzones by 32 always, or for some platforms. >> Either is fine for me. > > I'm ambivalent as well. --- sanitizer_common/sanitizer_stacktrace.cc (revision 169136) +++ sanitizer_common/sanitizer_stacktrace.cc (working copy) @@ -36,6 +36,8 @@ #if defined(__powerpc__) || defined(__powerpc64__) // PCs are always 4 byte aligned. return pc - 4; +#elif defined(__sparc__) + return pc - 8; #else return pc - 1; #endif