Author: asl Date: Sun Jul 29 11:46:07 2007 New Revision: 40580 URL: http://llvm.org/viewvc/llvm-project?rev=40580&view=rev Log: Unbreak C++ FE. libstdc++ can be compiled now and even tests from llvm-testsuite passed!
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp llvm-gcc-4.2/trunk/gcc/toplev.c Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=40580&r1=40579&r2=40580&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Sun Jul 29 11:46:07 2007 @@ -69,6 +69,13 @@ #define ITANIUM_STYLE_EXCEPTIONS +// Check for GCC bug 17347: C++ FE sometimes creates bogus ctor trees +// which we should throw out +#define BOGUS_CTOR(exp) \ + (DECL_INITIAL(exp) && \ + TREE_CODE(DECL_INITIAL(exp)) == CONSTRUCTOR && \ + !TREE_TYPE(DECL_INITIAL(exp))) + //===----------------------------------------------------------------------===// // Matching LLVM Values with GCC DECL trees //===----------------------------------------------------------------------===// @@ -5106,7 +5113,9 @@ // If this is an aggregate, emit it to LLVM now. GCC happens to // get this case right by forcing the initializer into memory. if (TREE_CODE(exp) == CONST_DECL || TREE_CODE(exp) == VAR_DECL) { - if ((DECL_INITIAL(exp) || !TREE_PUBLIC(exp)) && GV->isDeclaration()) { + if ((DECL_INITIAL(exp) || !TREE_PUBLIC(exp)) && !DECL_EXTERNAL(exp) && + GV->isDeclaration() && + !BOGUS_CTOR(exp)) { emit_global_to_llvm(exp); Decl = DECL_LLVM(exp); // Decl could have change if it changed type. } @@ -6224,7 +6233,9 @@ // If this is an aggregate, emit it to LLVM now. GCC happens to // get this case right by forcing the initializer into memory. if (TREE_CODE(exp) == CONST_DECL || TREE_CODE(exp) == VAR_DECL) { - if ((DECL_INITIAL(exp) || !TREE_PUBLIC(exp)) && Val->isDeclaration()) { + if ((DECL_INITIAL(exp) || !TREE_PUBLIC(exp)) && !DECL_EXTERNAL(exp) && + Val->isDeclaration() && + !BOGUS_CTOR(exp)) { emit_global_to_llvm(exp); // Decl could have change if it changed type. Val = cast<GlobalValue>(DECL_LLVM(exp)); Modified: llvm-gcc-4.2/trunk/gcc/toplev.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/toplev.c?rev=40580&r1=40579&r2=40580&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/toplev.c (original) +++ llvm-gcc-4.2/trunk/gcc/toplev.c Sun Jul 29 11:46:07 2007 @@ -2135,6 +2135,7 @@ /* LLVM LOCAL begin */ #ifdef ENABLE_LLVM llvm_lang_dependent_init(name); + init_eh(); return 1; /* don't initialize the RTL backend */ #endif /* LLVM LOCAL end */ _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits