Blame SOURCES/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch

132741
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
132741
From: Jan Kratochvil <jan.kratochvil@redhat.com>
132741
Date: Fri, 27 Oct 2017 21:07:50 +0200
132741
Subject: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch
132741
132741
;; Support TLS symbols (+`errno' suggestion if no pthread is found) (BZ 185337).
132741
;;=push+jan: It should be replaced by Infinity project.
132741
132741
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=185337
132741
132741
2008-02-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
132741
132741
	Port to GDB-6.8pre.
132741
132741
currently for trivial nonthreaded helloworld with no debug info up to -ggdb2 you
132741
will get:
132741
        (gdb) p errno
132741
        [some error]
132741
132741
* with -ggdb2 and less "errno" in fact does not exist anywhere as it was
132741
  compiled to "(*__errno_location ())" and the macro definition is not present.
132741
  Unfortunately gdb will find the TLS symbol and it will try to access it but
132741
  as the program has been compiled without -lpthread the TLS base register
132741
  (%gs on i386) is not setup and it will result in:
132741
        Cannot access memory at address 0x8
132741
132741
Attached suggestion patch how to deal with the most common "errno" symbol
132741
for the most common under-ggdb3 compiled programs.
132741
132741
Original patch hooked into target_translate_tls_address.  But its inferior
132741
call invalidates `struct frame *' in the callers - RH BZ 690908.
132741
132741
https://bugzilla.redhat.com/show_bug.cgi?id=1166549
132741
132741
2007-11-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
132741
132741
	* ./gdb/dwarf2read.c (read_partial_die, dwarf2_linkage_name): Prefer
132741
	DW_AT_MIPS_linkage_name over DW_AT_name now only for non-C.
132741
132741
glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
132741
  <81a2>     DW_AT_name        : (indirect string, offset: 0x280e): __errno_location
132741
  <81a8>     DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location
132741
132741
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
132741
--- a/gdb/printcmd.c
132741
+++ b/gdb/printcmd.c
132741
@@ -1210,6 +1210,10 @@ print_command_1 (const char *args, int voidprint)
132741
 
132741
   if (exp != nullptr && *exp)
132741
     {
132741
+      /* '*((int *(*) (void)) __errno_location) ()' is incompatible with
132741
+	 function descriptors.  */
132741
+      if (target_has_execution && strcmp (exp, "errno") == 0)
132741
+	exp = "*(*(int *(*)(void)) __errno_location) ()";
132741
       expression_up expr = parse_expression (exp);
132741
       val = evaluate_expression (expr.get ());
132741
     }
132741
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.c b/gdb/testsuite/gdb.dwarf2/dw2-errno.c
132741
new file mode 100644
132741
--- /dev/null
132741
+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.c
132741
@@ -0,0 +1,28 @@
132741
+/* This testcase is part of GDB, the GNU debugger.
132741
+
132741
+   Copyright 2005, 2007 Free Software Foundation, Inc.
132741
+
132741
+   This program is free software; you can redistribute it and/or modify
132741
+   it under the terms of the GNU General Public License as published by
132741
+   the Free Software Foundation; either version 3 of the License, or
132741
+   (at your option) any later version.
132741
+
132741
+   This program is distributed in the hope that it will be useful,
132741
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
132741
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
132741
+   GNU General Public License for more details.
132741
+
132741
+   You should have received a copy of the GNU General Public License
132741
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
132741
+
132741
+   Please email any bugs, comments, and/or additions to this file to:
132741
+   bug-gdb@prep.ai.mit.edu  */
132741
+
132741
+#include <errno.h>
132741
+
132741
+int main()
132741
+{
132741
+  errno = 42;
132741
+
132741
+  return 0;	/* breakpoint */
132741
+}
132741
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
132741
new file mode 100644
132741
--- /dev/null
132741
+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp
132741
@@ -0,0 +1,60 @@
132741
+# Copyright 2007 Free Software Foundation, Inc.
132741
+
132741
+# This program is free software; you can redistribute it and/or modify
132741
+# it under the terms of the GNU General Public License as published by
132741
+# the Free Software Foundation; either version 3 of the License, or
132741
+# (at your option) any later version.
132741
+#
132741
+# This program is distributed in the hope that it will be useful,
132741
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
132741
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
132741
+# GNU General Public License for more details.
132741
+#
132741
+# You should have received a copy of the GNU General Public License
132741
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
132741
+
132741
+set testfile dw2-errno
132741
+set srcfile ${testfile}.c
132741
+set binfile [standard_output_file ${testfile}]
132741
+
132741
+proc prep {} {
132741
+    global srcdir subdir binfile
132741
+    gdb_exit
132741
+    gdb_start
132741
+    gdb_reinitialize_dir $srcdir/$subdir
132741
+    gdb_load ${binfile}
132741
+
132741
+    runto_main
132741
+
132741
+    gdb_breakpoint [gdb_get_line_number "breakpoint"]
132741
+    gdb_continue_to_breakpoint "breakpoint"
132741
+}
132741
+
132741
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } {
132741
+    untested "Couldn't compile test program"
132741
+    return -1
132741
+}
132741
+prep
132741
+gdb_test "print errno" ".* = 42" "errno with macros=N threads=N"
132741
+
132741
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } {
132741
+    untested "Couldn't compile test program"
132741
+    return -1
132741
+}
132741
+prep
132741
+gdb_test "print errno" ".* = 42" "errno with macros=Y threads=N"
132741
+
132741
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } {
132741
+    return -1
132741
+}
132741
+prep
132741
+gdb_test "print errno" ".* = 42" "errno with macros=N threads=Y"
132741
+
132741
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } {
132741
+    return -1
132741
+}
132741
+prep
132741
+gdb_test "print errno" ".* = 42" "errno with macros=Y threads=Y"
132741
+
132741
+# TODO: Test the error on resolving ERRNO with only libc loaded.
132741
+# Just how to find the current libc filename?
132741
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.c b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c
132741
new file mode 100644
132741
--- /dev/null
132741
+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c
132741
@@ -0,0 +1,28 @@
132741
+/* This testcase is part of GDB, the GNU debugger.
132741
+
132741
+   Copyright 2005, 2007 Free Software Foundation, Inc.
132741
+
132741
+   This program is free software; you can redistribute it and/or modify
132741
+   it under the terms of the GNU General Public License as published by
132741
+   the Free Software Foundation; either version 3 of the License, or
132741
+   (at your option) any later version.
132741
+
132741
+   This program is distributed in the hope that it will be useful,
132741
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
132741
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
132741
+   GNU General Public License for more details.
132741
+
132741
+   You should have received a copy of the GNU General Public License
132741
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
132741
+
132741
+   Please email any bugs, comments, and/or additions to this file to:
132741
+   bug-gdb@prep.ai.mit.edu  */
132741
+
132741
+#include <errno.h>
132741
+
132741
+int main()
132741
+{
132741
+  errno = 42;
132741
+
132741
+  return 0;	/* breakpoint */
132741
+}
132741
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp
132741
new file mode 100644
132741
--- /dev/null
132741
+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp
132741
@@ -0,0 +1,71 @@
132741
+# Copyright 2007 Free Software Foundation, Inc.
132741
+
132741
+# This program is free software; you can redistribute it and/or modify
132741
+# it under the terms of the GNU General Public License as published by
132741
+# the Free Software Foundation; either version 3 of the License, or
132741
+# (at your option) any later version.
132741
+#
132741
+# This program is distributed in the hope that it will be useful,
132741
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
132741
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
132741
+# GNU General Public License for more details.
132741
+#
132741
+# You should have received a copy of the GNU General Public License
132741
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
132741
+
132741
+set testfile dw2-errno2
132741
+set srcfile ${testfile}.c
132741
+set binfile [standard_output_file ${testfile}]
132741
+
132741
+proc prep { message {do_xfail 0} } { with_test_prefix $message {
132741
+    global srcdir subdir binfile variant
132741
+    gdb_exit
132741
+    gdb_start
132741
+    gdb_reinitialize_dir $srcdir/$subdir
132741
+    gdb_load ${binfile}${variant}
132741
+
132741
+    runto_main
132741
+
132741
+    gdb_breakpoint [gdb_get_line_number "breakpoint"]
132741
+    gdb_continue_to_breakpoint "breakpoint"
132741
+
132741
+    gdb_test "gcore ${binfile}${variant}.core" "\r\nSaved corefile .*" "gcore $variant"
132741
+
132741
+    gdb_test "print errno" ".* = 42"
132741
+
132741
+    gdb_test "kill" ".*" "kill" {Kill the program being debugged\? \(y or n\) } "y"
132741
+    gdb_test "core-file ${binfile}${variant}.core" "\r\nCore was generated by .*" "core-file"
132741
+    if $do_xfail {
132741
+	setup_xfail "*-*-*"
132741
+    }
132741
+    gdb_test "print (int) errno" ".* = 42" "print errno for core"
132741
+}}
132741
+
132741
+set variant g2thrN
132741
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } {
132741
+    untested "Couldn't compile test program"
132741
+    return -1
132741
+}
132741
+prep "macros=N threads=N" 1
132741
+
132741
+set variant g3thrN
132741
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } {
132741
+    untested "Couldn't compile test program"
132741
+    return -1
132741
+}
132741
+prep "macros=Y threads=N" 1
132741
+
132741
+set variant g2thrY
132741
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } {
132741
+    return -1
132741
+}
132741
+prep "macros=N threads=Y"
132741
+
132741
+set variant g3thrY
132741
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } {
132741
+    return -1
132741
+}
132741
+prep "macros=Y threads=Y" 1
132741
+
132741
+# TODO: Test the error on resolving ERRNO with only libc loaded.
132741
+# Just how to find the current libc filename?