From patchwork Wed Nov 27 08:54:37 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Venkataramanan Kumar X-Patchwork-Id: 294517 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 27CD72C00A0 for ; Wed, 27 Nov 2013 19:54:58 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; q=dns; s=default; b=vj/8ROISM36p0BTb9c nb/EMm4l6LRUEyufKmO7vAQdq2S6Q5gXiPOQVd22dE0LHyMQe8xdfbRpiHmllv1R WQU3U5QfOz7xcFGH3WygGnQ4f00SRyALQE0zjHPKw3bOmC53MonK7lRusMEsoS0y /7RLsqOdyNCE6G7pzwE554f+Q= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; s=default; bh=B9XdzUWlwxlscHBigI4s1e/X Cqc=; b=jnjjrWIeBY5//3I6+yyZ4sjZj4E6aJIUJYrrMRvvC5M1lltjPKvJVvyU qRx0oFNM7orZirPKBQ4U/VdCNyEJAx/DYXi420At9m4AeY2eDKqMSc2ca2rvSxUF DQgaDo9juzpPz6oiTl4oc6b9G3PMyzpyenNZe7QAPe79Y89+lRY= Received: (qmail 10936 invoked by alias); 27 Nov 2013 08:54:48 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 10924 invoked by uid 89); 27 Nov 2013 08:54:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.2 required=5.0 tests=AWL, BAYES_60, RDNS_NONE, SPF_PASS, URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: mail-qe0-f43.google.com Received: from Unknown (HELO mail-qe0-f43.google.com) (209.85.128.43) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 27 Nov 2013 08:54:45 +0000 Received: by mail-qe0-f43.google.com with SMTP id 2so7092637qeb.30 for ; Wed, 27 Nov 2013 00:54:37 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=d6mneddYNZlgqi1yycHPTy5OnSYN2Ur5bCkzY28J5B0=; b=RPdcv6Cx3MGIM9KwCe01K743zQo5VXnE58eIdEX6o5yA/Zagms6kE7XX7Gl7sbpnsy MI5J0D7QRu1ei8g6c3Wpc2XkkHBGAzlIdJpVd8rZzlNSXawCr8wcmAZEoYON8ojfLom6 w6x7HkXycUJ8xknWKaHR/SjjHRziODhdTS91WTuKc0zY6DIHLh8Sh2wcRkWC73UXyAkM 03gAMCUtGg5ve5VxmH5cYS7hudeOFbGzmCDzFIIdhNgmMjBoM4jYZFylaJz6aL/w4DzN VRjYcgq1El+d3sMBdbSQ6dw9U0SStGIJaqXeZnfm9Q6UGSd7ebl4km3TiZx+DF4T8Rsj rdJQ== X-Gm-Message-State: ALoCoQnT8esNsiDkT2e9ZF343e1wyoJ8j5i58zB+964kuu2tuw+LQO4prV/OpV887hr06XetzOVe MIME-Version: 1.0 X-Received: by 10.49.35.52 with SMTP id e20mr64074539qej.63.1385542477209; Wed, 27 Nov 2013 00:54:37 -0800 (PST) Received: by 10.140.25.72 with HTTP; Wed, 27 Nov 2013 00:54:37 -0800 (PST) In-Reply-To: <5294B5D2.304@arm.com> References: <5294B5D2.304@arm.com> Date: Wed, 27 Nov 2013 14:24:37 +0530 Message-ID: Subject: Re: [RFC] [PATCH V2, AARCH64]: Re: [RFC] [PATCH, AARCH64] Machine descriptions to support stack smashing protection From: Venkataramanan Kumar To: Richard Earnshaw Cc: "Joseph S. Myers" , Jakub Jelinek , "gcc-patches@gcc.gnu.org" , Marcus Shawcroft , Patch Tracking Hi Richard, > I don't think it's good to have long lists of targets on generic tests. > Can we factor this out into a target-supports option? I have updated the patch as per your recommendation. Please let me know if it is fine. 2013-11-26 Venkataramanan Kumar * configure.ac (gcc_cv_libc_provides_tls_ssp): Add test to check TLS support in target C library for Aarch64. * configure: Regenerate. * config.in: Regenerate. * config/aarch64/aarch64.md (stack_protect_set, stack_protect_test) (stack_protect_set_, stack_protect_test_): Add initial machine description for Stack Smashing Protector. * config/aarch64/aarch64-linux.h (TARGET_THREAD_SSP_OFFSET): Define. 2013-11-26 Venkataramanan Kumar * lib/target-supports.exp (check_effective_target_stack_protection): New procedure. * g++.dg/fstack-protector-strong.C: Add target check for stack protection. * gcc.dg/fstack-protector-strong.c: Likewise. regards, Venkat. On 26 November 2013 20:23, Richard Earnshaw wrote: > On 26/11/13 14:16, Venkataramanan Kumar wrote: >> Index: gcc/testsuite/gcc.dg/fstack-protector-strong.c >> =================================================================== >> --- gcc/testsuite/gcc.dg/fstack-protector-strong.c (revision 205378) >> +++ gcc/testsuite/gcc.dg/fstack-protector-strong.c (working copy) >> @@ -1,6 +1,6 @@ >> /* Test that stack protection is done on chosen functions. */ >> >> -/* { dg-do compile { target i?86-*-* x86_64-*-* rs6000-*-* s390x-*-* } } */ >> +/* { dg-do compile { target i?86-*-* x86_64-*-* rs6000-*-* s390x-*-* aarch64-*-* } } */ >> /* { dg-options "-O2 -fstack-protector-strong" } */ >> > > I don't think it's good to have long lists of targets on generic tests. > Can we factor this out into a target-supports option? > > R. > Index: gcc/configure.ac =================================================================== --- gcc/configure.ac (revision 205378) +++ gcc/configure.ac (working copy) @@ -4896,6 +4896,24 @@ [Define if your target C library provides stack protector support]) fi +# Test for tls based stack protector support in target C library. +AC_CACHE_CHECK(TLS stack guard support in target C library, + gcc_cv_libc_provides_tls_ssp, + [gcc_cv_libc_provides_tls_ssp=no + case "$target" in + aarch64-*-linux* | aarch64-*-kfreebsd*-gnu | aarch64-*-knetbsd*-gnu) + # glibc 2.19 and later provides TLS access to stack guard canary + # currently set for Aarch64. + GCC_GLIBC_VERSION_GTE_IFELSE([2], [19], [gcc_cv_libc_provides_tls_ssp=yes]) + ;; + *) gcc_cv_libc_provides_tls_ssp=no ;; + esac]) + +if test x$gcc_cv_libc_provides_tls_ssp = xyes; then + AC_DEFINE(TARGET_LIBC_PROVIDES_TLS_SSP, 1, + [Define if your target C library provides TLS stack protector support.]) +fi + # Test for on the target. GCC_TARGET_TEMPLATE([HAVE_SYS_SDT_H]) AC_MSG_CHECKING(sys/sdt.h in the target C library) Index: gcc/configure =================================================================== --- gcc/configure (revision 205378) +++ gcc/configure (working copy) @@ -27127,6 +27127,35 @@ fi +# Test for tls based stack protector support in target C library. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking TLS stack guard support in target C library" >&5 +$as_echo_n "checking TLS stack guard support in target C library... " >&6; } +if test "${gcc_cv_libc_provides_tls_ssp+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_libc_provides_tls_ssp=no + case "$target" in + aarch64-*-linux* | aarch64-*-kfreebsd*-gnu | aarch64-*-knetbsd*-gnu) + # glibc 2.19 and later provides TLS access to stack guard canary + # currently set for Aarch64. + +if test $glibc_version_major -gt 2 \ + || ( test $glibc_version_major -eq 2 && test $glibc_version_minor -ge 19 ); then : + gcc_cv_libc_provides_tls_ssp=yes +fi + ;; + *) gcc_cv_libc_provides_tls_ssp=no ;; + esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_libc_provides_tls_ssp" >&5 +$as_echo "$gcc_cv_libc_provides_tls_ssp" >&6; } + +if test x$gcc_cv_libc_provides_tls_ssp = xyes; then + +$as_echo "#define TARGET_LIBC_PROVIDES_TLS_SSP 1" >>confdefs.h + +fi + # Test for on the target. { $as_echo "$as_me:${as_lineno-$LINENO}: checking sys/sdt.h in the target C library" >&5 Index: gcc/testsuite/lib/target-supports.exp =================================================================== --- gcc/testsuite/lib/target-supports.exp (revision 205378) +++ gcc/testsuite/lib/target-supports.exp (working copy) @@ -808,6 +808,17 @@ } "-fstack-protector"] } +# Return 1 the target supports stack protection. +proc check_effective_target_stack_protection { } { + if { [istarget i?86-*-*] + || [istarget x86_64-*-*] + || [istarget aarch64-*-*] + || [istarget s390x-*-*] } { + return 1; + } + return 0 +} + # Return 1 if compilation with -freorder-blocks-and-partition is error-free # for trivial code, 0 otherwise. Index: gcc/testsuite/gcc.dg/fstack-protector-strong.c =================================================================== --- gcc/testsuite/gcc.dg/fstack-protector-strong.c (revision 205378) +++ gcc/testsuite/gcc.dg/fstack-protector-strong.c (working copy) @@ -1,6 +1,6 @@ /* Test that stack protection is done on chosen functions. */ -/* { dg-do compile { target i?86-*-* x86_64-*-* rs6000-*-* s390x-*-* } } */ +/* { dg-do compile { target stack_protection } } */ /* { dg-options "-O2 -fstack-protector-strong" } */ #include Index: gcc/testsuite/g++.dg/fstack-protector-strong.C =================================================================== --- gcc/testsuite/g++.dg/fstack-protector-strong.C (revision 205378) +++ gcc/testsuite/g++.dg/fstack-protector-strong.C (working copy) @@ -1,6 +1,6 @@ /* Test that stack protection is done on chosen functions. */ -/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-do compile { target stack_protection } } */ /* { dg-options "-O2 -fstack-protector-strong" } */ class A Index: gcc/config.in =================================================================== --- gcc/config.in (revision 205378) +++ gcc/config.in (working copy) @@ -1828,6 +1828,12 @@ #endif +/* Define if your target C library provides TLS stack protector support. */ +#ifndef USED_FOR_TARGET +#undef TARGET_LIBC_PROVIDES_TLS_SSP +#endif + + /* Define to 1 if you can safely include both and . */ #ifndef USED_FOR_TARGET #undef TIME_WITH_SYS_TIME Index: gcc/config/aarch64/aarch64-linux.h =================================================================== --- gcc/config/aarch64/aarch64-linux.h (revision 205378) +++ gcc/config/aarch64/aarch64-linux.h (working copy) @@ -43,4 +43,9 @@ } \ while (0) +#ifdef TARGET_LIBC_PROVIDES_TLS_SSP +/* Aarch64 glibc provides __stack_chk_guard in [tp - 0x8]. */ +#define TARGET_THREAD_SSP_OFFSET (-1 * GET_MODE_SIZE (ptr_mode)) +#endif + #endif /* GCC_AARCH64_LINUX_H */ Index: gcc/config/aarch64/aarch64.md =================================================================== --- gcc/config/aarch64/aarch64.md (revision 205378) +++ gcc/config/aarch64/aarch64.md (working copy) @@ -99,6 +99,10 @@ UNSPEC_TLSDESC UNSPEC_USHL_2S UNSPEC_VSTRUCTDUMMY + UNSPEC_SP_SET + UNSPEC_SP_TEST + UNSPEC_SP_TLS_SET + UNSPEC_SP_TLS_TEST ]) (define_c_enum "unspecv" [ @@ -3625,6 +3629,80 @@ DONE; }) + +;; Named patterns for stack smashing protection. +(define_expand "stack_protect_set" + [(match_operand 0 "memory_operand") + (match_operand 1 "memory_operand")] + "" +{ + enum machine_mode mode = GET_MODE (operands[0]); + +#ifdef TARGET_THREAD_SSP_OFFSET + rtx tlsreg = gen_reg_rtx (Pmode); + emit_insn (gen_aarch64_load_tp_hard (tlsreg)); + rtx addr = gen_rtx_PLUS (Pmode, tlsreg, GEN_INT (TARGET_THREAD_SSP_OFFSET)); + operands[1] = gen_rtx_MEM (Pmode, addr); +#endif + + emit_insn ((mode == DImode + ? gen_stack_protect_set_di + : gen_stack_protect_set_si) (operands[0], operands[1])); + DONE; +}) + +(define_insn "stack_protect_set_" + [(set (match_operand:PTR 0 "memory_operand" "=m") + (unspec:PTR [(match_operand:PTR 1 "memory_operand" "m")] + UNSPEC_SP_SET)) + (set (match_scratch:PTR 2 "=&r") (const_int 0))] + "" + "ldr\\t%x2, %1\;str\\t%x2, %0\;mov\t%x2,0" + [(set_attr "length" "12")]) + +(define_expand "stack_protect_test" + [(match_operand 0 "memory_operand") + (match_operand 1 "memory_operand") + (match_operand 2)] + "" +{ + +#ifdef TARGET_THREAD_SSP_OFFSET + rtx tlsreg = gen_reg_rtx (Pmode); + emit_insn (gen_aarch64_load_tp_hard (tlsreg)); + rtx addr = gen_rtx_PLUS (Pmode, tlsreg, GEN_INT (TARGET_THREAD_SSP_OFFSET)); + operands[1] = gen_rtx_MEM (Pmode, addr); +#endif + + rtx result = gen_reg_rtx (Pmode); + + enum machine_mode mode = GET_MODE (operands[0]); + + emit_insn ((mode == DImode + ? gen_stack_protect_test_di + : gen_stack_protect_test_si) (result, + operands[0], + operands[1])); + + if (mode == DImode) + emit_jump_insn (gen_cbranchdi4 (gen_rtx_EQ (VOIDmode, result, const0_rtx), + result, const0_rtx, operands[2])); + else + emit_jump_insn (gen_cbranchsi4 (gen_rtx_EQ (VOIDmode, result, const0_rtx), + result, const0_rtx, operands[2])); + DONE; +}) + +(define_insn "stack_protect_test_" + [(set (match_operand:PTR 0 "register_operand") + (unspec:PTR [(match_operand:PTR 1 "memory_operand" "m") + (match_operand:PTR 2 "memory_operand" "m")] + UNSPEC_SP_TEST)) + (clobber (match_scratch:PTR 3 "=&r"))] + "" + "ldr\t%x3, %x1\;ldr\t%x0, %x2\;eor\t%x0, %x3, %x0" + [(set_attr "length" "12")]) + ;; AdvSIMD Stuff (include "aarch64-simd.md")