non-enable-llvm support in llvm-gcc-4.2 issue

There seems to be a bunch of code for making certain that gcc still works even if --enable-gcc isn’t used, so I’m assuming that it’s at least supposed to be a supported configuration, and hence this issue that I found should probably be looked at:

If you compile llvm-gcc-4.2 without --enable-gcc, and then try to compile the following program, you get a rather nasty RTL error.

void f() { try { throw; } catch (…) {} }

test.cpp: In function .void f().:
test.cpp:1: error: unrecognizable insn:
(insn 39 5 40 2 (set (reg:SI 107)
(UnKnown Unknown)) -1 (nil)
(nil))
test.cpp:1: internal compiler error: in extract_insn, at recog.c:2100

I managed to track this down to init_one_libfunc being broken. There’s some logic to try to divert an llvm_init_one_libfunc to the old implementation (via some #defines) when --emnable-llvm isn’t being used, but it doesn’t even have the right return type anymore and only seems to do half the old logic (the rest being in llvm_init_one_libfunnc now).

I’ve managed to fix it pretty easily with the following hack, but it really does feel like a hack:

diff --git a/gcc/expr.h b/gcc/expr.h
index 850e7af…265b550 100644
— a/gcc/expr.h
+++ b/gcc/expr.h
@@ -753,9 +753,6 @@ extern rtx init_one_libfunc (const char );
/
LLVM LOCAL begin /
/
Call this to initialize an optab function tree. */
extern tree llvm_init_one_libfunc (const char );
-#ifndef ENABLE_LLVM
-#define llvm_init_one_libfunc init_one_libfunc
-#endif
/
LLVM LOCAL end */

extern int vector_mode_valid_p (enum machine_mode);
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 06243c9…d5a1b19 100644
— a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5137,7 +5137,6 @@ init_intraclass_conv_libfuncs (convert_optab tab, const char *opname,

/* LLVM local begin */
-#undef llvm_init_one_libfunc
tree
llvm_init_one_libfunc (const char *name)
{

Sincerely,

Jay Freeman (saurik)
saurik@saurik.com
http://www.saurik.com/

Hi Jay, this should be fixed now (commit 48816). Can you
please check.

Ciao,

Duncan.