* config/i386/darwin.h (DWARF2_FRAME_REG_OUT): New.
authorGeoffrey Keating <geoffk@apple.com>
Tue, 21 Feb 2006 20:36:35 +0000 (20:36 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Tue, 21 Feb 2006 20:36:35 +0000 (20:36 +0000)
From-SVN: r111344

gcc/ChangeLog
gcc/config/i386/darwin.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/spbp.C [new file with mode: 0644]

index 1ef4b70253fbf050acba969bb28ff1cebe0db45d..69acf000f771e406241e75b4aa229505d21dd94b 100644 (file)
@@ -1,3 +1,7 @@
+2006-02-21  Geoffrey Keating  <geoffk@apple.com>
+
+       * config/i386/darwin.h (DWARF2_FRAME_REG_OUT): New.
+
 2006-02-21  Alexandre Oliva  <aoliva@redhat.com>
 
        * config/i386/sse.md (vec_extractv2df_1_sse): New.
index b9604e4c105c8a0b0c25f0d20f28842e791ece2d..c3f9407cde5830f9c371273858220002a1df048b 100644 (file)
@@ -157,8 +157,16 @@ extern void darwin_x86_file_end (void);
    register numbers for STABS.  Fortunately for 64-bit code the
    default and the standard are the same.  */
 #undef DBX_REGISTER_NUMBER
-#define DBX_REGISTER_NUMBER(n) (TARGET_64BIT                   \
-                               ? dbx64_register_map[n]         \
-                               : write_symbols == DWARF2_DEBUG \
-                               ? svr4_dbx_register_map[n]      \
-                               : dbx_register_map[n])
+#define DBX_REGISTER_NUMBER(n)                                         \
+  (TARGET_64BIT ? dbx64_register_map[n]                                \
+   : write_symbols == DWARF2_DEBUG ? svr4_dbx_register_map[n]  \
+   : dbx_register_map[n])
+
+/* Unfortunately, the 32-bit EH information also doesn't use the standard
+   DWARF register numbers.  */
+#define DWARF2_FRAME_REG_OUT(n, for_eh)                                        \
+  (! (for_eh) || write_symbols != DWARF2_DEBUG || TARGET_64BIT ? (n)   \
+   : (n) == 5 ? 4                                                      \
+   : (n) == 4 ? 5                                                      \
+   : (n) >= 11 && (n) <= 18 ? (n) + 1                                  \
+   : (n))
index 266489f94507e3980c037b41381cd65bdb692754..ff6a6dbd716f288e972247fbfbc23e1b32b8f960 100644 (file)
@@ -1,3 +1,7 @@
+2006-02-21  Geoffrey Keating  <geoffk@apple.com>
+
+       * g++.dg/eh/spbp.C: New.
+
 2006-02-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/26379
diff --git a/gcc/testsuite/g++.dg/eh/spbp.C b/gcc/testsuite/g++.dg/eh/spbp.C
new file mode 100644 (file)
index 0000000..d9d0130
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+/* { dg-options "-gdwarf-2" } */
+
+/* This was a bug on x86-darwin, where the register numbering for SP
+   and BP was swapped (it's easy to do because on that port it's
+   different for eh_frame and debug_frame).  */
+
+#include <stdlib.h>
+
+void f1(int t)
+{
+  char u[t];
+  throw 1;
+}
+
+int main()
+{
+  bool b = true;
+  try {
+    f1(100);
+  } catch (int x) {
+    if (b)
+      exit (0);
+  }
+  abort ();
+}