summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1996-10-03 17:49:35 +0000
committerjdp <jdp@FreeBSD.org>1996-10-03 17:49:35 +0000
commitb400b72e469a93b88555a568b89989a3fe8f3918 (patch)
tree37756f861451aa0a35128d1865b1e2285b2876c4 /contrib
parent5a3d59963e84a76fc6922009cb9032a42d5d0e88 (diff)
downloadFreeBSD-src-b400b72e469a93b88555a568b89989a3fe8f3918.zip
FreeBSD-src-b400b72e469a93b88555a568b89989a3fe8f3918.tar.gz
Fix a bug that caused incorrect PIC code to be generated for exceptions.
The symptom was an assembler warning "GOT relocation burb: `___EXCEPTION_TABLE__' should be global" followed (sometimes) by a core dump. The fix makes the compiler generate the correct GOTOFF addressing for that symbol, rather than the GOT addressing it was emitting before. Warning: There is still at least one serious bug in the i386 exception code for PIC. The exception code that is generated clobbers the GOT register (%ebx) and then tries to use it later. That leads to core dumps at program execution time. I know where the problem is, but I do not have a fix for it at this time. Until it is fixed, exceptions will not work in PIC code. This is a general problem for all i386 platforms; it is not specific to FreeBSD.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/gcc/config/i386/i386.h16
-rw-r--r--contrib/gcc/cp/except.c8
2 files changed, 23 insertions, 1 deletions
diff --git a/contrib/gcc/config/i386/i386.h b/contrib/gcc/config/i386/i386.h
index b00b0e5..efc956a 100644
--- a/contrib/gcc/config/i386/i386.h
+++ b/contrib/gcc/config/i386/i386.h
@@ -1286,6 +1286,22 @@ do \
} \
while (0)
+/* Define this macro if a SYMBOL_REF representing a non-global
+ address must be marked specially. This is called for
+ compiler-generated local symbols, such as "__EXCEPTION_TABLE__".
+
+ On i386, if using PIC, we use this to set the rtx's
+ SYMBOL_REF_FLAG, so that we may access it directly as
+ an offset from the GOT register. */
+
+#define MARK_LOCAL_ADDRESS(X) \
+do \
+ { \
+ if (flag_pic && GET_CODE (X) == SYMBOL_REF) \
+ SYMBOL_REF_FLAG (X) = 1; \
+ } \
+while (0)
+
/* Initialize data used by insn expanders. This is called from
init_emit, once for each function, before code is generated.
For 386, clear stack slot assignments remembered from previous
diff --git a/contrib/gcc/cp/except.c b/contrib/gcc/cp/except.c
index 51577f8..4443b98 100644
--- a/contrib/gcc/cp/except.c
+++ b/contrib/gcc/cp/except.c
@@ -1614,9 +1614,15 @@ emit_exception_table ()
void
register_exception_table ()
{
+ rtx addr = gen_rtx (SYMBOL_REF, Pmode, "__EXCEPTION_TABLE__");
+
+#ifdef MARK_LOCAL_ADDRESS
+ MARK_LOCAL_ADDRESS(addr);
+#endif
+
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__register_exceptions"), 0,
VOIDmode, 1,
- gen_rtx (SYMBOL_REF, Pmode, "__EXCEPTION_TABLE__"),
+ addr,
Pmode);
}
OpenPOWER on IntegriCloud