summaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 38d8b97894c..3c7d08209f3 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -129,17 +129,15 @@ static long max_stack_depth_bytes = 100 * 1024L;
/*
* Stack base pointer -- initialized by PostmasterMain and inherited by
- * subprocesses. This is not static because old versions of PL/Java modify
- * it directly. Newer versions use set_stack_base(), but we want to stay
- * binary-compatible for the time being.
+ * subprocesses (but see also InitPostmasterChild).
*/
-char *stack_base_ptr = NULL;
+static char *stack_base_ptr = NULL;
/*
* On IA64 we also have to remember the register stack base.
*/
#if defined(__ia64__) || defined(__ia64)
-char *register_stack_base_ptr = NULL;
+static char *register_stack_base_ptr = NULL;
#endif
/*
@@ -3416,7 +3414,9 @@ ia64_get_bsp(void)
pg_stack_base_t
set_stack_base(void)
{
+#ifndef HAVE__BUILTIN_FRAME_ADDRESS
char stack_base;
+#endif
pg_stack_base_t old;
#if defined(__ia64__) || defined(__ia64)
@@ -3426,8 +3426,16 @@ set_stack_base(void)
old = stack_base_ptr;
#endif
- /* Set up reference point for stack depth checking */
+ /*
+ * Set up reference point for stack depth checking. On recent gcc we use
+ * __builtin_frame_address() to avoid a warning about storing a local
+ * variable's address in a long-lived variable.
+ */
+#ifdef HAVE__BUILTIN_FRAME_ADDRESS
+ stack_base_ptr = __builtin_frame_address(0);
+#else
stack_base_ptr = &stack_base;
+#endif
#if defined(__ia64__) || defined(__ia64)
register_stack_base_ptr = ia64_get_bsp();
#endif