This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.17-156-g7c1e01a


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  7c1e01aabcec96173b6e276e67322125ec90dff7 (commit)
      from  ab087e0aa4bd9f12a73ca0b248f02d8a22d49e46 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=7c1e01aabcec96173b6e276e67322125ec90dff7

commit 7c1e01aabcec96173b6e276e67322125ec90dff7
Author: David S. Miller <davem@davemloft.net>
Date:   Mon Jan 21 14:13:04 2013 -0800

    Use libgcc unwinder for sparc backtraces, if available.
    
    	* sysdeps/sparc/backtrace.c: New file.
    	* sysdeps/sparc/sparc32/backtrace.h: New file.
    	* sysdeps/sparc/sparc32/sparcv9/backtrace.h: New file.
    	* sysdeps/sparc/sparc64/backtrace.h: New file.
    	* sysdeps/sparc/sparc64/backtrace.c: Delete.
    	* sysdeps/sparc/Makefile (CFLAGS-backtrace.c): Add
    	-funwind-tables.

diff --git a/ChangeLog b/ChangeLog
index 9b53463..7d8eaf7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-01-21  David S. Miller  <davem@davemloft.net>
+
+	* sysdeps/sparc/backtrace.c: New file.
+	* sysdeps/sparc/sparc32/backtrace.h: New file.
+	* sysdeps/sparc/sparc32/sparcv9/backtrace.h: New file.
+	* sysdeps/sparc/sparc64/backtrace.h: New file.
+	* sysdeps/sparc/sparc64/backtrace.c: Delete.
+	* sysdeps/sparc/Makefile (CFLAGS-backtrace.c): Add
+	-funwind-tables.
+
 2013-01-21  Andreas Schwab  <schwab@suse.de>
 
 	[BZ #15020]
diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile
index 3f0c096..31aaeae 100644
--- a/sysdeps/sparc/Makefile
+++ b/sysdeps/sparc/Makefile
@@ -3,6 +3,10 @@ long-double-fcts = yes
 
 pie-ccflag = -fPIE
 
+ifeq ($(subdir),debug)
+CFLAGS-backtrace.c += -funwind-tables
+endif
+
 ifeq ($(subdir),gmon)
 sysdep_routines += sparc-mcount
 endif
diff --git a/sysdeps/sparc/backtrace.c b/sysdeps/sparc/backtrace.c
new file mode 100644
index 0000000..89f976b
--- /dev/null
+++ b/sysdeps/sparc/backtrace.c
@@ -0,0 +1,163 @@
+/* Return backtrace of current program state.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David S. Miller <davem@davemloft.net>
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#include <execinfo.h>
+#include <stddef.h>
+#include <bp-checks.h>
+#include <sysdep.h>
+#include <sys/trap.h>
+#include <dlfcn.h>
+#include <unwind.h>
+#include <backtrace.h>
+
+struct layout
+{
+  unsigned long locals[8];
+  unsigned long ins[6];
+  unsigned long next;
+  void *__unbounded return_address;
+};
+
+struct trace_arg
+{
+  void **array;
+  _Unwind_Word cfa;
+  int cnt;
+  int size;
+};
+
+#ifdef SHARED
+static _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *);
+static _Unwind_Ptr (*unwind_getip) (struct _Unwind_Context *);
+static _Unwind_Word (*unwind_getcfa) (struct _Unwind_Context *);
+static void *libgcc_handle;
+
+/* Dummy version in case libgcc_s does not contain the real code.  */
+static _Unwind_Word
+dummy_getcfa (struct _Unwind_Context *ctx __attribute__ ((unused)))
+{
+  return 0;
+}
+
+static void
+init (void)
+{
+  libgcc_handle = __libc_dlopen ("libgcc_s.so.1");
+
+  if (libgcc_handle == NULL)
+    return;
+
+  unwind_backtrace = __libc_dlsym (libgcc_handle, "_Unwind_Backtrace");
+  unwind_getip = __libc_dlsym (libgcc_handle, "_Unwind_GetIP");
+  if (unwind_getip == NULL)
+    unwind_backtrace = NULL;
+  unwind_getcfa = (__libc_dlsym (libgcc_handle, "_Unwind_GetCFA")
+		  ?: dummy_getcfa);
+}
+#else
+# define unwind_backtrace _Unwind_Backtrace
+# define unwind_getip _Unwind_GetIP
+# define unwind_getcfa _Unwind_GetCFA
+#endif
+
+static _Unwind_Reason_Code
+backtrace_helper (struct _Unwind_Context *ctx, void *a)
+{
+  struct trace_arg *arg = a;
+  _Unwind_Ptr ip;
+
+  /* We are first called with address in the __backtrace function.
+     Skip it.  */
+  if (arg->cnt != -1)
+    {
+      ip = unwind_getip (ctx);
+      arg->array[arg->cnt] = (void *) ip;
+
+      /* Check whether we make any progress.  */
+      _Unwind_Word cfa = unwind_getcfa (ctx);
+
+      if (arg->cnt > 0 && arg->array[arg->cnt - 1] == arg->array[arg->cnt]
+	 && cfa == arg->cfa)
+       return _URC_END_OF_STACK;
+      arg->cfa = cfa;
+    }
+  if (++arg->cnt == arg->size)
+    return _URC_END_OF_STACK;
+  return _URC_NO_REASON;
+}
+
+int
+__backtrace (void **array, int size)
+{
+  struct trace_arg arg = { .array = array, .cfa = 0, .size = size, .cnt = -1 };
+  bool use_unwinder;
+  int count;
+
+  if (!size)
+    return 0;
+
+  use_unwinder = true;
+#ifdef SHARED
+  __libc_once_define (static, once);
+
+  __libc_once (once, init);
+  if (unwind_backtrace == NULL)
+    use_unwinder = false;
+#endif
+
+  if (use_unwinder == false)
+    {
+      struct layout *current;
+      unsigned long fp, i7;
+
+      asm volatile ("mov %%fp, %0" : "=r"(fp));
+      asm volatile ("mov %%i7, %0" : "=r"(i7));
+      current = (struct layout *__unbounded) (fp + BACKTRACE_STACK_BIAS);
+      current = BOUNDED_1 (current);
+
+      array[0] = (void *__unbounded) i7;
+
+      if (size == 1)
+	return 1;
+
+      backtrace_flush_register_windows();
+      for (count = 1; count < size; count++)
+	{
+	  array[count] = current->return_address;
+	  if (!current->next)
+	    break;
+	  current = (struct layout *__unbounded) (current->next
+						  + BACKTRACE_STACK_BIAS);
+	  current = BOUNDED_1 (current);
+	}
+    }
+  else
+    {
+      unwind_backtrace (backtrace_helper, &arg);
+
+      /* _Unwind_Backtrace seems to put NULL address above
+	 _start.  Fix it up here.  */
+      if (arg.cnt > 1 && arg.array[arg.cnt - 1] == NULL)
+	--arg.cnt;
+      count = arg.cnt != -1 ? arg.cnt : 0;
+    }
+  return count;
+}
+weak_alias (__backtrace, backtrace)
+libc_hidden_def (__backtrace)
diff --git a/sysdeps/sparc/sparc32/backtrace.h b/sysdeps/sparc/sparc32/backtrace.h
new file mode 100644
index 0000000..089f8b4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/backtrace.h
@@ -0,0 +1,7 @@
+/* Private macros for guiding the backtrace implementation, sparc32
+   version.  */
+
+#define backtrace_flush_register_windows() \
+	asm volatile ("ta %0" : : "i" (ST_FLUSH_WINDOWS))
+
+#define BACKTRACE_STACK_BIAS	0
diff --git a/sysdeps/sparc/sparc32/sparcv9/backtrace.h b/sysdeps/sparc/sparc32/sparcv9/backtrace.h
new file mode 100644
index 0000000..8d6c756
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/backtrace.h
@@ -0,0 +1,7 @@
+/* Private macros for guiding the backtrace implementation, sparc32 v9
+   version.  */
+
+#define backtrace_flush_register_windows() \
+	asm volatile ("flushw")
+
+#define BACKTRACE_STACK_BIAS	0
diff --git a/sysdeps/sparc/sparc64/backtrace.c b/sysdeps/sparc/sparc64/backtrace.c
deleted file mode 100644
index 230ca1f..0000000
--- a/sysdeps/sparc/sparc64/backtrace.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Return backtrace of current program state.
-   Copyright (C) 2008-2013 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David S. Miller <davem@davemloft.net>
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, see <http://www.gnu.org/licenses/>.  */
-
-#include <execinfo.h>
-#include <stddef.h>
-#include <bp-checks.h>
-#include <sysdep.h>
-
-struct layout
-{
-  unsigned long locals[8];
-  unsigned long ins[6];
-  unsigned long next;
-  void *__unbounded return_address;
-};
-
-int
-__backtrace (void **array, int size)
-{
-  struct layout *current;
-  unsigned long fp;
-  int count;
-
-  asm volatile ("flushw");
-  asm volatile ("mov %%fp, %0" : "=r"(fp));
-  current = (struct layout *__unbounded) (fp + STACK_BIAS);
-  current = BOUNDED_1 (current);
-
-  for (count = 0; count < size; count++)
-    {
-      array[count] = current->return_address;
-      if (!current->next)
-	break;
-      current = (struct layout *__unbounded) (current->next + STACK_BIAS);
-      current = BOUNDED_1 (current);
-    }
-
-  return count;
-}
-weak_alias (__backtrace, backtrace)
-libc_hidden_def (__backtrace)
diff --git a/sysdeps/sparc/sparc64/backtrace.h b/sysdeps/sparc/sparc64/backtrace.h
new file mode 100644
index 0000000..b9c95c5
--- /dev/null
+++ b/sysdeps/sparc/sparc64/backtrace.h
@@ -0,0 +1,7 @@
+/* Private macros for guiding the backtrace implementation, sparc64
+   version.  */
+
+#define backtrace_flush_register_windows() \
+	asm volatile ("flushw")
+
+#define BACKTRACE_STACK_BIAS	STACK_BIAS

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                 |   10 ++
 sysdeps/sparc/Makefile                    |    4 +
 sysdeps/sparc/backtrace.c                 |  163 +++++++++++++++++++++++++++++
 sysdeps/sparc/sparc32/backtrace.h         |    7 ++
 sysdeps/sparc/sparc32/sparcv9/backtrace.h |    7 ++
 sysdeps/sparc/sparc64/backtrace.c         |   57 ----------
 sysdeps/sparc/sparc64/backtrace.h         |    7 ++
 7 files changed, 198 insertions(+), 57 deletions(-)
 create mode 100644 sysdeps/sparc/backtrace.c
 create mode 100644 sysdeps/sparc/sparc32/backtrace.h
 create mode 100644 sysdeps/sparc/sparc32/sparcv9/backtrace.h
 delete mode 100644 sysdeps/sparc/sparc64/backtrace.c
 create mode 100644 sysdeps/sparc/sparc64/backtrace.h


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]