Change in the v8 patch: 1. __stack_chk_guard must be an uintptr_t variable. 2. Remove c_stack_protect_guard_decl_p and duplicate_stack_protect_guard_decl_p.
-- H.J. --- Add a new target hook, stack_protect_guard_symbol_p, to support the user provided stack protection guard as an internal symbol. If the hook returns true, 1. Make __stack_chk_guard an internal C/C++ symbol. 2. Declare __stack_chk_guard as an uintptr_t variable so that it can be initialized as an integer. 3. If the user declared variable matches __stack_chk_guard, merge it with __stack_chk_guard, including its visibility attribute. 4. Define the __stack_protection_guard_is_internal_symbol__ macro to indicate that __stack_chk_guard is an internal symbol. gcc/ PR c/121911 * target.def (stack_protect_guard_symbol_p): New target hook. * targhooks.cc (default_stack_protect_guard): Use the type of uintptr_t, instead of ptr_type_node. * config/i386/i386.cc (ix86_stack_protect_guard_symbol_p): New. (TARGET_STACK_PROTECT_GUARD_SYMBOL_P): Likewise. * doc/tm.texi: Regenerated. * doc/tm.texi.in (TARGET_STACK_PROTECT_GUARD_SYMBOL_P): New. gcc/c-family/ PR c/121911 * c-common.cc (c_common_nodes_and_builtins): If the stack_protect_guard_symbol_p hook returns true, declare a global symbol for stack protection guard. * c-cppbuiltin.cc (c_cpp_builtins): Define the __stack_protection_guard_is_internal_symbol__ macro if the stack_protect_guard_symbol_p hook returns. gcc/testsuite/ PR c/121911 * g++.target/i386/ssp-global-1.C: New test. * g++.target/i386/ssp-global-2.C: Likewise. * g++.target/i386/ssp-global-3.C: Likewise. * g++.target/i386/ssp-global-hidden-1.C: Likewise. * g++.target/i386/ssp-global-hidden-2.C: Likewise. * g++.target/i386/ssp-global-hidden-3.C: Likewise. * gcc.target/i386/ssp-global-2.c: Likewise. * gcc.target/i386/ssp-global-3.c: Likewise. * gcc.target/i386/ssp-global-4.c: Likewise. * gcc.target/i386/ssp-global-hidden-1.c: Likewise. * gcc.target/i386/ssp-global-hidden-2.c: Likewise. * gcc.target/i386/ssp-global-hidden-3.c: Likewise. * gcc.target/i386/ssp-global.c: Include <stdint.h>. (__stack_chk_guard): Change its type to uintptr_t.
From 52d707fc22fa6117954e99a2ec6e601868089f71 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <[email protected]> Date: Fri, 12 Sep 2025 18:52:39 -0700 Subject: [PATCH v8] c/c++: Make stack protection guard an internal symbol Add a new target hook, stack_protect_guard_symbol_p, to support the user provided stack protection guard as an internal symbol. If the hook returns true, 1. Make __stack_chk_guard an internal C/C++ symbol. 2. Declare __stack_chk_guard as an uintptr_t variable so that it can be initialized as an integer. 3. If the user declared variable matches __stack_chk_guard, merge it with __stack_chk_guard, including its visibility attribute. 4. Define the __stack_protection_guard_is_internal_symbol__ macro to indicate that __stack_chk_guard is an internal symbol. gcc/ PR c/121911 * target.def (stack_protect_guard_symbol_p): New target hook. * targhooks.cc (default_stack_protect_guard): Use the type of uintptr_t, instead of ptr_type_node. * config/i386/i386.cc (ix86_stack_protect_guard_symbol_p): New. (TARGET_STACK_PROTECT_GUARD_SYMBOL_P): Likewise. * doc/tm.texi: Regenerated. * doc/tm.texi.in (TARGET_STACK_PROTECT_GUARD_SYMBOL_P): New. gcc/c-family/ PR c/121911 * c-common.cc (c_common_nodes_and_builtins): If the stack_protect_guard_symbol_p hook returns true, declare a global symbol for stack protection guard. * c-cppbuiltin.cc (c_cpp_builtins): Define the __stack_protection_guard_is_internal_symbol__ macro if the stack_protect_guard_symbol_p hook returns. gcc/testsuite/ PR c/121911 * g++.target/i386/ssp-global-1.C: New test. * g++.target/i386/ssp-global-2.C: Likewise. * g++.target/i386/ssp-global-3.C: Likewise. * g++.target/i386/ssp-global-hidden-1.C: Likewise. * g++.target/i386/ssp-global-hidden-2.C: Likewise. * g++.target/i386/ssp-global-hidden-3.C: Likewise. * gcc.target/i386/ssp-global-2.c: Likewise. * gcc.target/i386/ssp-global-3.c: Likewise. * gcc.target/i386/ssp-global-4.c: Likewise. * gcc.target/i386/ssp-global-hidden-1.c: Likewise. * gcc.target/i386/ssp-global-hidden-2.c: Likewise. * gcc.target/i386/ssp-global-hidden-3.c: Likewise. * gcc.target/i386/ssp-global.c: Include <stdint.h>. (__stack_chk_guard): Change its type to uintptr_t. Signed-off-by: H.J. Lu <[email protected]> --- gcc/c-family/c-common.cc | 5 ++ gcc/c-family/c-cppbuiltin.cc | 5 ++ gcc/config/i386/i386.cc | 12 +++++ gcc/doc/tm.texi | 7 +++ gcc/doc/tm.texi.in | 2 + gcc/target.def | 11 ++++ gcc/targhooks.cc | 12 +++-- gcc/testsuite/g++.target/i386/ssp-global-1.C | 36 +++++++++++++ gcc/testsuite/g++.target/i386/ssp-global-2.C | 4 ++ gcc/testsuite/g++.target/i386/ssp-global-3.C | 4 ++ .../g++.target/i386/ssp-global-hidden-1.C | 49 ++++++++++++++++++ .../g++.target/i386/ssp-global-hidden-2.C | 20 ++++++++ .../g++.target/i386/ssp-global-hidden-3.C | 50 +++++++++++++++++++ gcc/testsuite/gcc.target/i386/ssp-global-2.c | 36 +++++++++++++ gcc/testsuite/gcc.target/i386/ssp-global-3.c | 10 ++++ gcc/testsuite/gcc.target/i386/ssp-global-4.c | 10 ++++ .../gcc.target/i386/ssp-global-hidden-1.c | 49 ++++++++++++++++++ .../gcc.target/i386/ssp-global-hidden-2.c | 20 ++++++++ .../gcc.target/i386/ssp-global-hidden-3.c | 50 +++++++++++++++++++ gcc/testsuite/gcc.target/i386/ssp-global.c | 5 +- 20 files changed, 392 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.target/i386/ssp-global-1.C create mode 100644 gcc/testsuite/g++.target/i386/ssp-global-2.C create mode 100644 gcc/testsuite/g++.target/i386/ssp-global-3.C create mode 100644 gcc/testsuite/g++.target/i386/ssp-global-hidden-1.C create mode 100644 gcc/testsuite/g++.target/i386/ssp-global-hidden-2.C create mode 100644 gcc/testsuite/g++.target/i386/ssp-global-hidden-3.C create mode 100644 gcc/testsuite/gcc.target/i386/ssp-global-2.c create mode 100644 gcc/testsuite/gcc.target/i386/ssp-global-3.c create mode 100644 gcc/testsuite/gcc.target/i386/ssp-global-4.c create mode 100644 gcc/testsuite/gcc.target/i386/ssp-global-hidden-1.c create mode 100644 gcc/testsuite/gcc.target/i386/ssp-global-hidden-2.c create mode 100644 gcc/testsuite/gcc.target/i386/ssp-global-hidden-3.c diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc index 7f891e1ef49..f8faf9a314f 100644 --- a/gcc/c-family/c-common.cc +++ b/gcc/c-family/c-common.cc @@ -4925,6 +4925,11 @@ c_common_nodes_and_builtins (void) } } + /* Call the target stack_protect_guard hook if the stack protection + guard should be an internal symbol. */ + if (targetm.stack_protect_guard_symbol_p ()) + lang_hooks.decls.pushdecl (targetm.stack_protect_guard ()); + if (TREE_CODE (va_list_type_node) == ARRAY_TYPE) { va_list_arg_type_node = va_list_ref_type_node = diff --git a/gcc/c-family/c-cppbuiltin.cc b/gcc/c-family/c-cppbuiltin.cc index 12ddfa22074..ff55eda1b0e 100644 --- a/gcc/c-family/c-cppbuiltin.cc +++ b/gcc/c-family/c-cppbuiltin.cc @@ -1190,6 +1190,11 @@ c_cpp_builtins (cpp_reader *pfile) cpp_define (pfile, "__cpp_exceptions=199711L"); } + /* Define this to indicate that the stack protection guard symbol, + "__stack_chk_guard", is an internal symbol. */ + if (targetm.stack_protect_guard_symbol_p ()) + cpp_define (pfile, "__stack_protection_guard_is_internal_symbol__"); + /* Represents the C++ ABI version, always defined so it can be used while preprocessing C and assembler. */ if (flag_abi_version == 0) diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index ea050f37b57..aefe1040cdc 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -25246,6 +25246,14 @@ ix86_stack_protect_guard (void) return default_stack_protect_guard (); } +/* Implement TARGET_STACK_PROTECT_GUARD_SYMBOL_P. */ + +static bool +ix86_stack_protect_guard_symbol_p (void) +{ + return TARGET_SSP_GLOBAL_GUARD; +} + static bool ix86_stack_protect_runtime_enabled_p (void) { @@ -28225,6 +28233,10 @@ ix86_libgcc_floating_mode_supported_p #undef TARGET_STACK_PROTECT_GUARD #define TARGET_STACK_PROTECT_GUARD ix86_stack_protect_guard +#undef TARGET_STACK_PROTECT_GUARD_SYMBOL_P +#define TARGET_STACK_PROTECT_GUARD_SYMBOL_P \ + ix86_stack_protect_guard_symbol_p + #undef TARGET_STACK_PROTECT_RUNTIME_ENABLED_P #define TARGET_STACK_PROTECT_RUNTIME_ENABLED_P \ ix86_stack_protect_runtime_enabled_p diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 394a46fdbaa..76a9f918e18 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5425,6 +5425,13 @@ The default version of this hook creates a variable called @samp{__stack_chk_guard}, which is normally defined in @file{libgcc2.c}. @end deftypefn +@deftypefn {Target Hook} bool TARGET_STACK_PROTECT_GUARD_SYMBOL_P (void) +Usually, the compiler uses an external variable @samp{__stack_chk_guard} +defined in @file{libgcc2.c} as the stack protection guard symbol. Define +this hook to return true if a user provided definition of +@samp{__stack_chk_guard} with the @code{uintptr_t} type is used. +@end deftypefn + @deftypefn {Target Hook} tree TARGET_STACK_PROTECT_FAIL (void) This hook returns a @code{CALL_EXPR} that alerts the runtime that the stack protect guard variable has been modified. This expression should diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 274bb899d0c..1acda0c264c 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -3825,6 +3825,8 @@ generic code. @hook TARGET_STACK_PROTECT_GUARD +@hook TARGET_STACK_PROTECT_GUARD_SYMBOL_P + @hook TARGET_STACK_PROTECT_FAIL @hook TARGET_STACK_PROTECT_RUNTIME_ENABLED_P diff --git a/gcc/target.def b/gcc/target.def index 206c94f8749..f5531f759a8 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4654,6 +4654,17 @@ The default version of this hook creates a variable called\n\ tree, (void), default_stack_protect_guard) +/* Return true if the user provided stack protection guard definition of + __stack_chk_guard is used. */ +DEFHOOK +(stack_protect_guard_symbol_p, + "Usually, the compiler uses an external variable @samp{__stack_chk_guard}\n\ +defined in @file{libgcc2.c} as the stack protection guard symbol. Define\n\ +this hook to return true if a user provided definition of\n\ +@samp{__stack_chk_guard} with the @code{uintptr_t} type is used.", + bool, (void), + hook_bool_void_false) + /* This target hook allows the operating system to override the CALL_EXPR that is invoked when a check vs the guard variable fails. */ DEFHOOK diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index 7cb48192255..df2ec7eeace 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -926,7 +926,7 @@ default_stack_protect_guard (void) t = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier ("__stack_chk_guard"), - ptr_type_node); + lang_hooks.types.type_for_mode (ptr_mode, 1)); TREE_STATIC (t) = 1; TREE_PUBLIC (t) = 1; DECL_EXTERNAL (t) = 1; @@ -937,8 +937,14 @@ default_stack_protect_guard (void) /* Do not share RTL as the declaration is visible outside of current function. */ - x = DECL_RTL (t); - RTX_FLAG (x, used) = 1; + if (mode_mem_attrs[(int) DECL_MODE (t)]) + { + /* NB: Don't call make_decl_rtl when mode_mem_attrs isn't + initialized. -save-temps won't initialize mode_mem_attrs + and make_decl_rtl will fail. */ + x = DECL_RTL (t); + RTX_FLAG (x, used) = 1; + } stack_chk_guard_decl = t; } diff --git a/gcc/testsuite/g++.target/i386/ssp-global-1.C b/gcc/testsuite/g++.target/i386/ssp-global-1.C new file mode 100644 index 00000000000..5f4d64e3573 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/ssp-global-1.C @@ -0,0 +1,36 @@ +/* { dg-do run { target fstack_protector } } */ +/* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ + +#include <stdint.h> +#include <stdlib.h> + +#ifdef __LP64__ +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; +#else +uintptr_t __stack_chk_guard = 0xdd2cc927UL; +#endif + +extern "C" void +__stack_chk_fail (void) +{ + exit (0); /* pass */ +} + +__attribute__ ((noipa)) +void +smash (char *p, int i) +{ + p[i] = 42; +} + +int +main (void) +{ + char foo[255]; + + /* smash stack */ + for (int i = 0; i <= 400; i++) + smash (foo, i); + + return 1; +} diff --git a/gcc/testsuite/g++.target/i386/ssp-global-2.C b/gcc/testsuite/g++.target/i386/ssp-global-2.C new file mode 100644 index 00000000000..e0e2e7d7f9b --- /dev/null +++ b/gcc/testsuite/g++.target/i386/ssp-global-2.C @@ -0,0 +1,4 @@ +/* { dg-do compile { target fstack_protector } } */ +/* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ + +extern char *__stack_chk_guard; /* { dg-error "conflicting declaration 'char. __stack_chk_guard'" } */ diff --git a/gcc/testsuite/g++.target/i386/ssp-global-3.C b/gcc/testsuite/g++.target/i386/ssp-global-3.C new file mode 100644 index 00000000000..cc842b3d538 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/ssp-global-3.C @@ -0,0 +1,4 @@ +/* { dg-do compile { target fstack_protector } } */ +/* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ + +extern char __stack_chk_guard; /* { dg-error "conflicting declaration 'char __stack_chk_guard'" } */ diff --git a/gcc/testsuite/g++.target/i386/ssp-global-hidden-1.C b/gcc/testsuite/g++.target/i386/ssp-global-hidden-1.C new file mode 100644 index 00000000000..800cc613930 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/ssp-global-hidden-1.C @@ -0,0 +1,49 @@ +/* { dg-do run { target { fstack_protector && fpic } } } */ +/* { dg-options "-O2 -fPIC -fstack-protector-all -mstack-protector-guard=global -save-temps" } */ + +#ifndef __stack_protection_guard_is_internal_symbol__ +# error "__stack_protection_guard_is_internal_symbol__ isn't defined" +#endif + +#include <stdint.h> +#include <stdlib.h> + +__attribute__ ((visibility ("hidden"))) +#ifdef __LP64__ +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; +#else +uintptr_t __stack_chk_guard = 0xdd2cc927UL; +#endif + +extern "C" void +__stack_chk_fail (void) +{ + exit (0); /* pass */ +} + +__attribute__ ((noipa)) +void +smash (char *p, int i) +{ + p[i] = 42; +} + +int +main (void) +{ + char foo[255]; + + /* smash stack */ + for (int i = 0; i <= 400; i++) + smash (foo, i); + + return 1; +} + +/* { dg-final { scan-hidden "__stack_chk_guard" } } */ +/* { dg-final { scan-assembler "__stack_chk_guard\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOTPCREL" { target { ! ia32 } } } } */ + /* { dg-final { scan-assembler ".quad 3280087301477736604" { target { lp64 } } } } */ +/* { dg-final { scan-assembler "__stack_chk_guard@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOT\\(" { target ia32 } } } */ + /* { dg-final { scan-assembler ".long -584267481" { target { ! lp64 } } } } */ diff --git a/gcc/testsuite/g++.target/i386/ssp-global-hidden-2.C b/gcc/testsuite/g++.target/i386/ssp-global-hidden-2.C new file mode 100644 index 00000000000..9fd3b1d00d4 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/ssp-global-hidden-2.C @@ -0,0 +1,20 @@ +/* { dg-do compile { target { fstack_protector && fpic } } } */ +/* { dg-options "-O2 -fPIC -fstack-protector-all -mstack-protector-guard=global" } */ + +#include <stdint.h> + +extern uintptr_t __stack_chk_guard; +__attribute__ ((visibility ("hidden"))) +extern uintptr_t __stack_chk_guard; + +void +smash (char *p, int i) +{ + p[i] = 42; +} + +/* { dg-final { scan-hidden "__stack_chk_guard" } } */ +/* { dg-final { scan-assembler "__stack_chk_guard\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOTPCREL" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "__stack_chk_guard@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOT\\(" { target ia32 } } } */ diff --git a/gcc/testsuite/g++.target/i386/ssp-global-hidden-3.C b/gcc/testsuite/g++.target/i386/ssp-global-hidden-3.C new file mode 100644 index 00000000000..c381be0ad78 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/ssp-global-hidden-3.C @@ -0,0 +1,50 @@ +/* { dg-do run { target { fstack_protector && fpic } } } */ +/* { dg-options "-O2 -fPIC -mstack-protector-guard=global -save-temps" } */ + +#ifndef __stack_protection_guard_is_internal_symbol__ +# error "__stack_protection_guard_is_internal_symbol__ isn't defined" +#endif + +#include <stdint.h> +#include <stdlib.h> + +__attribute__ ((visibility ("hidden"))) +#ifdef __LP64__ +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; +#else +uintptr_t __stack_chk_guard = 0xdd2cc927UL; +#endif + +extern "C" void +__stack_chk_fail (void) +{ + exit (0); /* pass */ +} + +__attribute__ ((noipa)) +void +smash (char *p, int i) +{ + p[i] = 42; +} + +__attribute__ ((optimize ("stack-protector-all"))) +int +main (void) +{ + char foo[255]; + + /* smash stack */ + for (int i = 0; i <= 400; i++) + smash (foo, i); + + return 1; +} + +/* { dg-final { scan-hidden "__stack_chk_guard" } } */ +/* { dg-final { scan-assembler "__stack_chk_guard\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOTPCREL" { target { ! ia32 } } } } */ + /* { dg-final { scan-assembler ".quad 3280087301477736604" { target { lp64 } } } } */ +/* { dg-final { scan-assembler "__stack_chk_guard@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOT\\(" { target ia32 } } } */ + /* { dg-final { scan-assembler ".long -584267481" { target { ! lp64 } } } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssp-global-2.c b/gcc/testsuite/gcc.target/i386/ssp-global-2.c new file mode 100644 index 00000000000..760991f82bf --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ssp-global-2.c @@ -0,0 +1,36 @@ +/* { dg-do run { target fstack_protector } } */ +/* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ + +#include <stdint.h> +#include <stdlib.h> + +#ifdef __LP64__ +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; +#else +uintptr_t __stack_chk_guard = 0xdd2cc927UL; +#endif + +void +__stack_chk_fail (void) +{ + exit (0); /* pass */ +} + +__attribute__ ((noipa)) +void +smash (char *p, int i) +{ + p[i] = 42; +} + +int +main (void) +{ + char foo[255]; + + /* smash stack */ + for (int i = 0; i <= 400; i++) + smash (foo, i); + + return 1; +} diff --git a/gcc/testsuite/gcc.target/i386/ssp-global-3.c b/gcc/testsuite/gcc.target/i386/ssp-global-3.c new file mode 100644 index 00000000000..b276e3f5833 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ssp-global-3.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target fstack_protector } } */ +/* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ + +extern char *__stack_chk_guard; /* { dg-error "conflicting types for '__stack_chk_guard';" } */ + +char +foo (void) +{ + return *__stack_chk_guard; +} diff --git a/gcc/testsuite/gcc.target/i386/ssp-global-4.c b/gcc/testsuite/gcc.target/i386/ssp-global-4.c new file mode 100644 index 00000000000..cf375b704f2 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ssp-global-4.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target fstack_protector } } */ +/* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ + +extern char __stack_chk_guard; /* { dg-error "conflicting types for '__stack_chk_guard';" } */ + +void +smash (char *p, int i) +{ + p[i] = 42; +} diff --git a/gcc/testsuite/gcc.target/i386/ssp-global-hidden-1.c b/gcc/testsuite/gcc.target/i386/ssp-global-hidden-1.c new file mode 100644 index 00000000000..c274983b9a6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ssp-global-hidden-1.c @@ -0,0 +1,49 @@ +/* { dg-do run { target { fstack_protector && fpic } } } */ +/* { dg-options "-O2 -fPIC -fstack-protector-all -mstack-protector-guard=global -save-temps" } */ + +#ifndef __stack_protection_guard_is_internal_symbol__ +# error "__stack_protection_guard_is_internal_symbol__ isn't defined" +#endif + +#include <stdint.h> +#include <stdlib.h> + +__attribute__ ((visibility ("hidden"))) +#ifdef __LP64__ +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; +#else +uintptr_t __stack_chk_guard = 0xdd2cc927UL; +#endif + +void +__stack_chk_fail (void) +{ + exit (0); /* pass */ +} + +__attribute__ ((noipa)) +void +smash (char *p, int i) +{ + p[i] = 42; +} + +int +main (void) +{ + char foo[255]; + + /* smash stack */ + for (int i = 0; i <= 400; i++) + smash (foo, i); + + return 1; +} + +/* { dg-final { scan-hidden "__stack_chk_guard" } } */ +/* { dg-final { scan-assembler "__stack_chk_guard\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOTPCREL" { target { ! ia32 } } } } */ + /* { dg-final { scan-assembler ".quad 3280087301477736604" { target { lp64 } } } } */ +/* { dg-final { scan-assembler "__stack_chk_guard@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOT\\(" { target ia32 } } } */ + /* { dg-final { scan-assembler ".long -584267481" { target { ! lp64 } } } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssp-global-hidden-2.c b/gcc/testsuite/gcc.target/i386/ssp-global-hidden-2.c new file mode 100644 index 00000000000..9fd3b1d00d4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ssp-global-hidden-2.c @@ -0,0 +1,20 @@ +/* { dg-do compile { target { fstack_protector && fpic } } } */ +/* { dg-options "-O2 -fPIC -fstack-protector-all -mstack-protector-guard=global" } */ + +#include <stdint.h> + +extern uintptr_t __stack_chk_guard; +__attribute__ ((visibility ("hidden"))) +extern uintptr_t __stack_chk_guard; + +void +smash (char *p, int i) +{ + p[i] = 42; +} + +/* { dg-final { scan-hidden "__stack_chk_guard" } } */ +/* { dg-final { scan-assembler "__stack_chk_guard\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOTPCREL" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler "__stack_chk_guard@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOT\\(" { target ia32 } } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssp-global-hidden-3.c b/gcc/testsuite/gcc.target/i386/ssp-global-hidden-3.c new file mode 100644 index 00000000000..73f89e3ef49 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ssp-global-hidden-3.c @@ -0,0 +1,50 @@ +/* { dg-do run { target { fstack_protector && fpic } } } */ +/* { dg-options "-O2 -fPIC -mstack-protector-guard=global -save-temps" } */ + +#ifndef __stack_protection_guard_is_internal_symbol__ +# error "__stack_protection_guard_is_internal_symbol__ isn't defined" +#endif + +#include <stdint.h> +#include <stdlib.h> + +__attribute__ ((visibility ("hidden"))) +#ifdef __LP64__ +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; +#else +uintptr_t __stack_chk_guard = 0xdd2cc927UL; +#endif + +void +__stack_chk_fail (void) +{ + exit (0); /* pass */ +} + +__attribute__ ((noipa)) +void +smash (char *p, int i) +{ + p[i] = 42; +} + +__attribute__ ((optimize ("stack-protector-all"))) +int +main (void) +{ + char foo[255]; + + /* smash stack */ + for (int i = 0; i <= 400; i++) + smash (foo, i); + + return 1; +} + +/* { dg-final { scan-hidden "__stack_chk_guard" } } */ +/* { dg-final { scan-assembler "__stack_chk_guard\\(%rip\\)" { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOTPCREL" { target { ! ia32 } } } } */ + /* { dg-final { scan-assembler ".quad 3280087301477736604" { target { lp64 } } } } */ +/* { dg-final { scan-assembler "__stack_chk_guard@GOTOFF" { target ia32 } } } */ +/* { dg-final { scan-assembler-not "__stack_chk_guard@GOT\\(" { target ia32 } } } */ + /* { dg-final { scan-assembler ".long -584267481" { target { ! lp64 } } } } */ diff --git a/gcc/testsuite/gcc.target/i386/ssp-global.c b/gcc/testsuite/gcc.target/i386/ssp-global.c index 85a288c781c..760991f82bf 100644 --- a/gcc/testsuite/gcc.target/i386/ssp-global.c +++ b/gcc/testsuite/gcc.target/i386/ssp-global.c @@ -1,12 +1,13 @@ /* { dg-do run { target fstack_protector } } */ /* { dg-options "-O2 -fstack-protector-all -mstack-protector-guard=global" } */ +#include <stdint.h> #include <stdlib.h> #ifdef __LP64__ -const unsigned long int __stack_chk_guard = 0x2d853605a4d9a09cUL; +uintptr_t __stack_chk_guard = 0x2d853605a4d9a09cUL; #else -const unsigned long int __stack_chk_guard = 0xdd2cc927UL; +uintptr_t __stack_chk_guard = 0xdd2cc927UL; #endif void -- 2.52.0
