From 87f11ab41bea00c40b4d1347b296d91dd7cf7068 Mon Sep 17 00:00:00 2001 From: John Polstra Date: Thu, 3 Oct 1996 17:49:35 +0000 Subject: [PATCH] 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. --- contrib/gcc/config/i386/i386.h | 16 ++++++++++++++++ contrib/gcc/cp/except.c | 8 +++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/contrib/gcc/config/i386/i386.h b/contrib/gcc/config/i386/i386.h index b00b0e509c5..efc956a52a6 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 51577f85afa..4443b98abba 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); }