From cd9cbfcd140628213519f7975a29113ca3b43179 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 5 Sep 2008 08:43:54 +0000 Subject: [PATCH] 4.3.2-2 --- .cvsignore | 2 +- gcc43-fortran-debug1.patch | 739 ------------------------- gcc43-fortran-debug10.patch | 457 ---------------- gcc43-fortran-debug11.patch | 73 --- gcc43-fortran-debug2.patch | 1010 ----------------------------------- gcc43-fortran-debug3.patch | 82 --- gcc43-fortran-debug4.patch | 112 ---- gcc43-fortran-debug5.patch | 91 ---- gcc43-fortran-debug6.patch | 17 - gcc43-fortran-debug7.patch | 82 --- gcc43-fortran-debug8.patch | 48 -- gcc43-fortran-debug9.patch | 144 ----- gcc43-pr37189.patch | 117 ++++ gcc43-pr37248.patch | 522 ------------------ gcc43-x86_64-va_start.patch | 355 ++++++++++++ gcc43.spec | 174 +++--- sources | 2 +- 17 files changed, 572 insertions(+), 3455 deletions(-) delete mode 100644 gcc43-fortran-debug1.patch delete mode 100644 gcc43-fortran-debug10.patch delete mode 100644 gcc43-fortran-debug11.patch delete mode 100644 gcc43-fortran-debug2.patch delete mode 100644 gcc43-fortran-debug3.patch delete mode 100644 gcc43-fortran-debug4.patch delete mode 100644 gcc43-fortran-debug5.patch delete mode 100644 gcc43-fortran-debug6.patch delete mode 100644 gcc43-fortran-debug7.patch delete mode 100644 gcc43-fortran-debug8.patch delete mode 100644 gcc43-fortran-debug9.patch create mode 100644 gcc43-pr37189.patch delete mode 100644 gcc43-pr37248.patch create mode 100644 gcc43-x86_64-va_start.patch diff --git a/.cvsignore b/.cvsignore index 0435ab0..9721a88 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,2 +1,2 @@ -gcc-4.3.2-20080829.tar.bz2 +gcc-4.3.2-20080905.tar.bz2 fastjar-0.95.tar.gz diff --git a/gcc43-fortran-debug1.patch b/gcc43-fortran-debug1.patch deleted file mode 100644 index e2718a7..0000000 --- a/gcc43-fortran-debug1.patch +++ /dev/null @@ -1,739 +0,0 @@ -2008-05-07 Jakub Jelinek - - PR debug/35896 - * dwarf2out.c (dw_expand_expr, common_check): Removed. - (fortran_common): New function. - (gen_variable_die): Call fortran_common instead of common_check, - adjust for it returning tree instead of rtx. Formatting. - -2008-04-26 George Helffrich - - PR fortran/35892 - PR fortran/35154 - * trans-common.c (create_common): Add decl to function - chain (if inside one) to preserve identifier scope in debug output. - - * gfortran.dg/debug/pr35154-stabs.f: New test case for - .stabs functionality. - * gfortran.dg/debug/pr35154-dwarf2.f: New test case for - DWARF functionality. - -2008-04-18 Jerry DeLisle - - PR fortran/35724 - * trans-common.c (create_common): Revert patch causing regression. - -2008-04-01 George Helffrich - - PR fortran/PR35154, fortran/PR23057 - * fortran/trans-common.c (create_common): Add decl to function - chain to preserve identifier scope in debug output. - - * dbxout.c: Emit .stabs debug info for Fortran COMMON block - variables as base symbol name + offset using N_BCOMM/N_ECOMM. - (is_fortran, dbxout_common_name, dbxout_common_check): New functions. - (dbxout_symbol_location): Transform N_LCSYM to N_GSYM for storage - in common. - (dbxout_syms): Check for COMMON-based symbol and wrap in - N_BCOMM/N_ECOMM stab bracket, including as many symbols as possible - in bracket for efficiency. - - * dwarf2out.c: Emit DWARF debug info for Fortran COMMON block - using DW_TAG_common_block + member offset. - (add_pubname_string): New function. - (dw_expand_expr): New function to find block name and offset for - COMMON var. - (common_check): New function to check whether symbol in Fortran COMMON. - (gen_variable_die): If COMMON, use DW_TAG_common_block. - - * testsuite/gcc.dg/debug/pr35154.c: New test to check that non-Fortran - use of common is unchanged. - - * testsuite/lib/gfortran-dg.exp: New harness to compile Fortran progs - with all combinations of debug options available on target. - * testsuite/gfortran.dg/debug/debug.exp: Ditto. - * testsuite/gfortran.dg/debug/trivial.f: Ditto. - ---- gcc/dbxout.c (revision 133800) -+++ gcc/dbxout.c (revision 133801) -@@ -322,10 +322,13 @@ static void dbxout_type_methods (tree); - static void dbxout_range_type (tree); - static void dbxout_type (tree, int); - static bool print_int_cst_bounds_in_octal_p (tree); -+static bool is_fortran (void); - static void dbxout_type_name (tree); - static void dbxout_class_name_qualifiers (tree); - static int dbxout_symbol_location (tree, tree, const char *, rtx); - static void dbxout_symbol_name (tree, const char *, int); -+static void dbxout_common_name (tree, const char *, STAB_CODE_TYPE); -+static const char *dbxout_common_check (tree, int *); - static void dbxout_global_decl (tree); - static void dbxout_type_decl (tree, int); - static void dbxout_handle_pch (unsigned); -@@ -973,6 +976,14 @@ get_lang_number (void) - - } - -+static bool -+is_fortran (void) -+{ -+ unsigned int lang = get_lang_number (); -+ -+ return (lang == N_SO_FORTRAN) || (lang == N_SO_FORTRAN90); -+} -+ - /* At the beginning of compilation, start writing the symbol table. - Initialize `typevec' and output the standard data types of C. */ - -@@ -2868,8 +2879,15 @@ dbxout_symbol_location (tree decl, tree - { - if (TREE_PUBLIC (decl)) - { -+ int offs; - letter = 'G'; - code = N_GSYM; -+ if (NULL != dbxout_common_check (decl, &offs)) -+ { -+ letter = 'V'; -+ addr = 0; -+ number = offs; -+ } - } - else - { -@@ -2915,7 +2933,17 @@ dbxout_symbol_location (tree decl, tree - if (DECL_INITIAL (decl) == 0 - || (!strcmp (lang_hooks.name, "GNU C++") - && DECL_INITIAL (decl) == error_mark_node)) -- code = N_LCSYM; -+ { -+ int offs; -+ code = N_LCSYM; -+ if (NULL != dbxout_common_check (decl, &offs)) -+ { -+ addr = 0; -+ number = offs; -+ letter = 'V'; -+ code = N_GSYM; -+ } -+ } - else if (DECL_IN_TEXT_SECTION (decl)) - /* This is not quite right, but it's the closest - of all the codes that Unix defines. */ -@@ -3004,9 +3032,17 @@ dbxout_symbol_location (tree decl, tree - variable, thereby avoiding the need for a register. In such - cases we're forced to lie to debuggers and tell them that - this variable was itself `static'. */ -+ int offs; - code = N_LCSYM; - letter = 'V'; -- addr = XEXP (XEXP (home, 0), 0); -+ if (NULL == dbxout_common_check (decl, &offs)) -+ addr = XEXP (XEXP (home, 0), 0); -+ else -+ { -+ addr = 0; -+ number = offs; -+ code = N_GSYM; -+ } - } - else if (GET_CODE (home) == CONCAT) - { -@@ -3091,6 +3127,115 @@ dbxout_symbol_name (tree decl, const cha - stabstr_C (letter); - } - -+ -+/* Output the common block name for DECL in a stabs. -+ -+ Symbols in global common (.comm) get wrapped with an N_BCOMM/N_ECOMM pair -+ around each group of symbols in the same .comm area. The N_GSYM stabs -+ that are emitted only contain the offset in the common area. This routine -+ emits the N_BCOMM and N_ECOMM stabs. */ -+ -+static void -+dbxout_common_name (tree decl, const char *name, STAB_CODE_TYPE op) -+{ -+ dbxout_begin_complex_stabs (); -+ stabstr_S (name); -+ dbxout_finish_complex_stabs (decl, op, NULL_RTX, NULL, 0); -+} -+ -+/* Check decl to determine whether it is a VAR_DECL destined for storage in a -+ common area. If it is, the return value will be a non-null string giving -+ the name of the common storage block it will go into. If non-null, the -+ value is the offset into the common block for that symbol's storage. */ -+ -+static const char * -+dbxout_common_check (tree decl, int *value) -+{ -+ rtx home; -+ rtx sym_addr; -+ const char *name = NULL; -+ -+ /* If the decl isn't a VAR_DECL, or if it isn't public or static, or if -+ it does not have a value (the offset into the common area), or if it -+ is thread local (as opposed to global) then it isn't common, and shouldn't -+ be handled as such. -+ -+ ??? DECL_THREAD_LOCAL_P check prevents problems with improper .stabs -+ for thread-local symbols. Can be handled via same mechanism as used -+ in dwarf2out.c. */ -+ if (TREE_CODE (decl) != VAR_DECL -+ || !TREE_PUBLIC(decl) -+ || !TREE_STATIC(decl) -+ || !DECL_HAS_VALUE_EXPR_P(decl) -+ || DECL_THREAD_LOCAL_P (decl) -+ || !is_fortran ()) -+ return NULL; -+ -+ home = DECL_RTL (decl); -+ if (home == NULL_RTX || GET_CODE (home) != MEM) -+ return NULL; -+ -+ sym_addr = dbxout_expand_expr (DECL_VALUE_EXPR (decl)); -+ if (sym_addr == NULL_RTX || GET_CODE (sym_addr) != MEM) -+ return NULL; -+ -+ sym_addr = XEXP (sym_addr, 0); -+ if (GET_CODE (sym_addr) == CONST) -+ sym_addr = XEXP (sym_addr, 0); -+ if ((GET_CODE (sym_addr) == SYMBOL_REF || GET_CODE (sym_addr) == PLUS) -+ && DECL_INITIAL (decl) == 0) -+ { -+ -+ /* We have a sym that will go into a common area, meaning that it -+ will get storage reserved with a .comm/.lcomm assembler pseudo-op. -+ -+ Determine name of common area this symbol will be an offset into, -+ and offset into that area. Also retrieve the decl for the area -+ that the symbol is offset into. */ -+ tree cdecl = NULL; -+ -+ switch (GET_CODE (sym_addr)) -+ { -+ case PLUS: -+ if (GET_CODE (XEXP (sym_addr, 0)) == CONST_INT) -+ { -+ name = -+ targetm.strip_name_encoding(XSTR (XEXP (sym_addr, 1), 0)); -+ *value = INTVAL (XEXP (sym_addr, 0)); -+ cdecl = SYMBOL_REF_DECL (XEXP (sym_addr, 1)); -+ } -+ else -+ { -+ name = -+ targetm.strip_name_encoding(XSTR (XEXP (sym_addr, 0), 0)); -+ *value = INTVAL (XEXP (sym_addr, 1)); -+ cdecl = SYMBOL_REF_DECL (XEXP (sym_addr, 0)); -+ } -+ break; -+ -+ case SYMBOL_REF: -+ name = targetm.strip_name_encoding(XSTR (sym_addr, 0)); -+ *value = 0; -+ cdecl = SYMBOL_REF_DECL (sym_addr); -+ break; -+ -+ default: -+ error ("common symbol debug info is not structured as " -+ "symbol+offset"); -+ } -+ -+ /* Check area common symbol is offset into. If this is not public, then -+ it is not a symbol in a common block. It must be a .lcomm symbol, not -+ a .comm symbol. */ -+ if (cdecl == NULL || !TREE_PUBLIC(cdecl)) -+ name = NULL; -+ } -+ else -+ name = NULL; -+ -+ return name; -+} -+ - /* Output definitions of all the decls in a chain. Return nonzero if - anything was output */ - -@@ -3098,11 +3243,38 @@ int - dbxout_syms (tree syms) - { - int result = 0; -+ const char *comm_prev = NULL; -+ tree syms_prev = NULL; -+ - while (syms) - { -+ int temp, copen, cclos; -+ const char *comm_new; -+ -+ /* Check for common symbol, and then progression into a new/different -+ block of common symbols. Emit closing/opening common bracket if -+ necessary. */ -+ comm_new = dbxout_common_check (syms, &temp); -+ copen = comm_new != NULL -+ && (comm_prev == NULL || strcmp (comm_new, comm_prev)); -+ cclos = comm_prev != NULL -+ && (comm_new == NULL || strcmp (comm_new, comm_prev)); -+ if (cclos) -+ dbxout_common_name (syms_prev, comm_prev, N_ECOMM); -+ if (copen) -+ { -+ dbxout_common_name (syms, comm_new, N_BCOMM); -+ syms_prev = syms; -+ } -+ comm_prev = comm_new; -+ - result += dbxout_symbol (syms, 1); - syms = TREE_CHAIN (syms); - } -+ -+ if (comm_prev != NULL) -+ dbxout_common_name (syms_prev, comm_prev, N_ECOMM); -+ - return result; - } - ---- gcc/dwarf2out.c (revision 133800) -+++ gcc/dwarf2out.c (revision 133801) -@@ -4429,6 +4429,7 @@ static void output_compilation_unit_head - static void output_comp_unit (dw_die_ref, int); - static const char *dwarf2_name (tree, int); - static void add_pubname (tree, dw_die_ref); -+static void add_pubname_string (const char *, dw_die_ref); - static void add_pubtype (tree, dw_die_ref); - static void output_pubnames (VEC (pubname_entry,gc) *); - static void add_arange (tree, dw_die_ref); -@@ -7659,18 +7660,23 @@ dwarf2_name (tree decl, int scope) - /* Add a new entry to .debug_pubnames if appropriate. */ - - static void --add_pubname (tree decl, dw_die_ref die) -+add_pubname_string (const char *str, dw_die_ref die) - { - pubname_entry e; - -- if (! TREE_PUBLIC (decl)) -- return; -- - e.die = die; -- e.name = xstrdup (dwarf2_name (decl, 1)); -+ e.name = xstrdup (str); - VEC_safe_push (pubname_entry, gc, pubname_table, &e); - } - -+static void -+add_pubname (tree decl, dw_die_ref die) -+{ -+ -+ if (TREE_PUBLIC (decl)) -+ add_pubname_string (dwarf2_name (decl, 1), die); -+} -+ - /* Add a new entry to .debug_pubtypes if appropriate. */ - - static void -@@ -10914,6 +10920,57 @@ secname_for_decl (const_tree decl) - return secname; - } - -+/* Check whether decl is a Fortran COMMON symbol. If not, NULL_RTX is returned. -+ If so, the rtx for the SYMBOL_REF for the COMMON block is returned, and the -+ value is the offset into the common block for the symbol. */ -+ -+static tree -+fortran_common (tree decl, HOST_WIDE_INT *value) -+{ -+ tree val_expr, cvar; -+ enum machine_mode mode; -+ HOST_WIDE_INT bitsize, bitpos; -+ tree offset; -+ int volatilep = 0, unsignedp = 0; -+ -+ /* If the decl isn't a VAR_DECL, or if it isn't public or static, or if -+ it does not have a value (the offset into the common area), or if it -+ is thread local (as opposed to global) then it isn't common, and shouldn't -+ be handled as such. */ -+ if (TREE_CODE (decl) != VAR_DECL -+ || !TREE_PUBLIC (decl) -+ || !TREE_STATIC (decl) -+ || !DECL_HAS_VALUE_EXPR_P (decl) -+ || !is_fortran ()) -+ return NULL_TREE; -+ -+ val_expr = DECL_VALUE_EXPR (decl); -+ if (TREE_CODE (val_expr) != COMPONENT_REF) -+ return NULL_TREE; -+ -+ cvar = get_inner_reference (val_expr, &bitsize, &bitpos, &offset, -+ &mode, &unsignedp, &volatilep, true); -+ -+ if (cvar == NULL_TREE -+ || TREE_CODE (cvar) != VAR_DECL -+ || DECL_ARTIFICIAL (cvar) -+ || !TREE_PUBLIC (cvar)) -+ return NULL_TREE; -+ -+ *value = 0; -+ if (offset != NULL) -+ { -+ if (!host_integerp (offset, 0)) -+ return NULL_TREE; -+ *value = tree_low_cst (offset, 0); -+ } -+ if (bitpos != 0) -+ *value += bitpos / BITS_PER_UNIT; -+ -+ return cvar; -+} -+ -+ - /* Generate *either* a DW_AT_location attribute or else a DW_AT_const_value - data attribute for a variable or a parameter. We generate the - DW_AT_const_value attribute only in those cases where the given variable -@@ -12811,9 +12868,10 @@ gen_subprogram_die (tree decl, dw_die_re - static void - gen_variable_die (tree decl, dw_die_ref context_die) - { -+ HOST_WIDE_INT off; -+ tree com_decl; -+ dw_die_ref var_die; - tree origin = decl_ultimate_origin (decl); -- dw_die_ref var_die = new_die (DW_TAG_variable, context_die, decl); -- - dw_die_ref old_die = lookup_decl_die (decl); - int declaration = (DECL_EXTERNAL (decl) - /* If DECL is COMDAT and has not actually been -@@ -12837,6 +12895,37 @@ gen_variable_die (tree decl, dw_die_ref - && DECL_COMDAT (decl) && !TREE_ASM_WRITTEN (decl)) - || class_or_namespace_scope_p (context_die)); - -+ com_decl = fortran_common (decl, &off); -+ -+ /* Symbol in common gets emitted as a child of the common block, in the form -+ of a data member. -+ -+ ??? This creates a new common block die for every common block symbol. -+ Better to share same common block die for all symbols in that block. */ -+ if (com_decl) -+ { -+ tree field; -+ dw_die_ref com_die; -+ const char *cnam = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl)); -+ dw_loc_descr_ref loc = loc_descriptor_from_tree (com_decl); -+ -+ field = TREE_OPERAND (DECL_VALUE_EXPR (decl), 0); -+ var_die = new_die (DW_TAG_common_block, context_die, decl); -+ add_name_and_src_coords_attributes (var_die, field); -+ add_AT_flag (var_die, DW_AT_external, 1); -+ add_AT_loc (var_die, DW_AT_location, loc); -+ com_die = new_die (DW_TAG_member, var_die, decl); -+ add_name_and_src_coords_attributes (com_die, decl); -+ add_type_attribute (com_die, TREE_TYPE (decl), TREE_READONLY (decl), -+ TREE_THIS_VOLATILE (decl), context_die); -+ add_AT_loc (com_die, DW_AT_data_member_location, -+ int_loc_descriptor (off)); -+ add_pubname_string (cnam, var_die); /* ??? needed? */ -+ return; -+ } -+ -+ var_die = new_die (DW_TAG_variable, context_die, decl); -+ - if (origin != NULL) - add_abstract_origin_attribute (var_die, origin); - -@@ -13812,8 +13901,13 @@ decls_for_scope (tree stmt, dw_die_ref c - add_child_die (context_die, die); - /* Do not produce debug information for static variables since - these might be optimized out. We are called for these later -- in varpool_analyze_pending_decls. */ -- if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) -+ in varpool_analyze_pending_decls. -+ -+ But *do* produce it for Fortran COMMON variables because, -+ even though they are static, their names can differ depending -+ on the scope, which we need to preserve. */ -+ if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl) -+ && !(is_fortran () && TREE_PUBLIC (decl))) - ; - else - gen_decl_die (decl, context_die); -@@ -14137,6 +14231,16 @@ gen_decl_die (tree decl, dw_die_ref cont - if (debug_info_level <= DINFO_LEVEL_TERSE) - break; - -+ /* If this is the global definition of the Fortran COMMON block, we don't -+ need to do anything. Syntactically, the block itself has no identity, -+ just its constituent identifiers. */ -+ if (TREE_CODE (decl) == VAR_DECL -+ && TREE_PUBLIC (decl) -+ && TREE_STATIC (decl) -+ && is_fortran () -+ && !DECL_HAS_VALUE_EXPR_P (decl)) -+ break; -+ - /* Output any DIEs that are needed to specify the type of this data - object. */ - if (TREE_CODE (decl) == RESULT_DECL && DECL_BY_REFERENCE (decl)) -@@ -14203,7 +14307,15 @@ dwarf2out_global_decl (tree decl) - /* Output DWARF2 information for file-scope tentative data object - declarations, file-scope (extern) function declarations (which had no - corresponding body) and file-scope tagged type declarations and -- definitions which have not yet been forced out. */ -+ definitions which have not yet been forced out. -+ -+ Ignore the global decl of any Fortran COMMON blocks which also wind up here -+ though they have already been described in the local scope for the -+ procedures using them. */ -+ if (TREE_CODE (decl) == VAR_DECL -+ && TREE_PUBLIC (decl) && TREE_STATIC (decl) && is_fortran ()) -+ return; -+ - if (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)) - dwarf2out_decl (decl); - } ---- gcc/fortran/trans-common.c (revision 134695) -+++ gcc/fortran/trans-common.c (revision 134696) -@@ -687,7 +687,11 @@ create_common (gfc_common_head *com, seg - /* This is a fake variable just for debugging purposes. */ - TREE_ASM_WRITTEN (var_decl) = 1; - -- if (com) -+ /* To preserve identifier names in COMMON, chain to procedure -+ scope unless at top level in a module definition. */ -+ if (com -+ && s->sym->ns->proc_name -+ && s->sym->ns->proc_name->attr.flavor == FL_MODULE) - var_decl = pushdecl_top_level (var_decl); - else - gfc_add_decl_to_function (var_decl); ---- gcc/testsuite/gfortran.dg/debug/pr35154-stabs.f (revision 0) -+++ gcc/testsuite/gfortran.dg/debug/pr35154-stabs.f (revision 134696) -@@ -0,0 +1,35 @@ -+C Test program for common block debugging. G. Helffrich 11 July 2004. -+C { dg-do compile } -+C { dg-skip-if "No stabs" { mmix-*-* *-*-netware* alpha*-*-* hppa*64*-*-* ia64-*-* *-*-sysv5* *-*-vxworks* } { "*" } { "" } } -+C { dg-skip-if "No stabs" {*-*-* } { "*" } { "-gstabs" } } -+ common i,j -+ common /label/l,m -+ i = 1 -+ j = 2 -+ k = 3 -+ l = 4 -+ m = 5 -+ call sub -+ end -+ subroutine sub -+ common /label/l,m -+ logical first -+ save n -+ data first /.true./ -+ if (first) then -+ n = 0 -+ first = .false. -+ endif -+ n = n + 1 -+ l = l + 1 -+ return -+ end -+ -+C { dg-final { scan-assembler ".stabs.*\"__BLNK__\",226" } } -+C { dg-final { scan-assembler ".stabs.*\"i:V.*\",.*,0" } } -+C { dg-final { scan-assembler ".stabs.*\"j:V.*\",.*,4" } } -+C { dg-final { scan-assembler ".stabs.*\"__BLNK__\",228" } } -+C { dg-final { scan-assembler ".stabs.*\"label_\",226" } } -+C { dg-final { scan-assembler ".stabs.*\"l:V.*\",.*,0" } } -+C { dg-final { scan-assembler ".stabs.*\"m:V.*\",.*,4" } } -+C { dg-final { scan-assembler ".stabs.*\"label_\",228" } } ---- gcc/testsuite/gfortran.dg/debug/pr35154-dwarf2.f (revision 0) -+++ gcc/testsuite/gfortran.dg/debug/pr35154-dwarf2.f (revision 134696) -@@ -0,0 +1,37 @@ -+C Test program for common block debugging. G. Helffrich 11 July 2004. -+C { dg-do compile } -+C { dg-skip-if "DWARF-2 only" { "*-*-*" } { "*" } { "-gdwarf-2" } } -+C { dg-options "-dA" } -+ common i,j -+ common /label/l,m -+ i = 1 -+ j = 2 -+ k = 3 -+ l = 4 -+ m = 5 -+ call sub -+ end -+ subroutine sub -+ common /label/l,m -+ logical first -+ save n -+ data first /.true./ -+ if (first) then -+ n = 0 -+ first = .false. -+ endif -+ n = n + 1 -+ l = l + 1 -+ return -+ end -+ -+C { dg-final { scan-assembler "(DIE.*DW_TAG_common_block)" } } -+C { dg-final { scan-assembler "DW_AT_name: \"__BLNK__\"" } } -+C { dg-final { scan-assembler "(DIE.*DW_TAG_member)" } } -+C { dg-final { scan-assembler "\"i.*\".*DW_AT_name" } } -+C { dg-final { scan-assembler "\"j.*\".*DW_AT_name" } } -+C { dg-final { scan-assembler "(DIE.*DW_TAG_common_block)" } } -+C { dg-final { scan-assembler "DW_AT_name: \"label\"" } } -+C { dg-final { scan-assembler "(DIE.*DW_TAG_member)" } } -+C { dg-final { scan-assembler "\"l.*\".*DW_AT_name" } } -+C { dg-final { scan-assembler "\"m.*\".*DW_AT_name" } } ---- gcc/testsuite/gcc.dg/debug/pr35154.c (revision 0) -+++ gcc/testsuite/gcc.dg/debug/pr35154.c (revision 133801) -@@ -0,0 +1,34 @@ -+/* Test to make sure that stabs for C symbols that go into .comm have the -+ proper structure. These should be lettered G for the struct that gives -+ the name to the .comm, and should be V or S for .lcomm symbols. */ -+ -+static char i_outer; -+struct { -+ char f1; -+ char f2; -+} opta; -+struct { -+ char f1; -+ char f2; -+} optb; -+ -+int -+main() -+{ -+ static char i_inner[2]; -+ i_inner[0] = 'a'; i_inner[1] = 'b'; -+ opta.f1 = 'c'; -+ opta.f2 = 'd'; -+ optb.f1 = 'C'; -+ optb.f2 = 'D'; -+ i_outer = 'e'; -+/* { dg-do compile } */ -+/* { dg-skip-if "No stabs" { mmix-*-* *-*-netware* alpha*-*-* hppa*64*-*-* ia64-*-* *-*-sysv5* *-*-vxworks* } { "*" } { "" } } */ -+/* { dg-skip-if "stabs only" { *-*-* } { "*" } { "-gstabs" } } */ -+ return 0; -+} -+ -+/* { dg-final { scan-assembler ".stabs.*i_inner:V" } } */ -+/* { dg-final { scan-assembler ".stabs.*i_outer:S" } } */ -+/* { dg-final { scan-assembler ".stabs.*opta:G" } } */ -+/* { dg-final { scan-assembler ".stabs.*optb:G" } } */ ---- gcc/testsuite/lib/gfortran-dg.exp (revision 133800) -+++ gcc/testsuite/lib/gfortran-dg.exp (revision 133801) -@@ -1,4 +1,4 @@ --# Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -+# Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - - # This program is free software; you can redistribute it and/or modify - # it under the terms of the GNU General Public License as published by -@@ -107,3 +107,57 @@ proc gfortran-dg-runtest { testcases def - } - } - } -+ -+proc gfortran-dg-debug-runtest { target_compile trivial opt_opts testcases } { -+ global srcdir subdir DEBUG_TORTURE_OPTIONS -+ -+ if ![info exists DEBUG_TORTURE_OPTIONS] { -+ set DEBUG_TORTURE_OPTIONS "" -+ set type_list [list "-gstabs" "-gstabs+" "-gxcoff" "-gxcoff+" "-gcoff" "-gdwarf-2" ] -+ foreach type $type_list { -+ set comp_output [$target_compile \ -+ "$srcdir/$subdir/$trivial" "trivial.S" assembly \ -+ "additional_flags=$type"] -+ if { [string match "exit status *" $comp_output] } { -+ continue -+ } -+ if { [string match \ -+ "* target system does not support the * debug format*" \ -+ $comp_output] -+ } { -+ continue -+ } -+ foreach level {1 "" 3} { -+ lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}"] -+ foreach opt $opt_opts { -+ lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}" \ -+ "$opt" ] -+ } -+ } -+ } -+ } -+ -+ verbose -log "Using options $DEBUG_TORTURE_OPTIONS" -+ -+ global runtests -+ -+ foreach test $testcases { -+ # If we're only testing specific files and this isn't one of -+ # them, skip it. -+ if ![runtest_file_p $runtests $test] { -+ continue -+ } -+ -+ set nshort [file tail [file dirname $test]]/[file tail $test] -+ -+ foreach flags $DEBUG_TORTURE_OPTIONS { -+ set doit 1 -+ # gcc-specific checking removed here -+ -+ if { $doit } { -+ verbose -log "Testing $nshort, $flags" 1 -+ dg-test $test $flags "" -+ } -+ } -+ } -+} ---- gcc/testsuite/gfortran.dg/debug/debug.exp (revision 0) -+++ gcc/testsuite/gfortran.dg/debug/debug.exp (revision 133801) -@@ -0,0 +1,41 @@ -+# Copyright (C) 2008 Free Software Foundation, Inc. -+ -+# This file is part of GCC. -+# -+# GCC is free software; you can redistribute it and/or modify it under -+# the terms of the GNU General Public License as published by the Free -+# Software Foundation; either version 3, or (at your option) any later -+# version. -+# -+# GCC is distributed in the hope that it will be useful, but WITHOUT ANY -+# WARRANTY; without even the implied warranty of MERCHANTABILITY or -+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+# for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with GCC; see the file COPYING3. If not see -+# . -+ -+# GCC testsuite that uses the `dg.exp' driver. -+ -+# Load support procs. -+load_lib gfortran-dg.exp -+load_lib gfortran.exp -+ -+# Debugging testsuite proc -+proc gfortran-debug-dg-test { prog do_what extra_tool_flags } { -+ return [gfortran-dg-test $prog $do_what $extra_tool_flags] -+} -+ -+# Initialize `dg'. -+dg-init -+ -+# Main loop. -+ -+gfortran_init -+ -+gfortran-dg-debug-runtest gfortran_target_compile trivial.f "" \ -+ [lsort [glob -nocomplain $srcdir/$subdir/*.\[fS\]]] -+ -+# All done. -+dg-finish ---- gcc/testsuite/gfortran.dg/debug/trivial.f (revision 0) -+++ gcc/testsuite/gfortran.dg/debug/trivial.f (revision 133801) -@@ -0,0 +1,2 @@ -+ program trivial -+ end diff --git a/gcc43-fortran-debug10.patch b/gcc43-fortran-debug10.patch deleted file mode 100644 index 7f93659..0000000 --- a/gcc43-fortran-debug10.patch +++ /dev/null @@ -1,457 +0,0 @@ -2008-08-26 Jakub Jelinek - - * dwarf2out.c (gen_const_die): New function. - (size_of_die, value_format, output_die): Output larger - dw_val_class_vec using DW_FORM_block2 or DW_FORM_block4. - (native_encode_initializer): New function. - (tree_add_const_value_attribute): Call it. - (gen_decl_die, dwarf2out_decl): Handle CONST_DECLs if is_fortran (). - - * trans-decl.c (check_constant_initializer, - gfc_emit_parameter_debug_info): New functions. - (gfc_generate_module_vars, gfc_generate_function_code): Emit - PARAMETERs and unreferenced variables with initializers into - debug info. - ---- gcc/fortran/trans-decl.c.jj 2008-08-26 21:43:36.000000000 +0200 -+++ gcc/fortran/trans-decl.c 2008-08-26 22:54:24.000000000 +0200 -@@ -3232,6 +3232,135 @@ gfc_trans_use_stmts (gfc_namespace * ns) - } - - -+/* Return true if expr is a constant initializer that gfc_conv_initializer -+ will handle. */ -+ -+static bool -+check_constant_initializer (gfc_expr *expr, gfc_typespec *ts, bool array, -+ bool pointer) -+{ -+ gfc_constructor *c; -+ gfc_component *cm; -+ -+ if (pointer) -+ return true; -+ else if (array) -+ { -+ if (expr->expr_type == EXPR_CONSTANT || expr->expr_type == EXPR_NULL) -+ return true; -+ else if (expr->expr_type == EXPR_STRUCTURE) -+ return check_constant_initializer (expr, ts, false, false); -+ else if (expr->expr_type != EXPR_ARRAY) -+ return false; -+ for (c = expr->value.constructor; c; c = c->next) -+ { -+ if (c->iterator) -+ return false; -+ if (c->expr->expr_type == EXPR_STRUCTURE) -+ { -+ if (!check_constant_initializer (c->expr, ts, false, false)) -+ return false; -+ } -+ else if (c->expr->expr_type != EXPR_CONSTANT) -+ return false; -+ } -+ return true; -+ } -+ else switch (ts->type) -+ { -+ case BT_DERIVED: -+ if (expr->expr_type != EXPR_STRUCTURE) -+ return false; -+ cm = expr->ts.derived->components; -+ for (c = expr->value.constructor; c; c = c->next, cm = cm->next) -+ { -+ if (!c->expr || cm->allocatable) -+ continue; -+ if (!check_constant_initializer (c->expr, &cm->ts, -+ cm->dimension, -+ cm->pointer)) -+ return false; -+ } -+ return true; -+ default: -+ return expr->expr_type == EXPR_CONSTANT; -+ } -+} -+ -+/* Emit debug info for parameters and unreferenced variables with -+ initializers. */ -+ -+static void -+gfc_emit_parameter_debug_info (gfc_symbol *sym) -+{ -+ tree decl; -+ -+ if (sym->attr.flavor != FL_PARAMETER -+ && (sym->attr.flavor != FL_VARIABLE || sym->attr.referenced)) -+ return; -+ -+ if (sym->backend_decl != NULL -+ || sym->value == NULL -+ || sym->attr.use_assoc -+ || sym->attr.dummy -+ || sym->attr.result -+ || sym->attr.function -+ || sym->attr.intrinsic -+ || sym->attr.pointer -+ || sym->attr.allocatable -+ || sym->attr.cray_pointee -+ || sym->attr.threadprivate -+ || sym->attr.is_bind_c -+ || sym->attr.subref_array_pointer -+ || sym->attr.assign) -+ return; -+ -+ if (sym->ts.type == BT_CHARACTER) -+ { -+ gfc_conv_const_charlen (sym->ts.cl); -+ if (sym->ts.cl->backend_decl == NULL -+ || TREE_CODE (sym->ts.cl->backend_decl) != INTEGER_CST) -+ return; -+ } -+ else if (sym->ts.type == BT_DERIVED && sym->ts.derived->attr.alloc_comp) -+ return; -+ -+ if (sym->as) -+ { -+ int n; -+ -+ if (sym->as->type != AS_EXPLICIT) -+ return; -+ for (n = 0; n < sym->as->rank; n++) -+ if (sym->as->lower[n]->expr_type != EXPR_CONSTANT -+ || sym->as->upper[n] == NULL -+ || sym->as->upper[n]->expr_type != EXPR_CONSTANT) -+ return; -+ } -+ -+ if (!check_constant_initializer (sym->value, &sym->ts, -+ sym->attr.dimension, false)) -+ return; -+ -+ /* Create the decl for the variable or constant. */ -+ decl = build_decl (sym->attr.flavor == FL_PARAMETER ? CONST_DECL : VAR_DECL, -+ gfc_sym_identifier (sym), gfc_sym_type (sym)); -+ if (sym->attr.flavor == FL_PARAMETER) -+ TREE_READONLY (decl) = 1; -+ gfc_set_decl_location (decl, &sym->declared_at); -+ if (sym->attr.dimension) -+ GFC_DECL_PACKED_ARRAY (decl) = 1; -+ DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl; -+ TREE_STATIC (decl) = 1; -+ TREE_USED (decl) = 1; -+ if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL) -+ TREE_PUBLIC (decl) = 1; -+ DECL_INITIAL (decl) -+ = gfc_conv_initializer (sym->value, &sym->ts, TREE_TYPE (decl), -+ sym->attr.dimension, 0); -+ debug_hooks->global_decl (decl); -+} -+ - /* Generate all the required code for module variables. */ - - void -@@ -3252,6 +3381,7 @@ gfc_generate_module_vars (gfc_namespace - cur_module = NULL; - - gfc_trans_use_stmts (ns); -+ gfc_traverse_ns (ns, gfc_emit_parameter_debug_info); - } - - -@@ -3787,6 +3917,7 @@ gfc_generate_function_code (gfc_namespac - } - - gfc_trans_use_stmts (ns); -+ gfc_traverse_ns (ns, gfc_emit_parameter_debug_info); - } - - void ---- gcc/dwarf2out.c.jj 2008-08-26 21:43:31.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-26 21:43:42.000000000 +0200 -@@ -5093,6 +5093,7 @@ static void gen_unspecified_parameters_d - static void gen_formal_types_die (tree, dw_die_ref); - static void gen_subprogram_die (tree, dw_die_ref); - static void gen_variable_die (tree, dw_die_ref); -+static void gen_const_die (tree, dw_die_ref); - static void gen_label_die (tree, dw_die_ref); - static void gen_lexical_block_die (tree, dw_die_ref, int); - static void gen_inlined_subroutine_die (tree, dw_die_ref, int); -@@ -7564,8 +7565,10 @@ size_of_die (dw_die_ref die) - size += 1 + 2*HOST_BITS_PER_LONG/HOST_BITS_PER_CHAR; /* block */ - break; - case dw_val_class_vec: -- size += 1 + (a->dw_attr_val.v.val_vec.length -- * a->dw_attr_val.v.val_vec.elt_size); /* block */ -+ size += constant_size (a->dw_attr_val.v.val_vec.length -+ * a->dw_attr_val.v.val_vec.elt_size) -+ + a->dw_attr_val.v.val_vec.length -+ * a->dw_attr_val.v.val_vec.elt_size; /* block */ - break; - case dw_val_class_flag: - size += 1; -@@ -7764,7 +7767,18 @@ value_format (dw_attr_ref a) - case dw_val_class_long_long: - return DW_FORM_block1; - case dw_val_class_vec: -- return DW_FORM_block1; -+ switch (constant_size (a->dw_attr_val.v.val_vec.length -+ * a->dw_attr_val.v.val_vec.elt_size)) -+ { -+ case 1: -+ return DW_FORM_block1; -+ case 2: -+ return DW_FORM_block2; -+ case 4: -+ return DW_FORM_block4; -+ default: -+ gcc_unreachable (); -+ } - case dw_val_class_flag: - return DW_FORM_flag; - case dw_val_class_die_ref: -@@ -8056,7 +8070,8 @@ output_die (dw_die_ref die) - unsigned int i; - unsigned char *p; - -- dw2_asm_output_data (1, len * elt_size, "%s", name); -+ dw2_asm_output_data (constant_size (len * elt_size), -+ len * elt_size, "%s", name); - if (elt_size > sizeof (HOST_WIDE_INT)) - { - elt_size /= 2; -@@ -11762,6 +11777,150 @@ add_location_or_const_value_attribute (d - tree_add_const_value_attribute (die, decl); - } - -+/* Helper function for tree_add_const_value_attribute. Natively encode -+ initializer INIT into an array. Return true if successful. */ -+ -+static bool -+native_encode_initializer (tree init, unsigned char *array, int size) -+{ -+ tree type; -+ -+ if (init == NULL_TREE) -+ return false; -+ -+ STRIP_NOPS (init); -+ switch (TREE_CODE (init)) -+ { -+ case STRING_CST: -+ type = TREE_TYPE (init); -+ if (TREE_CODE (type) == ARRAY_TYPE) -+ { -+ tree enttype = TREE_TYPE (type); -+ enum machine_mode mode = TYPE_MODE (enttype); -+ -+ if (GET_MODE_CLASS (mode) != MODE_INT || GET_MODE_SIZE (mode) != 1) -+ return false; -+ if (int_size_in_bytes (type) != size) -+ return false; -+ if (size > TREE_STRING_LENGTH (init)) -+ { -+ memcpy (array, TREE_STRING_POINTER (init), -+ TREE_STRING_LENGTH (init)); -+ memset (array + TREE_STRING_LENGTH (init), -+ '\0', size - TREE_STRING_LENGTH (init)); -+ } -+ else -+ memcpy (array, TREE_STRING_POINTER (init), size); -+ return true; -+ } -+ return false; -+ case CONSTRUCTOR: -+ type = TREE_TYPE (init); -+ if (int_size_in_bytes (type) != size) -+ return false; -+ if (TREE_CODE (type) == ARRAY_TYPE) -+ { -+ HOST_WIDE_INT min_index; -+ unsigned HOST_WIDE_INT cnt; -+ int curpos = 0, fieldsize; -+ constructor_elt *ce; -+ -+ if (TYPE_DOMAIN (type) == NULL_TREE -+ || !host_integerp (TYPE_MIN_VALUE (TYPE_DOMAIN (type)), 0)) -+ return false; -+ -+ fieldsize = int_size_in_bytes (TREE_TYPE (type)); -+ if (fieldsize <= 0) -+ return false; -+ -+ min_index = tree_low_cst (TYPE_MIN_VALUE (TYPE_DOMAIN (type)), 0); -+ memset (array, '\0', size); -+ for (cnt = 0; -+ VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (init), cnt, ce); -+ cnt++) -+ { -+ tree val = ce->value; -+ tree index = ce->index; -+ int pos = curpos; -+ if (index && TREE_CODE (index) == RANGE_EXPR) -+ pos = (tree_low_cst (TREE_OPERAND (index, 0), 0) - min_index) -+ * fieldsize; -+ else if (index) -+ pos = tree_low_cst (index, 0) * fieldsize; -+ -+ if (val) -+ { -+ STRIP_NOPS (val); -+ if (!native_encode_initializer (val, array + pos, fieldsize)) -+ return false; -+ } -+ curpos = pos + fieldsize; -+ if (index && TREE_CODE (index) == RANGE_EXPR) -+ { -+ int count = tree_low_cst (TREE_OPERAND (index, 1), 0) -+ - tree_low_cst (TREE_OPERAND (index, 0), 0); -+ while (count > 0) -+ { -+ if (val) -+ memcpy (array + curpos, array + pos, fieldsize); -+ curpos += fieldsize; -+ } -+ } -+ gcc_assert (curpos <= size); -+ } -+ return true; -+ } -+ else if (TREE_CODE (type) == RECORD_TYPE -+ || TREE_CODE (type) == UNION_TYPE) -+ { -+ tree field = NULL_TREE; -+ unsigned HOST_WIDE_INT cnt; -+ constructor_elt *ce; -+ -+ if (int_size_in_bytes (type) != size) -+ return false; -+ -+ if (TREE_CODE (type) == RECORD_TYPE) -+ field = TYPE_FIELDS (type); -+ -+ for (cnt = 0; -+ VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (init), cnt, ce); -+ cnt++, field = field ? TREE_CHAIN (field) : 0) -+ { -+ tree val = ce->value; -+ int pos, fieldsize; -+ -+ if (ce->index != 0) -+ field = ce->index; -+ -+ if (val) -+ STRIP_NOPS (val); -+ -+ if (field == NULL_TREE || DECL_BIT_FIELD (field)) -+ return false; -+ -+ if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE -+ && TYPE_DOMAIN (TREE_TYPE (field)) -+ && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field)))) -+ return false; -+ else if (DECL_SIZE_UNIT (field) == NULL_TREE -+ || !host_integerp (DECL_SIZE_UNIT (field), 0)) -+ return false; -+ fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 0); -+ pos = int_byte_position (field); -+ gcc_assert (pos + fieldsize <= size); -+ if (val -+ && !native_encode_initializer (val, array + pos, fieldsize)) -+ return false; -+ } -+ return true; -+ } -+ return false; -+ default: -+ return native_encode_expr (init, array, size) == size; -+ } -+} -+ - /* If we don't have a copy of this variable in memory for some reason (such - as a C++ member constant that doesn't have an out-of-line definition), - we should tell the debugger about the constant value. */ -@@ -11781,6 +11940,19 @@ tree_add_const_value_attribute (dw_die_r - rtl = rtl_for_decl_init (init, type); - if (rtl) - add_const_value_attribute (var_die, rtl); -+ /* If the host and target are sane, try harder. */ -+ else if (CHAR_BIT == 8 && BITS_PER_UNIT == 8 -+ && initializer_constant_valid_p (init, type)) -+ { -+ HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (init)); -+ if (size > 0 && (int) size == size) -+ { -+ unsigned char *array = GGC_CNEWVEC (unsigned char, size); -+ -+ if (native_encode_initializer (init, array, size)) -+ add_AT_vec (var_die, DW_AT_const_value, size, 1, array); -+ } -+ } - } - - /* Convert the CFI instructions for the current function into a -@@ -13743,6 +13914,24 @@ gen_variable_die (tree decl, dw_die_ref - tree_add_const_value_attribute (var_die, decl); - } - -+/* Generate a DIE to represent a named constant. */ -+ -+static void -+gen_const_die (tree decl, dw_die_ref context_die) -+{ -+ dw_die_ref const_die; -+ tree type = TREE_TYPE (decl); -+ -+ const_die = new_die (DW_TAG_constant, context_die, decl); -+ add_name_and_src_coords_attributes (const_die, decl); -+ add_type_attribute (const_die, type, 1, 0, context_die); -+ if (TREE_PUBLIC (decl)) -+ add_AT_flag (const_die, DW_AT_external, 1); -+ if (DECL_ARTIFICIAL (decl)) -+ add_AT_flag (const_die, DW_AT_artificial, 1); -+ tree_add_const_value_attribute (const_die, decl); -+} -+ - /* Generate a DIE to represent a label identifier. */ - - static void -@@ -14883,8 +15072,20 @@ gen_decl_die (tree decl, dw_die_ref cont - break; - - case CONST_DECL: -- /* The individual enumerators of an enum type get output when we output -- the Dwarf representation of the relevant enum type itself. */ -+ if (!is_fortran ()) -+ { -+ /* The individual enumerators of an enum type get output when we output -+ the Dwarf representation of the relevant enum type itself. */ -+ break; -+ } -+ -+ /* Emit its type. */ -+ gen_type_die (TREE_TYPE (decl), context_die); -+ -+ /* And its containing namespace. */ -+ context_die = declare_in_namespace (decl, context_die); -+ -+ gen_const_die (decl, context_die); - break; - - case FUNCTION_DECL: -@@ -15229,6 +15430,15 @@ dwarf2out_decl (tree decl) - return; - break; - -+ case CONST_DECL: -+ if (debug_info_level <= DINFO_LEVEL_TERSE) -+ return; -+ if (!is_fortran ()) -+ return; -+ if (TREE_STATIC (decl) && decl_function_context (decl)) -+ context_die = lookup_decl_die (DECL_CONTEXT (decl)); -+ break; -+ - case NAMESPACE_DECL: - if (debug_info_level <= DINFO_LEVEL_TERSE) - return; diff --git a/gcc43-fortran-debug11.patch b/gcc43-fortran-debug11.patch deleted file mode 100644 index 73ec57b..0000000 --- a/gcc43-fortran-debug11.patch +++ /dev/null @@ -1,73 +0,0 @@ -2008-08-28 Jakub Jelinek - - * dwarf2out.c (descr_info_loc): Handle VAR_DECL. - - * trans.h (struct lang_type): Add span. - (GFC_TYPE_ARRAY_SPAN): Define. - * trans-decl.c (gfc_get_symbol_decl): For subref array pointers, - copy TREE_STATIC from decl to span instead of setting it - unconditionally, set DECL_ARTIFICIAL, fix type of initializer - and set GFC_TYPE_ARRAY_SPAN on decl's type. - * trans-types.c (gfc_get_array_descr_info): If - GFC_TYPE_ARRAY_SPAN is non-NULL, use it as element size. - ---- gcc/fortran/trans.h.jj 2008-08-26 21:43:04.000000000 +0200 -+++ gcc/fortran/trans.h 2008-08-28 09:58:01.000000000 +0200 -@@ -605,6 +605,7 @@ struct lang_type GTY(()) - tree offset; - tree dtype; - tree dataptr_type; -+ tree span; - }; - - struct lang_decl GTY(()) -@@ -657,6 +658,7 @@ struct lang_decl GTY(()) - #define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype) - #define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \ - (TYPE_LANG_SPECIFIC(node)->dataptr_type) -+#define GFC_TYPE_ARRAY_SPAN(node) (TYPE_LANG_SPECIFIC(node)->span) - - /* Build an expression with void type. */ - #define build1_v(code, arg) build1(code, void_type_node, arg) ---- gcc/fortran/trans-decl.c.jj 2008-08-26 22:54:24.000000000 +0200 -+++ gcc/fortran/trans-decl.c 2008-08-28 10:54:28.000000000 +0200 -@@ -1105,10 +1105,12 @@ gfc_get_symbol_decl (gfc_symbol * sym) - span = build_decl (VAR_DECL, create_tmp_var_name ("span"), - gfc_array_index_type); - gfc_finish_var_decl (span, sym); -- TREE_STATIC (span) = 1; -- DECL_INITIAL (span) = build_int_cst (NULL_TREE, 0); -+ TREE_STATIC (span) = TREE_STATIC (decl); -+ DECL_ARTIFICIAL (span) = 1; -+ DECL_INITIAL (span) = build_int_cst (gfc_array_index_type, 0); - - GFC_DECL_SPAN (decl) = span; -+ GFC_TYPE_ARRAY_SPAN (TREE_TYPE (decl)) = span; - } - - sym->backend_decl = decl; ---- gcc/fortran/trans-types.c.jj 2008-08-26 21:43:04.000000000 +0200 -+++ gcc/fortran/trans-types.c 2008-08-28 10:23:39.000000000 +0200 -@@ -2289,7 +2289,10 @@ gfc_get_array_descr_info (const_tree typ - else - info->base_decl = base_decl = build_decl (VAR_DECL, NULL_TREE, ptype); - -- elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); -+ if (GFC_TYPE_ARRAY_SPAN (type)) -+ elem_size = GFC_TYPE_ARRAY_SPAN (type); -+ else -+ elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); - field = TYPE_FIELDS (TYPE_MAIN_VARIANT (type)); - data_off = byte_position (field); - field = TREE_CHAIN (field); ---- gcc/dwarf2out.c.jj 2008-08-26 21:43:42.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-28 10:35:38.000000000 +0200 -@@ -12232,6 +12232,8 @@ descr_info_loc (tree val, tree base_decl - case NOP_EXPR: - case CONVERT_EXPR: - return descr_info_loc (TREE_OPERAND (val, 0), base_decl); -+ case VAR_DECL: -+ return loc_descriptor_from_tree_1 (val, 0); - case INTEGER_CST: - if (host_integerp (val, 0)) - return int_loc_descriptor (tree_low_cst (val, 0)); diff --git a/gcc43-fortran-debug2.patch b/gcc43-fortran-debug2.patch deleted file mode 100644 index a7bf12a..0000000 --- a/gcc43-fortran-debug2.patch +++ /dev/null @@ -1,1010 +0,0 @@ -2008-08-22 Jakub Jelinek - - PR fortran/29635 - PR fortran/23057 - * debug.h (struct gcc_debug_hooks): Add NAME and CHILD - arguments to imported_module_or_decl. - (debug_nothing_tree_tree): Removed. - (debug_nothing_tree_tree_tree_bool): New prototype. - * debug.c (do_nothing_debug_hooks): Adjust. - (debug_nothing_tree_tree): Removed. - (debug_nothing_tree_tree_tree_bool): New function. - * dwarf2out.c (is_symbol_die): Handle DW_TAG_module. - (gen_variable_die): Put all common vars for the - same COMMON block under one DW_TAG_common_block. - (declare_in_namespace): Return new context_die, for Fortran - return the module DIE instead of adding extra declarations into - the namespace. - (gen_type_die_with_usage): Adjust declare_in_namespace caller. - (gen_namespace_die): If is_fortran (), generate DW_TAG_module - instead of DW_TAG_namespace. If DECL_EXTERNAL is set, add - DW_AT_declaration. - (dwarf2out_global_decl): Don't skip Fortran global vars. - (gen_decl_die): Likewise. Adjust declare_in_namespace callers. - (dwarf2out_imported_module_or_decl): Add NAME and CHILD arguments. - If NAME is non-NULL, add DW_AT_name. If CHILD is non-NULL, put - DW_TAG_imported_declaration as child of previous - DW_TAG_imported_module. - * dbxout.c (dbx_debug_hooks, xcoff_debug_hooks): Adjust. - * sdbout.c (sdb_debug_hooks): Likewise. - * vmsdbgout.c (vmsdbg_debug_hooks): Likewise. - - * name-lookup.c (do_using_directive, cp_emit_debug_info_for_using): - Adjust debug_hooks->imported_module_or_decl callers. - - * f95-lang.c (gfc_init_ts): New function. - (LANG_HOOKS_INIT_TS): Define. - * gfortran.h (gfc_use_rename): New type, moved from module.c. - (gfc_get_use_rename): New macro, moved from module.c. - (gfc_use_list): New type. - (gfc_get_use_list): New macro. - (gfc_namespace): Add use_stmts field. - (gfc_free_use_stmts): New prototype. - * Make-lang.in (fortran/trans-decl.o): Depend on debug.h. - * module.c (gfc_use_rename, gfc_get_use_rename): Moved to - gfortran.h. - (gfc_use_module): Chain the USE statement info to - ns->use_stmts. - (gfc_free_use_stmts): New function. - * symbol.c (gfc_free_namespace): Call gfc_free_use_stmts. - * trans.h (struct module_htab_entry): New type. - (gfc_find_module, gfc_module_add_decl): New functions. - * trans.c (gfc_generate_module_code): Create NAMESPACE_DECL for - the module, adjust DECL_CONTEXTs of module procedures and - call gfc_module_add_decl for them. - * trans-common.c (build_common_decl): Set DECL_IGNORED_P - on the common variable. - (create_common): Set DECL_IGNORED_P for use associated vars. - * trans-decl.c: Include debug.h. - (gfc_get_symbol_decl): Set DECL_IGNORED_P on use_assoc vars from - modules. - (build_function_decl): Allow current_function_decl's context - to be a NAMESPACE_DECL. - (module_htab, cur_module): New variables. - (module_htab_do_hash, module_htab_eq, module_htab_decls_hash, - module_htab_decls_eq, gfc_find_module, gfc_module_add_decl): New - functions. - (gfc_create_module_variable): Adjust DECL_CONTEXTs of module - variables and types and call gfc_module_add_decl for them. - (gfc_generate_module_vars): Temporarily set cur_module. - (gfc_trans_use_stmts): New function. - (gfc_generate_function_code): Call it. - (gfc_generate_block_data): Set DECL_IGNORED_P on decl. - * trans-types.c (gfc_get_derived_type): Adjust DECL_CONTEXT - and TYPE_CONTEXT of module derived types. - ---- gcc/fortran/f95-lang.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/f95-lang.c 2008-08-21 10:21:30.000000000 +0200 -@@ -99,6 +99,7 @@ void insert_block (tree); - static void gfc_clear_binding_stack (void); - static void gfc_be_parse_file (int); - static alias_set_type gfc_get_alias_set (tree); -+static void gfc_init_ts (void); - - #undef LANG_HOOKS_NAME - #undef LANG_HOOKS_INIT -@@ -113,6 +114,7 @@ static alias_set_type gfc_get_alias_set - #undef LANG_HOOKS_TYPE_FOR_SIZE - #undef LANG_HOOKS_CLEAR_BINDING_STACK - #undef LANG_HOOKS_GET_ALIAS_SET -+#undef LANG_HOOKS_INIT_TS - #undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE - #undef LANG_HOOKS_OMP_PREDETERMINED_SHARING - #undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR -@@ -140,6 +142,7 @@ static alias_set_type gfc_get_alias_set - #define LANG_HOOKS_TYPE_FOR_SIZE gfc_type_for_size - #define LANG_HOOKS_CLEAR_BINDING_STACK gfc_clear_binding_stack - #define LANG_HOOKS_GET_ALIAS_SET gfc_get_alias_set -+#define LANG_HOOKS_INIT_TS gfc_init_ts - #define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE gfc_omp_privatize_by_reference - #define LANG_HOOKS_OMP_PREDETERMINED_SHARING gfc_omp_predetermined_sharing - #define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR gfc_omp_clause_default_ctor -@@ -1184,5 +1187,15 @@ gfc_init_builtin_functions (void) - #undef DEFINE_MATH_BUILTIN_C - #undef DEFINE_MATH_BUILTIN - -+static void -+gfc_init_ts (void) -+{ -+ tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON] = 1; -+ tree_contains_struct[NAMESPACE_DECL][TS_DECL_WITH_VIS] = 1; -+ tree_contains_struct[NAMESPACE_DECL][TS_DECL_WRTL] = 1; -+ tree_contains_struct[NAMESPACE_DECL][TS_DECL_COMMON] = 1; -+ tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] = 1; -+} -+ - #include "gt-fortran-f95-lang.h" - #include "gtype-fortran.h" ---- gcc/fortran/trans.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/trans.c 2008-08-21 10:21:30.000000000 +0200 -@@ -1209,6 +1209,19 @@ void - gfc_generate_module_code (gfc_namespace * ns) - { - gfc_namespace *n; -+ struct module_htab_entry *entry; -+ -+ gcc_assert (ns->proc_name->backend_decl == NULL); -+ ns->proc_name->backend_decl -+ = build_decl (NAMESPACE_DECL, get_identifier (ns->proc_name->name), -+ void_type_node); -+ gfc_set_decl_location (ns->proc_name->backend_decl, -+ &ns->proc_name->declared_at); -+ entry = gfc_find_module (ns->proc_name->name); -+ if (entry->namespace_decl) -+ /* Buggy sourcecode, using a module before defining it? */ -+ htab_empty (entry->decls); -+ entry->namespace_decl = ns->proc_name->backend_decl; - - gfc_generate_module_vars (ns); - -@@ -1216,10 +1229,21 @@ gfc_generate_module_code (gfc_namespace - sibling calls. */ - for (n = ns->contained; n; n = n->sibling) - { -+ gfc_entry_list *el; -+ - if (!n->proc_name) - continue; - - gfc_create_function_decl (n); -+ gcc_assert (DECL_CONTEXT (n->proc_name->backend_decl) == NULL_TREE); -+ DECL_CONTEXT (n->proc_name->backend_decl) = ns->proc_name->backend_decl; -+ gfc_module_add_decl (entry, n->proc_name->backend_decl); -+ for (el = ns->entries; el; el = el->next) -+ { -+ gcc_assert (DECL_CONTEXT (el->sym->backend_decl) == NULL_TREE); -+ DECL_CONTEXT (el->sym->backend_decl) = ns->proc_name->backend_decl; -+ gfc_module_add_decl (entry, el->sym->backend_decl); -+ } - } - - for (n = ns->contained; n; n = n->sibling) ---- gcc/fortran/module.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/module.c 2008-08-21 10:21:30.000000000 +0200 -@@ -161,20 +161,6 @@ pointer_info; - #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info)) - - --/* Lists of rename info for the USE statement. */ -- --typedef struct gfc_use_rename --{ -- char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1]; -- struct gfc_use_rename *next; -- int found; -- gfc_intrinsic_op operator; -- locus where; --} --gfc_use_rename; -- --#define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename)) -- - /* Local variables */ - - /* The FILE for the module we're reading or writing. */ -@@ -4749,6 +4735,7 @@ gfc_use_module (void) - gfc_state_data *p; - int c, line, start; - gfc_symtree *mod_symtree; -+ gfc_use_list *use_stmt; - - filename = (char *) alloca (strlen (module_name) + strlen (MODULE_EXTENSION) - + 1); -@@ -4841,6 +4828,33 @@ gfc_use_module (void) - pi_root = NULL; - - fclose (module_fp); -+ -+ use_stmt = gfc_get_use_list (); -+ use_stmt->module_name = gfc_get_string (module_name); -+ use_stmt->only_flag = only_flag; -+ use_stmt->rename = gfc_rename_list; -+ gfc_rename_list = NULL; -+ use_stmt->next = gfc_current_ns->use_stmts; -+ gfc_current_ns->use_stmts = use_stmt; -+} -+ -+ -+void -+gfc_free_use_stmts (gfc_use_list *use_stmts) -+{ -+ gfc_use_list *next; -+ for (; use_stmts; use_stmts = next) -+ { -+ gfc_use_rename *next_rename; -+ -+ for (; use_stmts->rename; use_stmts->rename = next_rename) -+ { -+ next_rename = use_stmts->rename->next; -+ gfc_free (use_stmts->rename); -+ } -+ next = use_stmts->next; -+ gfc_free (use_stmts); -+ } - } - - ---- gcc/fortran/Make-lang.in.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/Make-lang.in 2008-08-21 10:21:30.000000000 +0200 -@@ -310,7 +310,7 @@ fortran/convert.o: $(GFORTRAN_TRANS_DEPS - fortran/trans.o: $(GFORTRAN_TRANS_DEPS) - fortran/trans-decl.o: $(GFORTRAN_TRANS_DEPS) gt-fortran-trans-decl.h \ - $(CGRAPH_H) $(TARGET_H) $(FUNCTION_H) $(FLAGS_H) $(RTL_H) $(TREE_GIMPLE_H) \ -- $(TREE_DUMP_H) -+ $(TREE_DUMP_H) debug.h - fortran/trans-types.o: $(GFORTRAN_TRANS_DEPS) gt-fortran-trans-types.h \ - $(REAL_H) toplev.h $(TARGET_H) $(FLAGS_H) dwarf2out.h - fortran/trans-const.o: $(GFORTRAN_TRANS_DEPS) ---- gcc/fortran/gfortran.h.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/gfortran.h 2008-08-21 10:21:30.000000000 +0200 -@@ -1093,6 +1093,35 @@ gfc_entry_list; - #define gfc_get_entry_list() \ - (gfc_entry_list *) gfc_getmem(sizeof(gfc_entry_list)) - -+/* Lists of rename info for the USE statement. */ -+ -+typedef struct gfc_use_rename -+{ -+ char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1]; -+ struct gfc_use_rename *next; -+ int found; -+ gfc_intrinsic_op operator; -+ locus where; -+} -+gfc_use_rename; -+ -+#define gfc_get_use_rename() XCNEW (gfc_use_rename); -+ -+/* A list of all USE statements in a namespace. */ -+ -+typedef struct gfc_use_list -+{ -+ const char *module_name; -+ int only_flag; -+ struct gfc_use_rename *rename; -+ /* Next USE statement. */ -+ struct gfc_use_list *next; -+} -+gfc_use_list; -+ -+#define gfc_get_use_list() \ -+ (gfc_use_list *) gfc_getmem(sizeof(gfc_use_list)) -+ - /* Within a namespace, symbols are pointed to by symtree nodes that - are linked together in a balanced binary tree. There can be - several symtrees pointing to the same symbol node via USE -@@ -1189,6 +1218,9 @@ typedef struct gfc_namespace - /* A list of all alternate entry points to this procedure (or NULL). */ - gfc_entry_list *entries; - -+ /* A list of USE statements in this namespace. */ -+ gfc_use_list *use_stmts; -+ - /* Set to 1 if namespace is a BLOCK DATA program unit. */ - int is_block_data; - -@@ -2340,6 +2372,7 @@ void gfc_module_init_2 (void); - void gfc_module_done_2 (void); - void gfc_dump_module (const char *, int); - bool gfc_check_access (gfc_access, gfc_access); -+void gfc_free_use_stmts (gfc_use_list *); - - /* primary.c */ - symbol_attribute gfc_variable_attr (gfc_expr *, gfc_typespec *); ---- gcc/fortran/symbol.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/symbol.c 2008-08-21 10:21:30.000000000 +0200 -@@ -2903,6 +2903,7 @@ gfc_free_namespace (gfc_namespace *ns) - - gfc_free_equiv (ns->equiv); - gfc_free_equiv_lists (ns->equiv_lists); -+ gfc_free_use_stmts (ns->use_stmts); - - for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++) - gfc_free_interface (ns->operator[i]); ---- gcc/fortran/trans-types.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/trans-types.c 2008-08-21 10:21:30.000000000 +0200 -@@ -1934,12 +1934,23 @@ gfc_get_derived_type (gfc_symbol * deriv - - gfc_finish_type (typenode); - gfc_set_decl_location (TYPE_STUB_DECL (typenode), &derived->declared_at); -+ if (derived->module && derived->ns->proc_name->attr.flavor == FL_MODULE) -+ { -+ if (derived->ns->proc_name->backend_decl -+ && TREE_CODE (derived->ns->proc_name->backend_decl) -+ == NAMESPACE_DECL) -+ { -+ TYPE_CONTEXT (typenode) = derived->ns->proc_name->backend_decl; -+ DECL_CONTEXT (TYPE_STUB_DECL (typenode)) -+ = derived->ns->proc_name->backend_decl; -+ } -+ } - - derived->backend_decl = typenode; - -- /* Add this backend_decl to all the other, equal derived types. */ -- for (dt = gfc_derived_types; dt; dt = dt->next) -- copy_dt_decls_ifequal (derived, dt->derived); -+ /* Add this backend_decl to all the other, equal derived types. */ -+ for (dt = gfc_derived_types; dt; dt = dt->next) -+ copy_dt_decls_ifequal (derived, dt->derived); - - return derived->backend_decl; - } ---- gcc/fortran/trans.h.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/trans.h 2008-08-21 10:21:30.000000000 +0200 -@@ -429,6 +429,16 @@ void gfc_generate_block_data (gfc_namesp - /* Output a decl for a module variable. */ - void gfc_generate_module_vars (gfc_namespace *); - -+struct module_htab_entry GTY(()) -+{ -+ const char *name; -+ tree namespace_decl; -+ htab_t GTY ((param_is (union tree_node))) decls; -+}; -+ -+struct module_htab_entry *gfc_find_module (const char *); -+void gfc_module_add_decl (struct module_htab_entry *, tree); -+ - /* Get and set the current location. */ - void gfc_set_backend_locus (locus *); - void gfc_get_backend_locus (locus *); ---- gcc/fortran/trans-decl.c 2008-08-21 11:56:09.000000000 +0200 -+++ gcc/fortran/trans-decl.c 2008-08-22 21:31:28.000000000 +0200 -@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. - #include "function.h" - #include "flags.h" - #include "cgraph.h" -+#include "debug.h" - #include "gfortran.h" - #include "trans.h" - #include "trans-types.h" -@@ -982,7 +983,11 @@ gfc_get_symbol_decl (gfc_symbol * sym) - This is done here rather than in gfc_finish_var_decl because it - is different for string length variables. */ - if (sym->module) -- SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym)); -+ { -+ SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_identifier (sym)); -+ if (sym->attr.use_assoc) -+ DECL_IGNORED_P (decl) = 1; -+ } - - if (sym->attr.dimension) - { -@@ -1247,7 +1252,9 @@ build_function_decl (gfc_symbol * sym) - - /* Allow only one nesting level. Allow public declarations. */ - gcc_assert (current_function_decl == NULL_TREE -- || DECL_CONTEXT (current_function_decl) == NULL_TREE); -+ || DECL_CONTEXT (current_function_decl) == NULL_TREE -+ || TREE_CODE (DECL_CONTEXT (current_function_decl)) -+ == NAMESPACE_DECL); - - type = gfc_get_function_type (sym); - fndecl = build_decl (FUNCTION_DECL, gfc_sym_identifier (sym), type); -@@ -2790,6 +2797,88 @@ gfc_trans_deferred_vars (gfc_symbol * pr - return gfc_finish_block (&body); - } - -+static GTY ((param_is (struct module_htab_entry))) htab_t module_htab; -+ -+/* Hash and equality functions for module_htab. */ -+ -+static hashval_t -+module_htab_do_hash (const void *x) -+{ -+ return htab_hash_string (((const struct module_htab_entry *)x)->name); -+} -+ -+static int -+module_htab_eq (const void *x1, const void *x2) -+{ -+ return strcmp ((((const struct module_htab_entry *)x1)->name), -+ (const char *)x2) == 0; -+} -+ -+/* Hash and equality functions for module_htab's decls. */ -+ -+static hashval_t -+module_htab_decls_hash (const void *x) -+{ -+ const_tree t = (const_tree) x; -+ const_tree n = DECL_NAME (t); -+ if (n == NULL_TREE) -+ n = TYPE_NAME (TREE_TYPE (t)); -+ return htab_hash_string (IDENTIFIER_POINTER (n)); -+} -+ -+static int -+module_htab_decls_eq (const void *x1, const void *x2) -+{ -+ const_tree t1 = (const_tree) x1; -+ const_tree n1 = DECL_NAME (t1); -+ if (n1 == NULL_TREE) -+ n1 = TYPE_NAME (TREE_TYPE (t1)); -+ return strcmp (IDENTIFIER_POINTER (n1), (const char *) x2) == 0; -+} -+ -+struct module_htab_entry * -+gfc_find_module (const char *name) -+{ -+ void **slot; -+ -+ if (! module_htab) -+ module_htab = htab_create_ggc (10, module_htab_do_hash, -+ module_htab_eq, NULL); -+ -+ slot = htab_find_slot_with_hash (module_htab, name, -+ htab_hash_string (name), INSERT); -+ if (*slot == NULL) -+ { -+ struct module_htab_entry *entry = GGC_CNEW (struct module_htab_entry); -+ -+ entry->name = gfc_get_string (name); -+ entry->decls = htab_create_ggc (10, module_htab_decls_hash, -+ module_htab_decls_eq, NULL); -+ *slot = (void *) entry; -+ } -+ return (struct module_htab_entry *) *slot; -+} -+ -+void -+gfc_module_add_decl (struct module_htab_entry *entry, tree decl) -+{ -+ void **slot; -+ const char *name; -+ -+ if (DECL_NAME (decl)) -+ name = IDENTIFIER_POINTER (DECL_NAME (decl)); -+ else -+ { -+ gcc_assert (TREE_CODE (decl) == TYPE_DECL); -+ name = IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (decl))); -+ } -+ slot = htab_find_slot_with_hash (entry->decls, name, -+ htab_hash_string (name), INSERT); -+ if (*slot == NULL) -+ *slot = (void *) decl; -+} -+ -+static struct module_htab_entry *cur_module; - - /* Output an initialized decl for a module variable. */ - -@@ -2809,6 +2898,22 @@ gfc_create_module_variable (gfc_symbol * - && sym->ts.type == BT_DERIVED) - sym->backend_decl = gfc_typenode_for_spec (&(sym->ts)); - -+ if (sym->attr.flavor == FL_DERIVED -+ && sym->backend_decl -+ && TREE_CODE (sym->backend_decl) == RECORD_TYPE) -+ { -+ decl = sym->backend_decl; -+ gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE); -+ gcc_assert (TYPE_CONTEXT (decl) == NULL_TREE -+ || TYPE_CONTEXT (decl) == sym->ns->proc_name->backend_decl); -+ gcc_assert (DECL_CONTEXT (TYPE_STUB_DECL (decl)) == NULL_TREE -+ || DECL_CONTEXT (TYPE_STUB_DECL (decl)) -+ == sym->ns->proc_name->backend_decl); -+ TYPE_CONTEXT (decl) = sym->ns->proc_name->backend_decl; -+ DECL_CONTEXT (TYPE_STUB_DECL (decl)) = sym->ns->proc_name->backend_decl; -+ gfc_module_add_decl (cur_module, TYPE_STUB_DECL (decl)); -+ } -+ - /* Only output variables and array valued, or derived type, - parameters. */ - if (sym->attr.flavor != FL_VARIABLE -@@ -2816,6 +2921,15 @@ gfc_create_module_variable (gfc_symbol * - && (sym->attr.dimension || sym->ts.type == BT_DERIVED))) - return; - -+ if ((sym->attr.in_common || sym->attr.in_equivalence) && sym->backend_decl) -+ { -+ decl = sym->backend_decl; -+ gcc_assert (DECL_CONTEXT (decl) == NULL_TREE); -+ gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE); -+ DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl; -+ gfc_module_add_decl (cur_module, decl); -+ } -+ - /* Don't generate variables from other modules. Variables from - COMMONs will already have been generated. */ - if (sym->attr.use_assoc || sym->attr.in_common) -@@ -2823,8 +2937,8 @@ gfc_create_module_variable (gfc_symbol * - - /* Equivalenced variables arrive here after creation. */ - if (sym->backend_decl -- && (sym->equiv_built || sym->attr.in_equivalence)) -- return; -+ && (sym->equiv_built || sym->attr.in_equivalence)) -+ return; - - if (sym->backend_decl) - internal_error ("backend decl for module variable %s already exists", -@@ -2837,7 +2951,11 @@ gfc_create_module_variable (gfc_symbol * - - /* Create the variable. */ - pushdecl (decl); -+ gcc_assert (DECL_CONTEXT (decl) == NULL_TREE); -+ gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE); -+ DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl; - rest_of_decl_compilation (decl, 1, 0); -+ gfc_module_add_decl (cur_module, decl); - - /* Also add length of strings. */ - if (sym->ts.type == BT_CHARACTER) -@@ -2860,6 +2978,7 @@ void - gfc_generate_module_vars (gfc_namespace * ns) - { - module_namespace = ns; -+ cur_module = gfc_find_module (ns->proc_name->name); - - /* Check if the frontend left the namespace in a reasonable state. */ - gcc_assert (ns->proc_name && !ns->proc_name->tlink); -@@ -2869,6 +2988,79 @@ gfc_generate_module_vars (gfc_namespace - - /* Create decls for all the module variables. */ - gfc_traverse_ns (ns, gfc_create_module_variable); -+ -+ cur_module = NULL; -+} -+ -+static void -+gfc_trans_use_stmts (gfc_namespace * ns) -+{ -+ gfc_use_list *use_stmt; -+ for (use_stmt = ns->use_stmts; use_stmt; use_stmt = use_stmt->next) -+ { -+ struct module_htab_entry *entry -+ = gfc_find_module (use_stmt->module_name); -+ gfc_use_rename *rent; -+ -+ if (entry->namespace_decl == NULL) -+ { -+ entry->namespace_decl -+ = build_decl (NAMESPACE_DECL, -+ get_identifier (use_stmt->module_name), -+ void_type_node); -+ DECL_EXTERNAL (entry->namespace_decl) = 1; -+ } -+ if (!use_stmt->only_flag) -+ (*debug_hooks->imported_module_or_decl) (entry->namespace_decl, -+ NULL_TREE, -+ ns->proc_name->backend_decl, -+ false); -+ for (rent = use_stmt->rename; rent; rent = rent->next) -+ { -+ tree decl, local_name; -+ void **slot; -+ -+ if (rent->operator != INTRINSIC_NONE) -+ continue; -+ -+ slot = htab_find_slot_with_hash (entry->decls, rent->use_name, -+ htab_hash_string (rent->use_name), -+ INSERT); -+ if (*slot == NULL) -+ { -+ gfc_symtree *st; -+ -+ st = gfc_find_symtree (ns->sym_root, -+ rent->local_name[0] -+ ? rent->local_name : rent->use_name); -+ gcc_assert (st && st->n.sym->attr.use_assoc); -+ if (st->n.sym->backend_decl && DECL_P (st->n.sym->backend_decl)) -+ { -+ gcc_assert (DECL_EXTERNAL (entry->namespace_decl)); -+ decl = copy_node (st->n.sym->backend_decl); -+ DECL_CONTEXT (decl) = entry->namespace_decl; -+ DECL_EXTERNAL (decl) = 1; -+ DECL_IGNORED_P (decl) = 0; -+ DECL_INITIAL (decl) = NULL_TREE; -+ } -+ else -+ { -+ *slot = error_mark_node; -+ htab_clear_slot (entry->decls, slot); -+ continue; -+ } -+ *slot = decl; -+ } -+ decl = (tree) *slot; -+ if (rent->local_name[0]) -+ local_name = get_identifier (rent->local_name); -+ else -+ local_name = NULL_TREE; -+ (*debug_hooks->imported_module_or_decl) (decl, local_name, -+ ns->proc_name->backend_decl, -+ !use_stmt->only_flag); -+ } -+ } - } - - static void -@@ -3373,6 +3567,8 @@ gfc_generate_function_code (gfc_namespac - gfc_gimplify_function (fndecl); - cgraph_finalize_function (fndecl, false); - } -+ -+ gfc_trans_use_stmts (ns); - } - - void -@@ -3464,6 +3660,7 @@ gfc_generate_block_data (gfc_namespace * - decl = build_decl (VAR_DECL, id, gfc_array_index_type); - TREE_PUBLIC (decl) = 1; - TREE_STATIC (decl) = 1; -+ DECL_IGNORED_P (decl) = 1; - - pushdecl (decl); - rest_of_decl_compilation (decl, 1, 0); ---- gcc/fortran/trans-common.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/fortran/trans-common.c 2008-08-21 10:21:30.000000000 +0200 -@@ -416,6 +416,7 @@ build_common_decl (gfc_common_head *com, - SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_common_id (com)); - TREE_PUBLIC (decl) = 1; - TREE_STATIC (decl) = 1; -+ DECL_IGNORED_P (decl) = 1; - if (!com->is_bind_c) - DECL_ALIGN (decl) = BIGGEST_ALIGNMENT; - else -@@ -680,6 +681,8 @@ create_common (gfc_common_head *com, seg - TREE_PUBLIC (var_decl) = TREE_PUBLIC (decl); - TREE_STATIC (var_decl) = TREE_STATIC (decl); - TREE_USED (var_decl) = TREE_USED (decl); -+ if (s->sym->attr.use_assoc) -+ DECL_IGNORED_P (var_decl) = 1; - if (s->sym->attr.target) - TREE_ADDRESSABLE (var_decl) = 1; - /* This is a fake variable just for debugging purposes. */ ---- gcc/cp/name-lookup.c.jj 2008-08-21 10:19:52.000000000 +0200 -+++ gcc/cp/name-lookup.c 2008-08-21 10:21:30.000000000 +0200 -@@ -3401,7 +3401,8 @@ do_using_directive (tree namespace) - - /* Emit debugging info. */ - if (!processing_template_decl) -- (*debug_hooks->imported_module_or_decl) (namespace, context); -+ (*debug_hooks->imported_module_or_decl) (namespace, NULL_TREE, -+ context, false); - } - - /* Deal with a using-directive seen by the parser. Currently we only -@@ -5234,7 +5235,7 @@ cp_emit_debug_info_for_using (tree t, tr - /* FIXME: Handle TEMPLATE_DECLs. */ - for (t = OVL_CURRENT (t); t; t = OVL_NEXT (t)) - if (TREE_CODE (t) != TEMPLATE_DECL) -- (*debug_hooks->imported_module_or_decl) (t, context); -+ (*debug_hooks->imported_module_or_decl) (t, NULL_TREE, context, false); - } - - #include "gt-cp-name-lookup.h" ---- gcc/debug.h.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/debug.h 2008-08-21 10:21:30.000000000 +0200 -@@ -98,7 +98,8 @@ struct gcc_debug_hooks - void (* type_decl) (tree decl, int local); - - /* Debug information for imported modules and declarations. */ -- void (* imported_module_or_decl) (tree decl, tree context); -+ void (* imported_module_or_decl) (tree decl, tree name, -+ tree context, bool child); - - /* DECL is an inline function, whose body is present, but which is - not being output at this point. */ -@@ -139,7 +140,7 @@ extern void debug_nothing_int (unsigned - extern void debug_nothing_int_int (unsigned int, unsigned int); - extern void debug_nothing_tree (tree); - extern void debug_nothing_tree_int (tree, int); --extern void debug_nothing_tree_tree (tree, tree); -+extern void debug_nothing_tree_tree_tree_bool (tree, tree, tree, bool); - extern bool debug_true_const_tree (const_tree); - extern void debug_nothing_rtx (rtx); - ---- gcc/vmsdbgout.c.jj 2008-08-21 10:19:48.000000000 +0200 -+++ gcc/vmsdbgout.c 2008-08-21 10:21:30.000000000 +0200 -@@ -204,7 +204,7 @@ const struct gcc_debug_hooks vmsdbg_debu - vmsdbgout_decl, - vmsdbgout_global_decl, - debug_nothing_tree_int, /* type_decl */ -- debug_nothing_tree_tree, /* imported_module_or_decl */ -+ debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */ - debug_nothing_tree, /* deferred_inline_function */ - vmsdbgout_abstract_function, - debug_nothing_rtx, /* label */ ---- gcc/dbxout.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/dbxout.c 2008-08-21 10:21:30.000000000 +0200 -@@ -369,7 +369,7 @@ const struct gcc_debug_hooks dbx_debug_h - dbxout_function_decl, - dbxout_global_decl, /* global_decl */ - dbxout_type_decl, /* type_decl */ -- debug_nothing_tree_tree, /* imported_module_or_decl */ -+ debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */ - debug_nothing_tree, /* deferred_inline_function */ - debug_nothing_tree, /* outlining_inline_function */ - debug_nothing_rtx, /* label */ -@@ -401,7 +401,7 @@ const struct gcc_debug_hooks xcoff_debug - debug_nothing_tree, /* function_decl */ - dbxout_global_decl, /* global_decl */ - dbxout_type_decl, /* type_decl */ -- debug_nothing_tree_tree, /* imported_module_or_decl */ -+ debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */ - debug_nothing_tree, /* deferred_inline_function */ - debug_nothing_tree, /* outlining_inline_function */ - debug_nothing_rtx, /* label */ ---- gcc/debug.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/debug.c 2008-08-21 10:21:30.000000000 +0200 -@@ -42,7 +42,7 @@ const struct gcc_debug_hooks do_nothing_ - debug_nothing_tree, /* function_decl */ - debug_nothing_tree, /* global_decl */ - debug_nothing_tree_int, /* type_decl */ -- debug_nothing_tree_tree, /* imported_module_or_decl */ -+ debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */ - debug_nothing_tree, /* deferred_inline_function */ - debug_nothing_tree, /* outlining_inline_function */ - debug_nothing_rtx, /* label */ -@@ -66,8 +66,10 @@ debug_nothing_tree (tree decl ATTRIBUTE_ - } - - void --debug_nothing_tree_tree (tree t1 ATTRIBUTE_UNUSED, -- tree t2 ATTRIBUTE_UNUSED) -+debug_nothing_tree_tree_tree_bool (tree t1 ATTRIBUTE_UNUSED, -+ tree t2 ATTRIBUTE_UNUSED, -+ tree t3 ATTRIBUTE_UNUSED, -+ bool b1 ATTRIBUTE_UNUSED) - { - } - ---- gcc/dwarf2out.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-21 13:15:41.000000000 +0200 -@@ -3910,7 +3910,7 @@ static void dwarf2out_end_block (unsigne - static bool dwarf2out_ignore_block (const_tree); - static void dwarf2out_global_decl (tree); - static void dwarf2out_type_decl (tree, int); --static void dwarf2out_imported_module_or_decl (tree, tree); -+static void dwarf2out_imported_module_or_decl (tree, tree, tree, bool); - static void dwarf2out_abstract_function (tree); - static void dwarf2out_var_location (rtx); - static void dwarf2out_begin_function (tree); -@@ -4541,7 +4541,7 @@ static void gen_decl_die (tree, dw_die_r - static dw_die_ref force_decl_die (tree); - static dw_die_ref force_type_die (tree); - static dw_die_ref setup_namespace_context (tree, dw_die_ref); --static void declare_in_namespace (tree, dw_die_ref); -+static dw_die_ref declare_in_namespace (tree, dw_die_ref); - static struct dwarf_file_data * lookup_filename (const char *); - static void retry_incomplete_types (void); - static void gen_type_die_for_member (tree, tree, dw_die_ref); -@@ -6621,7 +6621,8 @@ is_symbol_die (dw_die_ref c) - return (is_type_die (c) - || (get_AT (c, DW_AT_declaration) - && !get_AT (c, DW_AT_specification)) -- || c->die_tag == DW_TAG_namespace); -+ || c->die_tag == DW_TAG_namespace -+ || c->die_tag == DW_TAG_module); - } - - static char * -@@ -12898,29 +12899,49 @@ gen_variable_die (tree decl, dw_die_ref - com_decl = fortran_common (decl, &off); - - /* Symbol in common gets emitted as a child of the common block, in the form -- of a data member. -- -- ??? This creates a new common block die for every common block symbol. -- Better to share same common block die for all symbols in that block. */ -+ of a data member. */ - if (com_decl) - { - tree field; - dw_die_ref com_die; -- const char *cnam = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl)); -- dw_loc_descr_ref loc = loc_descriptor_from_tree (com_decl); - -+ if (lookup_decl_die (decl)) -+ return; - field = TREE_OPERAND (DECL_VALUE_EXPR (decl), 0); -- var_die = new_die (DW_TAG_common_block, context_die, decl); -- add_name_and_src_coords_attributes (var_die, field); -- add_AT_flag (var_die, DW_AT_external, 1); -- add_AT_loc (var_die, DW_AT_location, loc); -+ var_die = lookup_decl_die (com_decl); -+ if (var_die == NULL) -+ { -+ const char *cnam -+ = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl)); -+ dw_loc_descr_ref loc = loc_descriptor_from_tree (com_decl); -+ -+ var_die = new_die (DW_TAG_common_block, context_die, decl); -+ add_name_and_src_coords_attributes (var_die, com_decl); -+ add_AT_flag (var_die, DW_AT_external, 1); -+ if (loc) -+ add_AT_loc (var_die, DW_AT_location, loc); -+ else if (DECL_EXTERNAL (decl)) -+ add_AT_flag (var_die, DW_AT_declaration, 1); -+ add_pubname_string (cnam, var_die); /* ??? needed? */ -+ equate_decl_number_to_die (com_decl, var_die); -+ } -+ else if (get_AT (var_die, DW_AT_location) == NULL) -+ { -+ dw_loc_descr_ref loc = loc_descriptor_from_tree (com_decl); -+ -+ if (loc) -+ { -+ add_AT_loc (var_die, DW_AT_location, loc); -+ remove_AT (var_die, DW_AT_declaration); -+ } -+ } - com_die = new_die (DW_TAG_member, var_die, decl); - add_name_and_src_coords_attributes (com_die, decl); - add_type_attribute (com_die, TREE_TYPE (decl), TREE_READONLY (decl), - TREE_THIS_VOLATILE (decl), context_die); - add_AT_loc (com_die, DW_AT_data_member_location, - int_loc_descriptor (off)); -- add_pubname_string (cnam, var_die); /* ??? needed? */ -+ equate_decl_number_to_die (decl, com_die); - return; - } - -@@ -13685,7 +13706,7 @@ gen_type_die_with_usage (tree type, dw_d - } - else - { -- declare_in_namespace (type, context_die); -+ context_die = declare_in_namespace (type, context_die); - need_pop = 0; - } - -@@ -14057,29 +14078,32 @@ setup_namespace_context (tree thing, dw_ - For compatibility with older debuggers, namespace DIEs only contain - declarations; all definitions are emitted at CU scope. */ - --static void -+static dw_die_ref - declare_in_namespace (tree thing, dw_die_ref context_die) - { - dw_die_ref ns_context; - - if (debug_info_level <= DINFO_LEVEL_TERSE) -- return; -+ return context_die; - - /* If this decl is from an inlined function, then don't try to emit it in its - namespace, as we will get confused. It would have already been emitted - when the abstract instance of the inline function was emitted anyways. */ - if (DECL_P (thing) && DECL_ABSTRACT_ORIGIN (thing)) -- return; -+ return context_die; - - ns_context = setup_namespace_context (thing, context_die); - - if (ns_context != context_die) - { -+ if (is_fortran ()) -+ return ns_context; - if (DECL_P (thing)) - gen_decl_die (thing, ns_context); - else - gen_type_die (thing, ns_context); - } -+ return context_die; - } - - /* Generate a DIE for a namespace or namespace alias. */ -@@ -14095,8 +14119,11 @@ gen_namespace_die (tree decl) - { - /* Output a real namespace. */ - dw_die_ref namespace_die -- = new_die (DW_TAG_namespace, context_die, decl); -+ = new_die (is_fortran () ? DW_TAG_module : DW_TAG_namespace, -+ context_die, decl); - add_name_and_src_coords_attributes (namespace_die, decl); -+ if (DECL_EXTERNAL (decl)) -+ add_AT_flag (namespace_die, DW_AT_declaration, 1); - equate_decl_number_to_die (decl, namespace_die); - } - else -@@ -14186,7 +14213,7 @@ gen_decl_die (tree decl, dw_die_ref cont - gen_type_die_for_member (origin, decl, context_die); - - /* And its containing namespace. */ -- declare_in_namespace (decl, context_die); -+ context_die = declare_in_namespace (decl, context_die); - } - - /* Now output a DIE to represent the function itself. */ -@@ -14231,16 +14258,6 @@ gen_decl_die (tree decl, dw_die_ref cont - if (debug_info_level <= DINFO_LEVEL_TERSE) - break; - -- /* If this is the global definition of the Fortran COMMON block, we don't -- need to do anything. Syntactically, the block itself has no identity, -- just its constituent identifiers. */ -- if (TREE_CODE (decl) == VAR_DECL -- && TREE_PUBLIC (decl) -- && TREE_STATIC (decl) -- && is_fortran () -- && !DECL_HAS_VALUE_EXPR_P (decl)) -- break; -- - /* Output any DIEs that are needed to specify the type of this data - object. */ - if (TREE_CODE (decl) == RESULT_DECL && DECL_BY_REFERENCE (decl)) -@@ -14254,7 +14271,7 @@ gen_decl_die (tree decl, dw_die_ref cont - gen_type_die_for_member (origin, decl, context_die); - - /* And its containing namespace. */ -- declare_in_namespace (decl, context_die); -+ context_die = declare_in_namespace (decl, context_die); - - /* Now output the DIE to represent the data object itself. This gets - complicated because of the possibility that the VAR_DECL really -@@ -14307,15 +14324,7 @@ dwarf2out_global_decl (tree decl) - /* Output DWARF2 information for file-scope tentative data object - declarations, file-scope (extern) function declarations (which had no - corresponding body) and file-scope tagged type declarations and -- definitions which have not yet been forced out. -- -- Ignore the global decl of any Fortran COMMON blocks which also wind up here -- though they have already been described in the local scope for the -- procedures using them. */ -- if (TREE_CODE (decl) == VAR_DECL -- && TREE_PUBLIC (decl) && TREE_STATIC (decl) && is_fortran ()) -- return; -- -+ definitions which have not yet been forced out. */ - if (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)) - dwarf2out_decl (decl); - } -@@ -14329,10 +14338,14 @@ dwarf2out_type_decl (tree decl, int loca - dwarf2out_decl (decl); - } - --/* Output debug information for imported module or decl. */ -+/* Output debug information for imported module or decl DECL. -+ NAME is non-NULL name in context if the decl has been renamed. -+ CHILD is true if decl is one of the renamed decls as part of -+ importing whole module. */ - - static void --dwarf2out_imported_module_or_decl (tree decl, tree context) -+dwarf2out_imported_module_or_decl (tree decl, tree name, tree context, -+ bool child) - { - dw_die_ref imported_die, at_import_die; - dw_die_ref scope_die; -@@ -14355,6 +14368,14 @@ dwarf2out_imported_module_or_decl (tree - return; - scope_die = get_context_die (context); - -+ if (child) -+ { -+ gcc_assert (scope_die->die_child); -+ gcc_assert (scope_die->die_child->die_tag == DW_TAG_imported_module); -+ gcc_assert (TREE_CODE (decl) != NAMESPACE_DECL); -+ scope_die = scope_die->die_child; -+ } -+ - /* For TYPE_DECL or CONST_DECL, lookup TREE_TYPE. */ - if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL) - { -@@ -14405,6 +14426,8 @@ dwarf2out_imported_module_or_decl (tree - xloc = expand_location (input_location); - add_AT_file (imported_die, DW_AT_decl_file, lookup_filename (xloc.file)); - add_AT_unsigned (imported_die, DW_AT_decl_line, xloc.line); -+ if (name) -+ add_AT_string (imported_die, DW_AT_name, IDENTIFIER_POINTER (name)); - add_AT_die_ref (imported_die, DW_AT_import, at_import_die); - } - ---- gcc/sdbout.c.jj 2008-08-21 10:19:49.000000000 +0200 -+++ gcc/sdbout.c 2008-08-21 10:21:30.000000000 +0200 -@@ -329,7 +329,7 @@ const struct gcc_debug_hooks sdb_debug_h - debug_nothing_tree, /* function_decl */ - sdbout_global_decl, /* global_decl */ - sdbout_symbol, /* type_decl */ -- debug_nothing_tree_tree, /* imported_module_or_decl */ -+ debug_nothing_tree_tree_tree_bool, /* imported_module_or_decl */ - debug_nothing_tree, /* deferred_inline_function */ - debug_nothing_tree, /* outlining_inline_function */ - sdbout_label, /* label */ diff --git a/gcc43-fortran-debug3.patch b/gcc43-fortran-debug3.patch deleted file mode 100644 index ea01f8a..0000000 --- a/gcc43-fortran-debug3.patch +++ /dev/null @@ -1,82 +0,0 @@ -2008-08-21 Jakub Jelinek - - * trans-decl.c (gfc_build_qualified_array): Build non-flat - array type for debug info purposes. - * dwarf2out.c (add_bound_info): If lookup_decl_die failed, try - loc_descriptor_from_tree_1. - ---- gcc/fortran/trans-decl.c.jj 2008-08-21 11:56:09.000000000 +0200 -+++ gcc/fortran/trans-decl.c 2008-08-21 23:07:01.000000000 +0200 -@@ -703,6 +703,50 @@ gfc_build_qualified_array (tree decl, gf - TYPE_DOMAIN (type) = range; - layout_type (type); - } -+ -+ if (nest || write_symbols == NO_DEBUG) -+ return; -+ -+ if (TYPE_NAME (type) != NULL_TREE -+ && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE -+ && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL) -+ { -+ tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type)); -+ -+ for (dim = 0; dim < sym->as->rank - 1; dim++) -+ { -+ gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE); -+ gtype = TREE_TYPE (gtype); -+ } -+ gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE); -+ if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL) -+ TYPE_NAME (type) = NULL_TREE; -+ } -+ -+ if (TYPE_NAME (type) == NULL_TREE) -+ { -+ tree gtype = TREE_TYPE (type), rtype, type_decl; -+ -+ for (dim = sym->as->rank - 1; dim >= 0; dim--) -+ { -+ rtype = build_range_type (gfc_array_index_type, -+ GFC_TYPE_ARRAY_LBOUND (type, dim), -+ GFC_TYPE_ARRAY_UBOUND (type, dim)); -+ gtype = build_array_type (gtype, rtype); -+ /* Ensure the bound variables aren't optimized out at -O0. */ -+ if (!optimize) -+ { -+ if (GFC_TYPE_ARRAY_LBOUND (type, dim) -+ && TREE_CODE (GFC_TYPE_ARRAY_LBOUND (type, dim)) == VAR_DECL) -+ DECL_IGNORED_P (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 0; -+ if (GFC_TYPE_ARRAY_UBOUND (type, dim) -+ && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, dim)) == VAR_DECL) -+ DECL_IGNORED_P (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 0; -+ } -+ } -+ TYPE_NAME (type) = type_decl = build_decl (TYPE_DECL, NULL, gtype); -+ DECL_ORIGINAL_TYPE (type_decl) = gtype; -+ } - } - - ---- gcc/dwarf2out.c.jj 2008-08-21 13:15:41.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-21 18:27:30.000000000 +0200 -@@ -11943,6 +11943,7 @@ add_bound_info (dw_die_ref subrange_die, - case RESULT_DECL: - { - dw_die_ref decl_die = lookup_decl_die (bound); -+ dw_loc_descr_ref loc; - - /* ??? Can this happen, or should the variable have been bound - first? Probably it can, since I imagine that we try to create -@@ -11951,6 +11952,11 @@ add_bound_info (dw_die_ref subrange_die, - later parameter. */ - if (decl_die != NULL) - add_AT_die_ref (subrange_die, bound_attr, decl_die); -+ else -+ { -+ loc = loc_descriptor_from_tree_1 (bound, 0); -+ add_AT_location_description (subrange_die, bound_attr, loc); -+ } - break; - } - diff --git a/gcc43-fortran-debug4.patch b/gcc43-fortran-debug4.patch deleted file mode 100644 index 43f81cf..0000000 --- a/gcc43-fortran-debug4.patch +++ /dev/null @@ -1,112 +0,0 @@ -2008-08-22 Jakub Jelinek - - PR fortran/23057 - * dwarf2out.c (gen_variable_die): Represent Fortran COMMON vars - as DW_TAG_variable children of DW_TAG_common_block rather than - DW_TAG_member children. Put DW_AT_external to individual - DW_TAG_variable DIEs, not to DW_TAG_common_block. - - * gfortran.dg/debug/pr35154-dwarf2.f: Adjust for replacement - of DW_TAG_member with DW_TAG_variable. - ---- gcc/dwarf2out.c.jj 2008-08-21 18:27:30.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-22 12:12:56.000000000 +0200 -@@ -13540,43 +13540,66 @@ gen_variable_die (tree decl, dw_die_ref - { - tree field; - dw_die_ref com_die; -+ dw_loc_descr_ref loc; - -- if (lookup_decl_die (decl)) -- return; -+ com_die = lookup_decl_die (decl); -+ if (com_die) -+ { -+ if (get_AT (com_die, DW_AT_location) == NULL) -+ { -+ loc = loc_descriptor_from_tree (com_decl); -+ if (loc) -+ { -+ if (off) -+ add_loc_descr (&loc, new_loc_descr (DW_OP_plus_uconst, -+ off, 0)); -+ add_AT_loc (com_die, DW_AT_location, loc); -+ remove_AT (com_die, DW_AT_declaration); -+ } -+ } -+ return; -+ } - field = TREE_OPERAND (DECL_VALUE_EXPR (decl), 0); - var_die = lookup_decl_die (com_decl); -+ loc = loc_descriptor_from_tree (com_decl); - if (var_die == NULL) - { - const char *cnam - = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl)); -- dw_loc_descr_ref loc = loc_descriptor_from_tree (com_decl); - - var_die = new_die (DW_TAG_common_block, context_die, decl); - add_name_and_src_coords_attributes (var_die, com_decl); -- add_AT_flag (var_die, DW_AT_external, 1); - if (loc) -- add_AT_loc (var_die, DW_AT_location, loc); -+ { -+ add_AT_loc (var_die, DW_AT_location, loc); -+ /* Avoid sharing the same loc descriptor between -+ DW_TAG_common_block and DW_TAG_variable. */ -+ loc = loc_descriptor_from_tree (com_decl); -+ } - else if (DECL_EXTERNAL (decl)) - add_AT_flag (var_die, DW_AT_declaration, 1); - add_pubname_string (cnam, var_die); /* ??? needed? */ - equate_decl_number_to_die (com_decl, var_die); - } -- else if (get_AT (var_die, DW_AT_location) == NULL) -+ else if (get_AT (var_die, DW_AT_location) == NULL && loc) - { -- dw_loc_descr_ref loc = loc_descriptor_from_tree (com_decl); -- -- if (loc) -- { -- add_AT_loc (var_die, DW_AT_location, loc); -- remove_AT (var_die, DW_AT_declaration); -- } -+ add_AT_loc (var_die, DW_AT_location, loc); -+ loc = loc_descriptor_from_tree (com_decl); -+ remove_AT (var_die, DW_AT_declaration); - } -- com_die = new_die (DW_TAG_member, var_die, decl); -+ com_die = new_die (DW_TAG_variable, var_die, decl); - add_name_and_src_coords_attributes (com_die, decl); - add_type_attribute (com_die, TREE_TYPE (decl), TREE_READONLY (decl), - TREE_THIS_VOLATILE (decl), context_die); -- add_AT_loc (com_die, DW_AT_data_member_location, -- int_loc_descriptor (off)); -+ add_AT_flag (com_die, DW_AT_external, 1); -+ if (loc) -+ { -+ if (off) -+ add_loc_descr (&loc, new_loc_descr (DW_OP_plus_uconst, off, 0)); -+ add_AT_loc (com_die, DW_AT_location, loc); -+ } -+ else if (DECL_EXTERNAL (decl)) -+ add_AT_flag (com_die, DW_AT_declaration, 1); - equate_decl_number_to_die (decl, com_die); - return; - } ---- gcc/testsuite/gfortran.dg/debug/pr35154-dwarf2.f.jj 2008-04-27 12:42:44.000000000 +0200 -+++ gcc/testsuite/gfortran.dg/debug/pr35154-dwarf2.f 2008-08-22 10:56:44.000000000 +0200 -@@ -27,11 +27,11 @@ C { dg-options "-dA" } - - C { dg-final { scan-assembler "(DIE.*DW_TAG_common_block)" } } - C { dg-final { scan-assembler "DW_AT_name: \"__BLNK__\"" } } --C { dg-final { scan-assembler "(DIE.*DW_TAG_member)" } } -+C { dg-final { scan-assembler "(DIE.*DW_TAG_variable)" } } - C { dg-final { scan-assembler "\"i.*\".*DW_AT_name" } } - C { dg-final { scan-assembler "\"j.*\".*DW_AT_name" } } - C { dg-final { scan-assembler "(DIE.*DW_TAG_common_block)" } } - C { dg-final { scan-assembler "DW_AT_name: \"label\"" } } --C { dg-final { scan-assembler "(DIE.*DW_TAG_member)" } } -+C { dg-final { scan-assembler "(DIE.*DW_TAG_variable)" } } - C { dg-final { scan-assembler "\"l.*\".*DW_AT_name" } } - C { dg-final { scan-assembler "\"m.*\".*DW_AT_name" } } diff --git a/gcc43-fortran-debug5.patch b/gcc43-fortran-debug5.patch deleted file mode 100644 index abf24dc..0000000 --- a/gcc43-fortran-debug5.patch +++ /dev/null @@ -1,91 +0,0 @@ -2008-08-22 Jakub Jelinek - - * dwarf2out.c (loc_by_reference): New function. - (add_location_or_const_value_attribute): Use it. - ---- gcc/dwarf2out.c.jj 2008-08-22 12:12:56.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-22 13:39:21.000000000 +0200 -@@ -10971,6 +10971,32 @@ fortran_common (tree decl, HOST_WIDE_INT - return cvar; - } - -+/* Dereference a location expression LOC if DECL is passed by invisible -+ reference. */ -+ -+static dw_loc_descr_ref -+loc_by_reference (dw_loc_descr_ref loc, tree decl) -+{ -+ HOST_WIDE_INT size; -+ enum dwarf_location_atom op; -+ -+ if (loc == NULL) -+ return NULL; -+ -+ if ((TREE_CODE (decl) != PARM_DECL && TREE_CODE (decl) != RESULT_DECL) -+ || !DECL_BY_REFERENCE (decl)) -+ return loc; -+ -+ size = int_size_in_bytes (TREE_TYPE (decl)); -+ if (size > DWARF2_ADDR_SIZE || size == -1) -+ return 0; -+ else if (size == DWARF2_ADDR_SIZE) -+ op = DW_OP_deref; -+ else -+ op = DW_OP_deref_size; -+ add_loc_descr (&loc, new_loc_descr (op, size, 0)); -+ return loc; -+} - - /* Generate *either* a DW_AT_location attribute or else a DW_AT_const_value - data attribute for a variable or a parameter. We generate the -@@ -11029,8 +11055,8 @@ add_location_or_const_value_attribute (d - else - initialized = VAR_INIT_STATUS_INITIALIZED; - -- list = new_loc_list (loc_descriptor (varloc, initialized), -- node->label, node->next->label, secname, 1); -+ descr = loc_by_reference (loc_descriptor (varloc, initialized), decl); -+ list = new_loc_list (descr, node->label, node->next->label, secname, 1); - node = node->next; - - for (; node->next; node = node->next) -@@ -11041,8 +11067,9 @@ add_location_or_const_value_attribute (d - enum var_init_status initialized = - NOTE_VAR_LOCATION_STATUS (node->var_loc_note); - varloc = NOTE_VAR_LOCATION (node->var_loc_note); -- add_loc_descr_to_loc_list (&list, -- loc_descriptor (varloc, initialized), -+ descr = loc_by_reference (loc_descriptor (varloc, initialized), -+ decl); -+ add_loc_descr_to_loc_list (&list, descr, - node->label, node->next->label, secname); - } - -@@ -11063,8 +11090,9 @@ add_location_or_const_value_attribute (d - current_function_funcdef_no); - endname = ggc_strdup (label_id); - } -- add_loc_descr_to_loc_list (&list, -- loc_descriptor (varloc, initialized), -+ descr = loc_by_reference (loc_descriptor (varloc, initialized), -+ decl); -+ add_loc_descr_to_loc_list (&list, descr, - node->label, endname, secname); - } - -@@ -11094,6 +11122,7 @@ add_location_or_const_value_attribute (d - descr = loc_descriptor (NOTE_VAR_LOCATION (node->var_loc_note), status); - if (descr) - { -+ descr = loc_by_reference (descr, decl); - add_AT_location_description (die, attr, descr); - return; - } -@@ -11104,6 +11133,7 @@ add_location_or_const_value_attribute (d - descr = loc_descriptor_from_tree (decl); - if (descr) - { -+ descr = loc_by_reference (descr, decl); - add_AT_location_description (die, attr, descr); - return; - } diff --git a/gcc43-fortran-debug6.patch b/gcc43-fortran-debug6.patch deleted file mode 100644 index 2c66fc2..0000000 --- a/gcc43-fortran-debug6.patch +++ /dev/null @@ -1,17 +0,0 @@ -2008-08-22 Jakub Jelinek - - PR fortran/24790 - * trans-decl.c (create_function_arglist): Set DECL_BY_REFERENCE on - PARM_DECLs with pointer or reference type. - ---- gcc/fortran/trans-decl.c.jj 2008-08-21 23:07:01.000000000 +0200 -+++ gcc/fortran/trans-decl.c 2008-08-22 14:47:59.000000000 +0200 -@@ -1588,6 +1588,8 @@ create_function_arglist (gfc_symbol * sy - DECL_ARG_TYPE (parm) = TREE_VALUE (typelist); - /* All implementation args are read-only. */ - TREE_READONLY (parm) = 1; -+ if (POINTER_TYPE_P (type) && f->sym->attr.flavor != FL_PROCEDURE) -+ DECL_BY_REFERENCE (parm) = 1; - - gfc_finish_decl (parm); - diff --git a/gcc43-fortran-debug7.patch b/gcc43-fortran-debug7.patch deleted file mode 100644 index 39248f1..0000000 --- a/gcc43-fortran-debug7.patch +++ /dev/null @@ -1,82 +0,0 @@ -2008-08-22 Jakub Jelinek - - * dwarf2out.c (add_subscript_info): Stop on Fortran TYPE_STRING_FLAG - types. - (gen_array_type_die): Emit DW_TAG_string_type for Fortran character - types. - ---- gcc/dwarf2out.c.jj 2008-08-22 13:39:21.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-22 17:49:10.000000000 +0200 -@@ -11418,6 +11418,9 @@ add_subscript_info (dw_die_ref type_die, - { - tree domain = TYPE_DOMAIN (type); - -+ if (TYPE_STRING_FLAG (type) && is_fortran () && dimension_number > 0) -+ break; -+ - /* Arrays come in three flavors: Unspecified bounds, fixed bounds, - and (in GNU C only) variable bounds. Handle all three forms - here. */ -@@ -11940,6 +11943,39 @@ gen_array_type_die (tree type, dw_die_re - dw_die_ref array_die; - tree element_type; - -+ /* Emit DW_TAG_string_type for Fortran character types (with kind 1 only, as -+ DW_TAG_string_type doesn't have DW_AT_type attribute). */ -+ if (TYPE_STRING_FLAG (type) -+ && TREE_CODE (type) == ARRAY_TYPE -+ && is_fortran () -+ && TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (char_type_node)) -+ { -+ HOST_WIDE_INT size; -+ -+ array_die = new_die (DW_TAG_string_type, scope_die, type); -+ add_name_attribute (array_die, type_tag (type)); -+ equate_type_number_to_die (type, array_die); -+ size = int_size_in_bytes (type); -+ if (size >= 0) -+ add_AT_unsigned (array_die, DW_AT_byte_size, size); -+ else if (TYPE_DOMAIN (type) != NULL_TREE -+ && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != NULL_TREE -+ && DECL_P (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))) -+ { -+ tree szdecl = TYPE_MAX_VALUE (TYPE_DOMAIN (type)); -+ dw_loc_descr_ref loc = loc_descriptor_from_tree (szdecl); -+ -+ size = int_size_in_bytes (TREE_TYPE (szdecl)); -+ if (loc && size > 0) -+ { -+ add_AT_loc (array_die, DW_AT_string_length, loc); -+ if (size != DWARF2_ADDR_SIZE) -+ add_AT_unsigned (array_die, DW_AT_byte_size, size); -+ } -+ } -+ return; -+ } -+ - /* ??? The SGI dwarf reader fails for array of array of enum types unless - the inner array type comes before the outer array type. Thus we must - call gen_type_die before we call new_die. See below also. */ -@@ -11962,7 +11998,8 @@ gen_array_type_die (tree type, dw_die_re - /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */ - if (is_fortran () - && TREE_CODE (type) == ARRAY_TYPE -- && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE) -+ && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE -+ && !TYPE_STRING_FLAG (TREE_TYPE (type))) - add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major); - - #if 0 -@@ -11994,7 +12031,11 @@ gen_array_type_die (tree type, dw_die_re - add_subscript_info. */ - #ifndef MIPS_DEBUGGING_INFO - while (TREE_CODE (element_type) == ARRAY_TYPE) -- element_type = TREE_TYPE (element_type); -+ { -+ if (TYPE_STRING_FLAG (element_type) && is_fortran ()) -+ break; -+ element_type = TREE_TYPE (element_type); -+ } - - gen_type_die (element_type, context_die); - #endif diff --git a/gcc43-fortran-debug8.patch b/gcc43-fortran-debug8.patch deleted file mode 100644 index 651b856..0000000 --- a/gcc43-fortran-debug8.patch +++ /dev/null @@ -1,48 +0,0 @@ -2008-08-22 Jakub Jelinek - - * dwarf2out.c (gen_formal_parameter_die, gen_variable_die): For - DECL_BY_REFERENCE decls don't pass TREE_READONLY and - TREE_THIS_VOLATILE to add_type_attribute. - ---- gcc/dwarf2out.c.jj 2008-08-22 17:49:10.000000000 +0200 -+++ gcc/dwarf2out.c 2008-08-22 18:04:15.000000000 +0200 -@@ -13033,11 +13033,13 @@ gen_formal_parameter_die (tree node, dw_ - tree type = TREE_TYPE (node); - add_name_and_src_coords_attributes (parm_die, node); - if (DECL_BY_REFERENCE (node)) -- type = TREE_TYPE (type); -- add_type_attribute (parm_die, type, -- TREE_READONLY (node), -- TREE_THIS_VOLATILE (node), -- context_die); -+ add_type_attribute (parm_die, TREE_TYPE (type), 0, 0, -+ context_die); -+ else -+ add_type_attribute (parm_die, type, -+ TREE_READONLY (node), -+ TREE_THIS_VOLATILE (node), -+ context_die); - if (DECL_ARTIFICIAL (node)) - add_AT_flag (parm_die, DW_AT_artificial, 1); - } -@@ -13714,14 +13716,15 @@ gen_variable_die (tree decl, dw_die_ref - else - { - tree type = TREE_TYPE (decl); -+ -+ add_name_and_src_coords_attributes (var_die, decl); - if ((TREE_CODE (decl) == PARM_DECL - || TREE_CODE (decl) == RESULT_DECL) - && DECL_BY_REFERENCE (decl)) -- type = TREE_TYPE (type); -- -- add_name_and_src_coords_attributes (var_die, decl); -- add_type_attribute (var_die, type, TREE_READONLY (decl), -- TREE_THIS_VOLATILE (decl), context_die); -+ add_type_attribute (var_die, TREE_TYPE (type), 0, 0, context_die); -+ else -+ add_type_attribute (var_die, type, TREE_READONLY (decl), -+ TREE_THIS_VOLATILE (decl), context_die); - - if (TREE_PUBLIC (decl)) - add_AT_flag (var_die, DW_AT_external, 1); diff --git a/gcc43-fortran-debug9.patch b/gcc43-fortran-debug9.patch deleted file mode 100644 index 718134f..0000000 --- a/gcc43-fortran-debug9.patch +++ /dev/null @@ -1,144 +0,0 @@ -2008-08-25 Jakub Jelinek - - * gfortran.h (gfc_use_list): Add where field. - * module.c (use_locus): New static variable. - (gfc_match_use): Set it. - (gfc_use_module): Copy it to gfc_use_list's where field. - * trans-decl.c (gfc_generate_module_vars): Call gfc_trans_use_stmts. - (gfc_trans_use_stmts): Set backend locus before calling the debug - hook. Allow non-VAR_DECLs to be created even for non-external - module. Don't emit anything so far for renames from different - modules. - ---- gcc/fortran/gfortran.h.jj 2008-08-22 20:11:22.000000000 +0200 -+++ gcc/fortran/gfortran.h 2008-08-25 13:03:42.000000000 +0200 -@@ -1131,6 +1131,7 @@ typedef struct gfc_use_list - const char *module_name; - int only_flag; - struct gfc_use_rename *rename; -+ locus where; - /* Next USE statement. */ - struct gfc_use_list *next; - } ---- gcc/fortran/module.c.jj 2008-08-22 20:11:22.000000000 +0200 -+++ gcc/fortran/module.c 2008-08-25 13:10:57.000000000 +0200 -@@ -188,6 +188,8 @@ static int symbol_number; /* Counter for - /* Tells mio_expr_ref to make symbols for unused equivalence members. */ - static bool in_load_equiv; - -+static locus use_locus; -+ - - - /*****************************************************************/ -@@ -546,6 +548,8 @@ gfc_match_use (void) - } - } - -+ use_locus = gfc_current_locus; -+ - m = gfc_match_name (module_name); - if (m != MATCH_YES) - return m; -@@ -5044,6 +5048,7 @@ gfc_use_module (void) - use_stmt->module_name = gfc_get_string (module_name); - use_stmt->only_flag = only_flag; - use_stmt->rename = gfc_rename_list; -+ use_stmt->where = use_locus; - gfc_rename_list = NULL; - use_stmt->next = gfc_current_ns->use_stmts; - gfc_current_ns->use_stmts = use_stmt; ---- gcc/fortran/trans-decl.c.jj 2008-08-25 12:44:00.000000000 +0200 -+++ gcc/fortran/trans-decl.c 2008-08-25 13:16:17.000000000 +0200 -@@ -3151,26 +3151,7 @@ gfc_create_module_variable (gfc_symbol * - } - } - -- --/* Generate all the required code for module variables. */ -- --void --gfc_generate_module_vars (gfc_namespace * ns) --{ -- module_namespace = ns; -- cur_module = gfc_find_module (ns->proc_name->name); -- -- /* Check if the frontend left the namespace in a reasonable state. */ -- gcc_assert (ns->proc_name && !ns->proc_name->tlink); -- -- /* Generate COMMON blocks. */ -- gfc_trans_common (ns); -- -- /* Create decls for all the module variables. */ -- gfc_traverse_ns (ns, gfc_create_module_variable); -- -- cur_module = NULL; --} -+/* Emit debug information for USE statements. */ - - static void - gfc_trans_use_stmts (gfc_namespace * ns) -@@ -3190,6 +3171,7 @@ gfc_trans_use_stmts (gfc_namespace * ns) - void_type_node); - DECL_EXTERNAL (entry->namespace_decl) = 1; - } -+ gfc_set_backend_locus (&use_stmt->where); - if (!use_stmt->only_flag) - (*debug_hooks->imported_module_or_decl) (entry->namespace_decl, - NULL_TREE, -@@ -3214,9 +3196,14 @@ gfc_trans_use_stmts (gfc_namespace * ns) - rent->local_name[0] - ? rent->local_name : rent->use_name); - gcc_assert (st && st->n.sym->attr.use_assoc); -- if (st->n.sym->backend_decl && DECL_P (st->n.sym->backend_decl)) -+ if (st->n.sym->backend_decl -+ && DECL_P (st->n.sym->backend_decl) -+ && st->n.sym->module -+ && strcmp (st->n.sym->module, use_stmt->module_name) == 0) - { -- gcc_assert (DECL_EXTERNAL (entry->namespace_decl)); -+ gcc_assert (DECL_EXTERNAL (entry->namespace_decl) -+ || (TREE_CODE (st->n.sym->backend_decl) -+ != VAR_DECL)); - decl = copy_node (st->n.sym->backend_decl); - DECL_CONTEXT (decl) = entry->namespace_decl; - DECL_EXTERNAL (decl) = 1; -@@ -3236,6 +3223,7 @@ gfc_trans_use_stmts (gfc_namespace * ns) - local_name = get_identifier (rent->local_name); - else - local_name = NULL_TREE; -+ gfc_set_backend_locus (&rent->where); - (*debug_hooks->imported_module_or_decl) (decl, local_name, - ns->proc_name->backend_decl, - !use_stmt->only_flag); -@@ -3243,6 +3231,30 @@ gfc_trans_use_stmts (gfc_namespace * ns) - } - } - -+ -+/* Generate all the required code for module variables. */ -+ -+void -+gfc_generate_module_vars (gfc_namespace * ns) -+{ -+ module_namespace = ns; -+ cur_module = gfc_find_module (ns->proc_name->name); -+ -+ /* Check if the frontend left the namespace in a reasonable state. */ -+ gcc_assert (ns->proc_name && !ns->proc_name->tlink); -+ -+ /* Generate COMMON blocks. */ -+ gfc_trans_common (ns); -+ -+ /* Create decls for all the module variables. */ -+ gfc_traverse_ns (ns, gfc_create_module_variable); -+ -+ cur_module = NULL; -+ -+ gfc_trans_use_stmts (ns); -+} -+ -+ - static void - gfc_generate_contained_functions (gfc_namespace * parent) - { diff --git a/gcc43-pr37189.patch b/gcc43-pr37189.patch new file mode 100644 index 0000000..2e61f3d --- /dev/null +++ b/gcc43-pr37189.patch @@ -0,0 +1,117 @@ +2008-09-03 Jakub Jelinek + + PR c++/37189 + * cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): New + extern decls. + * decl2.c (mark_used): If defer_mark_used_calls, push decl into + deferred_mark_used_calls vector and exit early. + * decl.c (defer_mark_used_calls, deferred_mark_used_calls): New + variables. + (finish_function): Set defer_mark_used_calls for the duration of the + function. Call mark_used on any queued decls. + + PR c++/37189 + * g++.dg/gomp/pr37189.C: New test. + +--- gcc/cp/decl2.c (revision 139954) ++++ gcc/cp/decl2.c (revision 139955) +@@ -3776,6 +3776,15 @@ mark_used (tree decl) + /* If we don't need a value, then we don't need to synthesize DECL. */ + if (skip_evaluation) + return; ++ ++ /* If within finish_function, defer the rest until that function ++ finishes, otherwise it might recurse. */ ++ if (defer_mark_used_calls) ++ { ++ VEC_safe_push (tree, gc, deferred_mark_used_calls, decl); ++ return; ++ } ++ + /* Normally, we can wait until instantiation-time to synthesize + DECL. However, if DECL is a static data member initialized with + a constant, we need the value right now because a reference to +--- gcc/cp/decl.c (revision 139954) ++++ gcc/cp/decl.c (revision 139955) +@@ -227,6 +227,11 @@ struct named_label_entry GTY(()) + function, two inside the body of a function in a local class, etc.) */ + int function_depth; + ++/* To avoid unwanted recursion, finish_function defers all mark_used calls ++ encountered during its execution until it finishes. */ ++bool defer_mark_used_calls; ++VEC(tree, gc) *deferred_mark_used_calls; ++ + /* States indicating how grokdeclarator() should handle declspecs marked + with __attribute__((deprecated)). An object declared as + __attribute__((deprecated)) suppresses warnings of uses of other +@@ -12033,6 +12038,9 @@ finish_function (int flags) + if (fndecl == NULL_TREE) + return error_mark_node; + ++ gcc_assert (!defer_mark_used_calls); ++ defer_mark_used_calls = true; ++ + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl) + && DECL_VIRTUAL_P (fndecl) + && !processing_template_decl) +@@ -12232,6 +12240,17 @@ finish_function (int flags) + cxx_pop_function_context and then reset via pop_function_context. */ + current_function_decl = NULL_TREE; + ++ defer_mark_used_calls = false; ++ if (deferred_mark_used_calls) ++ { ++ unsigned int i; ++ tree decl; ++ ++ for (i = 0; VEC_iterate (tree, deferred_mark_used_calls, i, decl); i++) ++ mark_used (decl); ++ VEC_free (tree, gc, deferred_mark_used_calls); ++ } ++ + return fndecl; + } + +--- gcc/cp/cp-tree.h (revision 139954) ++++ gcc/cp/cp-tree.h (revision 139955) +@@ -4381,6 +4381,9 @@ extern void initialize_artificial_var ( + extern tree check_var_type (tree, tree); + extern tree reshape_init (tree, tree); + ++extern bool defer_mark_used_calls; ++extern GTY(()) VEC(tree, gc) *deferred_mark_used_calls; ++ + /* in decl2.c */ + extern bool check_java_method (tree); + extern tree build_memfn_type (tree, tree, cp_cv_quals); +--- gcc/testsuite/g++.dg/gomp/pr37189.C (revision 0) ++++ gcc/testsuite/g++.dg/gomp/pr37189.C (revision 139955) +@@ -0,0 +1,27 @@ ++// PR c++/37189 ++// { dg-do compile } ++// { dg-options "-fopenmp" } ++ ++struct S ++{ ++ S () {} ++ S (S const &) {} ++}; ++ ++struct T ++{ ++ S s; ++}; ++ ++void ++bar (T &) ++{ ++} ++ ++int ++foo () ++{ ++ T t; ++ #pragma omp task ++ bar (t); ++} diff --git a/gcc43-pr37248.patch b/gcc43-pr37248.patch deleted file mode 100644 index 310da34..0000000 --- a/gcc43-pr37248.patch +++ /dev/null @@ -1,522 +0,0 @@ -2008-08-29 Jakub Jelinek - - PR middle-end/37248 - PR middle-end/36449 - * fold-const.c (make_bit_field_ref): Change bitpos and bitsize - arguments to HOST_WIDE_INT. - (fold_truthop): Change first_bit and end_bit to HOST_WIDE_INT. - - * g++.dg/opt/pr36449.C: New test. - -2008-08-29 Jakub Jelinek - - Revert: - 2008-06-11 Richard Guenther - PR middle-end/36449 - * fold-const.c (fold_truthop): Remove code generating - BIT_FIELD_REFs of structure bases. - (fold_binary): Likewise. - (make_bit_field_ref): Remove. - (optimize_bit_field_compare): Remove. - (all_ones_mask_p): Remove. - ---- gcc/fold-const.c (revision 136662) -+++ gcc/fold-const.c (revision 136661) -@@ -109,9 +109,12 @@ static int twoval_comparison_p (tree, tr - static tree eval_subst (tree, tree, tree, tree, tree); - static tree pedantic_omit_one_operand (tree, tree, tree); - static tree distribute_bit_expr (enum tree_code, tree, tree, tree); -+static tree make_bit_field_ref (tree, tree, HOST_WIDE_INT, HOST_WIDE_INT, int); -+static tree optimize_bit_field_compare (enum tree_code, tree, tree, tree); - static tree decode_field_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *, - enum machine_mode *, int *, int *, - tree *, tree *); -+static int all_ones_mask_p (const_tree, int); - static tree sign_bit_p (tree, const_tree); - static int simple_operand_p (const_tree); - static tree range_binop (enum tree_code, tree, tree, int, tree, int); -@@ -3848,6 +3851,202 @@ distribute_real_division (enum tree_code - return NULL_TREE; - } - -+/* Return a BIT_FIELD_REF of type TYPE to refer to BITSIZE bits of INNER -+ starting at BITPOS. The field is unsigned if UNSIGNEDP is nonzero. */ -+ -+static tree -+make_bit_field_ref (tree inner, tree type, HOST_WIDE_INT bitsize, -+ HOST_WIDE_INT bitpos, int unsignedp) -+{ -+ tree result; -+ -+ if (bitpos == 0) -+ { -+ tree size = TYPE_SIZE (TREE_TYPE (inner)); -+ if ((INTEGRAL_TYPE_P (TREE_TYPE (inner)) -+ || POINTER_TYPE_P (TREE_TYPE (inner))) -+ && host_integerp (size, 0) -+ && tree_low_cst (size, 0) == bitsize) -+ return fold_convert (type, inner); -+ } -+ -+ result = build3 (BIT_FIELD_REF, type, inner, -+ size_int (bitsize), bitsize_int (bitpos)); -+ -+ BIT_FIELD_REF_UNSIGNED (result) = unsignedp; -+ -+ return result; -+} -+ -+/* Optimize a bit-field compare. -+ -+ There are two cases: First is a compare against a constant and the -+ second is a comparison of two items where the fields are at the same -+ bit position relative to the start of a chunk (byte, halfword, word) -+ large enough to contain it. In these cases we can avoid the shift -+ implicit in bitfield extractions. -+ -+ For constants, we emit a compare of the shifted constant with the -+ BIT_AND_EXPR of a mask and a byte, halfword, or word of the operand being -+ compared. For two fields at the same position, we do the ANDs with the -+ similar mask and compare the result of the ANDs. -+ -+ CODE is the comparison code, known to be either NE_EXPR or EQ_EXPR. -+ COMPARE_TYPE is the type of the comparison, and LHS and RHS -+ are the left and right operands of the comparison, respectively. -+ -+ If the optimization described above can be done, we return the resulting -+ tree. Otherwise we return zero. */ -+ -+static tree -+optimize_bit_field_compare (enum tree_code code, tree compare_type, -+ tree lhs, tree rhs) -+{ -+ HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize; -+ tree type = TREE_TYPE (lhs); -+ tree signed_type, unsigned_type; -+ int const_p = TREE_CODE (rhs) == INTEGER_CST; -+ enum machine_mode lmode, rmode, nmode; -+ int lunsignedp, runsignedp; -+ int lvolatilep = 0, rvolatilep = 0; -+ tree linner, rinner = NULL_TREE; -+ tree mask; -+ tree offset; -+ -+ /* Get all the information about the extractions being done. If the bit size -+ if the same as the size of the underlying object, we aren't doing an -+ extraction at all and so can do nothing. We also don't want to -+ do anything if the inner expression is a PLACEHOLDER_EXPR since we -+ then will no longer be able to replace it. */ -+ linner = get_inner_reference (lhs, &lbitsize, &lbitpos, &offset, &lmode, -+ &lunsignedp, &lvolatilep, false); -+ if (linner == lhs || lbitsize == GET_MODE_BITSIZE (lmode) || lbitsize < 0 -+ || offset != 0 || TREE_CODE (linner) == PLACEHOLDER_EXPR) -+ return 0; -+ -+ if (!const_p) -+ { -+ /* If this is not a constant, we can only do something if bit positions, -+ sizes, and signedness are the same. */ -+ rinner = get_inner_reference (rhs, &rbitsize, &rbitpos, &offset, &rmode, -+ &runsignedp, &rvolatilep, false); -+ -+ if (rinner == rhs || lbitpos != rbitpos || lbitsize != rbitsize -+ || lunsignedp != runsignedp || offset != 0 -+ || TREE_CODE (rinner) == PLACEHOLDER_EXPR) -+ return 0; -+ } -+ -+ /* See if we can find a mode to refer to this field. We should be able to, -+ but fail if we can't. */ -+ nmode = get_best_mode (lbitsize, lbitpos, -+ const_p ? TYPE_ALIGN (TREE_TYPE (linner)) -+ : MIN (TYPE_ALIGN (TREE_TYPE (linner)), -+ TYPE_ALIGN (TREE_TYPE (rinner))), -+ word_mode, lvolatilep || rvolatilep); -+ if (nmode == VOIDmode) -+ return 0; -+ -+ /* Set signed and unsigned types of the precision of this mode for the -+ shifts below. */ -+ signed_type = lang_hooks.types.type_for_mode (nmode, 0); -+ unsigned_type = lang_hooks.types.type_for_mode (nmode, 1); -+ -+ /* Compute the bit position and size for the new reference and our offset -+ within it. If the new reference is the same size as the original, we -+ won't optimize anything, so return zero. */ -+ nbitsize = GET_MODE_BITSIZE (nmode); -+ nbitpos = lbitpos & ~ (nbitsize - 1); -+ lbitpos -= nbitpos; -+ if (nbitsize == lbitsize) -+ return 0; -+ -+ if (BYTES_BIG_ENDIAN) -+ lbitpos = nbitsize - lbitsize - lbitpos; -+ -+ /* Make the mask to be used against the extracted field. */ -+ mask = build_int_cst_type (unsigned_type, -1); -+ mask = const_binop (LSHIFT_EXPR, mask, size_int (nbitsize - lbitsize), 0); -+ mask = const_binop (RSHIFT_EXPR, mask, -+ size_int (nbitsize - lbitsize - lbitpos), 0); -+ -+ if (! const_p) -+ /* If not comparing with constant, just rework the comparison -+ and return. */ -+ return fold_build2 (code, compare_type, -+ fold_build2 (BIT_AND_EXPR, unsigned_type, -+ make_bit_field_ref (linner, -+ unsigned_type, -+ nbitsize, nbitpos, -+ 1), -+ mask), -+ fold_build2 (BIT_AND_EXPR, unsigned_type, -+ make_bit_field_ref (rinner, -+ unsigned_type, -+ nbitsize, nbitpos, -+ 1), -+ mask)); -+ -+ /* Otherwise, we are handling the constant case. See if the constant is too -+ big for the field. Warn and return a tree of for 0 (false) if so. We do -+ this not only for its own sake, but to avoid having to test for this -+ error case below. If we didn't, we might generate wrong code. -+ -+ For unsigned fields, the constant shifted right by the field length should -+ be all zero. For signed fields, the high-order bits should agree with -+ the sign bit. */ -+ -+ if (lunsignedp) -+ { -+ if (! integer_zerop (const_binop (RSHIFT_EXPR, -+ fold_convert (unsigned_type, rhs), -+ size_int (lbitsize), 0))) -+ { -+ warning (0, "comparison is always %d due to width of bit-field", -+ code == NE_EXPR); -+ return constant_boolean_node (code == NE_EXPR, compare_type); -+ } -+ } -+ else -+ { -+ tree tem = const_binop (RSHIFT_EXPR, fold_convert (signed_type, rhs), -+ size_int (lbitsize - 1), 0); -+ if (! integer_zerop (tem) && ! integer_all_onesp (tem)) -+ { -+ warning (0, "comparison is always %d due to width of bit-field", -+ code == NE_EXPR); -+ return constant_boolean_node (code == NE_EXPR, compare_type); -+ } -+ } -+ -+ /* Single-bit compares should always be against zero. */ -+ if (lbitsize == 1 && ! integer_zerop (rhs)) -+ { -+ code = code == EQ_EXPR ? NE_EXPR : EQ_EXPR; -+ rhs = build_int_cst (type, 0); -+ } -+ -+ /* Make a new bitfield reference, shift the constant over the -+ appropriate number of bits and mask it with the computed mask -+ (in case this was a signed field). If we changed it, make a new one. */ -+ lhs = make_bit_field_ref (linner, unsigned_type, nbitsize, nbitpos, 1); -+ if (lvolatilep) -+ { -+ TREE_SIDE_EFFECTS (lhs) = 1; -+ TREE_THIS_VOLATILE (lhs) = 1; -+ } -+ -+ rhs = const_binop (BIT_AND_EXPR, -+ const_binop (LSHIFT_EXPR, -+ fold_convert (unsigned_type, rhs), -+ size_int (lbitpos), 0), -+ mask, 0); -+ -+ return build2 (code, compare_type, -+ build2 (BIT_AND_EXPR, unsigned_type, lhs, mask), -+ rhs); -+} -+ - /* Subroutine for fold_truthop: decode a field reference. - - If EXP is a comparison reference, we return the innermost reference. -@@ -3939,6 +4138,27 @@ decode_field_reference (tree exp, HOST_W - return inner; - } - -+/* Return nonzero if MASK represents a mask of SIZE ones in the low-order -+ bit positions. */ -+ -+static int -+all_ones_mask_p (const_tree mask, int size) -+{ -+ tree type = TREE_TYPE (mask); -+ unsigned int precision = TYPE_PRECISION (type); -+ tree tmask; -+ -+ tmask = build_int_cst_type (signed_type_for (type), -1); -+ -+ return -+ tree_int_cst_equal (mask, -+ const_binop (RSHIFT_EXPR, -+ const_binop (LSHIFT_EXPR, tmask, -+ size_int (precision - size), -+ 0), -+ size_int (precision - size), 0)); -+} -+ - /* Subroutine for fold: determine if VAL is the INTEGER_CONST that - represents the sign bit of EXP's type. If EXP represents a sign - or zero extension, also test VAL against the unextended type. -@@ -5264,16 +5484,16 @@ fold_truthop (enum tree_code code, tree - tree ll_inner, lr_inner, rl_inner, rr_inner; - HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos; - HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos; -- HOST_WIDE_INT xll_bitpos, xrl_bitpos; -- HOST_WIDE_INT lnbitsize, lnbitpos; -+ HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos; -+ HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos; - int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp; - enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode; -- enum machine_mode lnmode; -+ enum machine_mode lnmode, rnmode; - tree ll_mask, lr_mask, rl_mask, rr_mask; - tree ll_and_mask, lr_and_mask, rl_and_mask, rr_and_mask; - tree l_const, r_const; -- tree lntype, result; -- int first_bit, end_bit; -+ tree lntype, rntype, result; -+ HOST_WIDE_INT first_bit, end_bit; - int volatilep; - tree orig_lhs = lhs, orig_rhs = rhs; - enum tree_code orig_code = code; -@@ -5510,6 +5730,118 @@ fold_truthop (enum tree_code code, tree - } - } - -+ /* If the right sides are not constant, do the same for it. Also, -+ disallow this optimization if a size or signedness mismatch occurs -+ between the left and right sides. */ -+ if (l_const == 0) -+ { -+ if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize -+ || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp -+ /* Make sure the two fields on the right -+ correspond to the left without being swapped. */ -+ || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos) -+ return 0; -+ -+ first_bit = MIN (lr_bitpos, rr_bitpos); -+ end_bit = MAX (lr_bitpos + lr_bitsize, rr_bitpos + rr_bitsize); -+ rnmode = get_best_mode (end_bit - first_bit, first_bit, -+ TYPE_ALIGN (TREE_TYPE (lr_inner)), word_mode, -+ volatilep); -+ if (rnmode == VOIDmode) -+ return 0; -+ -+ rnbitsize = GET_MODE_BITSIZE (rnmode); -+ rnbitpos = first_bit & ~ (rnbitsize - 1); -+ rntype = lang_hooks.types.type_for_size (rnbitsize, 1); -+ xlr_bitpos = lr_bitpos - rnbitpos, xrr_bitpos = rr_bitpos - rnbitpos; -+ -+ if (BYTES_BIG_ENDIAN) -+ { -+ xlr_bitpos = rnbitsize - xlr_bitpos - lr_bitsize; -+ xrr_bitpos = rnbitsize - xrr_bitpos - rr_bitsize; -+ } -+ -+ lr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, lr_mask), -+ size_int (xlr_bitpos), 0); -+ rr_mask = const_binop (LSHIFT_EXPR, fold_convert (rntype, rr_mask), -+ size_int (xrr_bitpos), 0); -+ -+ /* Make a mask that corresponds to both fields being compared. -+ Do this for both items being compared. If the operands are the -+ same size and the bits being compared are in the same position -+ then we can do this by masking both and comparing the masked -+ results. */ -+ ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0); -+ lr_mask = const_binop (BIT_IOR_EXPR, lr_mask, rr_mask, 0); -+ if (lnbitsize == rnbitsize && xll_bitpos == xlr_bitpos) -+ { -+ lhs = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos, -+ ll_unsignedp || rl_unsignedp); -+ if (! all_ones_mask_p (ll_mask, lnbitsize)) -+ lhs = build2 (BIT_AND_EXPR, lntype, lhs, ll_mask); -+ -+ rhs = make_bit_field_ref (lr_inner, rntype, rnbitsize, rnbitpos, -+ lr_unsignedp || rr_unsignedp); -+ if (! all_ones_mask_p (lr_mask, rnbitsize)) -+ rhs = build2 (BIT_AND_EXPR, rntype, rhs, lr_mask); -+ -+ return build2 (wanted_code, truth_type, lhs, rhs); -+ } -+ -+ /* There is still another way we can do something: If both pairs of -+ fields being compared are adjacent, we may be able to make a wider -+ field containing them both. -+ -+ Note that we still must mask the lhs/rhs expressions. Furthermore, -+ the mask must be shifted to account for the shift done by -+ make_bit_field_ref. */ -+ if ((ll_bitsize + ll_bitpos == rl_bitpos -+ && lr_bitsize + lr_bitpos == rr_bitpos) -+ || (ll_bitpos == rl_bitpos + rl_bitsize -+ && lr_bitpos == rr_bitpos + rr_bitsize)) -+ { -+ tree type; -+ -+ lhs = make_bit_field_ref (ll_inner, lntype, ll_bitsize + rl_bitsize, -+ MIN (ll_bitpos, rl_bitpos), ll_unsignedp); -+ rhs = make_bit_field_ref (lr_inner, rntype, lr_bitsize + rr_bitsize, -+ MIN (lr_bitpos, rr_bitpos), lr_unsignedp); -+ -+ ll_mask = const_binop (RSHIFT_EXPR, ll_mask, -+ size_int (MIN (xll_bitpos, xrl_bitpos)), 0); -+ lr_mask = const_binop (RSHIFT_EXPR, lr_mask, -+ size_int (MIN (xlr_bitpos, xrr_bitpos)), 0); -+ -+ /* Convert to the smaller type before masking out unwanted bits. */ -+ type = lntype; -+ if (lntype != rntype) -+ { -+ if (lnbitsize > rnbitsize) -+ { -+ lhs = fold_convert (rntype, lhs); -+ ll_mask = fold_convert (rntype, ll_mask); -+ type = rntype; -+ } -+ else if (lnbitsize < rnbitsize) -+ { -+ rhs = fold_convert (lntype, rhs); -+ lr_mask = fold_convert (lntype, lr_mask); -+ type = lntype; -+ } -+ } -+ -+ if (! all_ones_mask_p (ll_mask, ll_bitsize + rl_bitsize)) -+ lhs = build2 (BIT_AND_EXPR, type, lhs, ll_mask); -+ -+ if (! all_ones_mask_p (lr_mask, lr_bitsize + rr_bitsize)) -+ rhs = build2 (BIT_AND_EXPR, type, rhs, lr_mask); -+ -+ return build2 (wanted_code, truth_type, lhs, rhs); -+ } -+ -+ return 0; -+ } -+ - /* Handle the case of comparisons with constants. If there is something in - common between the masks, those bits of the constants must be the same. - If not, the condition is always false. Test for this to avoid generating -@@ -5531,7 +5863,19 @@ fold_truthop (enum tree_code code, tree - } - } - -- return NULL_TREE; -+ /* Construct the expression we will return. First get the component -+ reference we will make. Unless the mask is all ones the width of -+ that field, perform the mask operation. Then compare with the -+ merged constant. */ -+ result = make_bit_field_ref (ll_inner, lntype, lnbitsize, lnbitpos, -+ ll_unsignedp || rl_unsignedp); -+ -+ ll_mask = const_binop (BIT_IOR_EXPR, ll_mask, rl_mask, 0); -+ if (! all_ones_mask_p (ll_mask, lnbitsize)) -+ result = build2 (BIT_AND_EXPR, lntype, result, ll_mask); -+ -+ return build2 (wanted_code, truth_type, result, -+ const_binop (BIT_IOR_EXPR, l_const, r_const, 0)); - } - - /* Optimize T, which is a comparison of a MIN_EXPR or MAX_EXPR with a -@@ -11912,6 +12256,18 @@ fold_binary (enum tree_code code, tree t - return omit_one_operand (type, rslt, arg0); - } - -+ /* If this is a comparison of a field, we may be able to simplify it. */ -+ if ((TREE_CODE (arg0) == COMPONENT_REF -+ || TREE_CODE (arg0) == BIT_FIELD_REF) -+ /* Handle the constant case even without -O -+ to make sure the warnings are given. */ -+ && (optimize || TREE_CODE (arg1) == INTEGER_CST)) -+ { -+ t1 = optimize_bit_field_compare (code, type, arg0, arg1); -+ if (t1) -+ return t1; -+ } -+ - /* Optimize comparisons of strlen vs zero to a compare of the - first character of the string vs zero. To wit, - strlen(ptr) == 0 => *ptr == 0 ---- gcc/testsuite/g++.dg/opt/pr36449.C.jj 2008-08-26 11:03:24.000000000 +0200 -+++ gcc/testsuite/g++.dg/opt/pr36449.C 2008-08-26 11:00:53.000000000 +0200 -@@ -0,0 +1,70 @@ -+// PR middle-end/36449 -+// { dg-do run } -+// { dg-options "-O3" } -+ -+extern "C" void exit (int); -+extern "C" void abort (); -+ -+struct R -+{ -+ short a; -+ short b; -+}; -+ -+struct S -+{ -+ R e; -+ long f; -+ long g; -+}; -+ -+struct T -+{ -+ short c; -+ short d; -+}; -+ -+struct U -+{ -+ long h[0x1ffffff + 1]; -+ T i; -+}; -+ -+U *j; -+ -+void __attribute__((noinline)) -+bar () -+{ -+ exit (0); -+} -+ -+void __attribute__((noinline)) -+foo () -+{ -+ S s; -+ -+ s.e.a = 36; -+ s.e.b = 38; -+ if (s.e.a == j->i.c && s.e.b == j->i.d) -+ bar (); -+} -+ -+int -+main () -+{ -+ try -+ { -+ j = new U; -+ } -+ catch (...) -+ { -+ return 0; -+ } -+ j->i.c = 36; -+ j->i.d = 38; -+ j->h[0] = 1; -+ j->h[1] = 2; -+ j->h[2] = 3; -+ foo (); -+ abort (); -+} diff --git a/gcc43-x86_64-va_start.patch b/gcc43-x86_64-va_start.patch new file mode 100644 index 0000000..efa06bc --- /dev/null +++ b/gcc43-x86_64-va_start.patch @@ -0,0 +1,355 @@ +2008-09-02 H.J. Lu + Jakub Jelinek + + * config/i386/i386.c (X86_64_VARARGS_SIZE): Removed. + (setup_incoming_varargs_64): Set/check ix86_varargs_gpr_size and + ix86_varargs_fpr_size. Use ix86_varargs_gpr_size instead of + REGPARM_MAX. Don't set ix86_save_varrargs_registers. + (ix86_va_start): Check ix86_varargs_gpr_size and + ix86_varargs_fpr_size instead of cfun->va_list_gpr_size and + cfun->va_list_fpr_size, respectively. Subtract 8*REGPARM_MAX + from frame pointer if ix86_varargs_gpr_size == 0. + (ix86_compute_frame_layout): Updated. + * config/i386/i386.h (ix86_save_varrargs_registers): Removed. + (ix86_varargs_gpr_size): Define. + (ix86_varargs_fpr_size): Likewise. + (machine_function): Remove save_varrargs_registers. + Add varargs_gpr_size and varargs_fpr_size. + + * gcc.target/i386/amd64-abi-3.c: New test. + * gcc.target/i386/amd64-abi-4.c: Likewise. + * gcc.target/i386/amd64-abi-5.c: Likewise. + * gcc.target/i386/amd64-abi-6.c: Likewise. + +--- gcc/config/i386/i386.h (revision 139909) ++++ gcc/config/i386/i386.h (revision 139910) +@@ -2440,7 +2440,8 @@ struct machine_function GTY(()) + struct stack_local_entry *stack_locals; + const char *some_ld_name; + rtx force_align_arg_pointer; +- int save_varrargs_registers; ++ int varargs_gpr_size; ++ int varargs_fpr_size; + int accesses_prev_frame; + int optimize_mode_switching[MAX_386_ENTITIES]; + int needs_cld; +@@ -2463,7 +2464,8 @@ struct machine_function GTY(()) + }; + + #define ix86_stack_locals (cfun->machine->stack_locals) +-#define ix86_save_varrargs_registers (cfun->machine->save_varrargs_registers) ++#define ix86_varargs_gpr_size (cfun->machine->varargs_gpr_size) ++#define ix86_varargs_fpr_size (cfun->machine->varargs_fpr_size) + #define ix86_optimize_mode_switching (cfun->machine->optimize_mode_switching) + #define ix86_current_function_needs_cld (cfun->machine->needs_cld) + #define ix86_tls_descriptor_calls_expanded_in_cfun \ +--- gcc/config/i386/i386.c (revision 139909) ++++ gcc/config/i386/i386.c (revision 139910) +@@ -1616,9 +1616,6 @@ rtx ix86_compare_op0 = NULL_RTX; + rtx ix86_compare_op1 = NULL_RTX; + rtx ix86_compare_emitted = NULL_RTX; + +-/* Size of the register save area. */ +-#define X86_64_VARARGS_SIZE (REGPARM_MAX * UNITS_PER_WORD + SSE_REGPARM_MAX * 16) +- + /* Define the structure for the machine field in struct function. */ + + struct stack_local_entry GTY(()) +@@ -4976,11 +4973,22 @@ setup_incoming_varargs_64 (CUMULATIVE_AR + alias_set_type set; + int i; + +- if (! cfun->va_list_gpr_size && ! cfun->va_list_fpr_size) ++ /* GPR size of varargs save area. */ ++ if (cfun->va_list_gpr_size) ++ ix86_varargs_gpr_size = REGPARM_MAX * UNITS_PER_WORD; ++ else ++ ix86_varargs_gpr_size = 0; ++ ++ /* FPR size of varargs save area. We don't need it if we don't pass ++ anything in SSE registers. */ ++ if (cum->sse_nregs && cfun->va_list_fpr_size) ++ ix86_varargs_fpr_size = SSE_REGPARM_MAX * 16; ++ else ++ ix86_varargs_fpr_size = 0; ++ ++ if (! ix86_varargs_gpr_size && ! ix86_varargs_fpr_size) + return; + +- /* Indicate to allocate space on the stack for varargs save area. */ +- ix86_save_varrargs_registers = 1; + /* We need 16-byte stack alignment to save SSE registers. If user + asked for lower preferred_stack_boundary, lets just hope that he knows + what he is doing and won't varargs SSE values. +@@ -5006,7 +5014,7 @@ setup_incoming_varargs_64 (CUMULATIVE_AR + x86_64_int_parameter_registers[i])); + } + +- if (cum->sse_nregs && cfun->va_list_fpr_size) ++ if (ix86_varargs_fpr_size) + { + /* Now emit code to save SSE registers. The AX parameter contains number + of SSE parameter registers used to call this function. We use +@@ -5041,7 +5049,7 @@ setup_incoming_varargs_64 (CUMULATIVE_AR + tmp_reg = gen_reg_rtx (Pmode); + emit_insn (gen_rtx_SET (VOIDmode, tmp_reg, + plus_constant (save_area, +- 8 * REGPARM_MAX + 127))); ++ ix86_varargs_gpr_size + 127))); + mem = gen_rtx_MEM (BLKmode, plus_constant (tmp_reg, -127)); + MEM_NOTRAP_P (mem) = 1; + set_mem_alias_set (mem, set); +@@ -5145,7 +5153,7 @@ ix86_va_start (tree valist, rtx nextarg) + expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); + } + +- if (cfun->va_list_fpr_size) ++ if (TARGET_SSE && cfun->va_list_fpr_size) + { + type = TREE_TYPE (fpr); + t = build2 (GIMPLE_MODIFY_STMT, type, fpr, +@@ -5164,12 +5172,15 @@ ix86_va_start (tree valist, rtx nextarg) + TREE_SIDE_EFFECTS (t) = 1; + expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); + +- if (cfun->va_list_gpr_size || cfun->va_list_fpr_size) ++ if (ix86_varargs_gpr_size || ix86_varargs_fpr_size) + { + /* Find the register save area. + Prologue of the function save it right above stack frame. */ + type = TREE_TYPE (sav); + t = make_tree (type, frame_pointer_rtx); ++ if (!ix86_varargs_gpr_size) ++ t = build2 (POINTER_PLUS_EXPR, type, t, ++ size_int (-8 * REGPARM_MAX)); + t = build2 (GIMPLE_MODIFY_STMT, type, sav, t); + TREE_SIDE_EFFECTS (t) = 1; + expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); +@@ -6079,13 +6090,8 @@ ix86_compute_frame_layout (struct ix86_f + offset += frame->nregs * UNITS_PER_WORD; + + /* Va-arg area */ +- if (ix86_save_varrargs_registers) +- { +- offset += X86_64_VARARGS_SIZE; +- frame->va_arg_size = X86_64_VARARGS_SIZE; +- } +- else +- frame->va_arg_size = 0; ++ frame->va_arg_size = ix86_varargs_gpr_size + ix86_varargs_fpr_size; ++ offset += frame->va_arg_size; + + /* Align start of frame for local function. */ + frame->padding1 = ((offset + stack_alignment_needed - 1) +--- gcc/testsuite/gcc.target/i386/amd64-abi-3.c (revision 0) ++++ gcc/testsuite/gcc.target/i386/amd64-abi-3.c (revision 139910) +@@ -0,0 +1,18 @@ ++/* { dg-do compile } */ ++/* { dg-require-effective-target lp64 } */ ++/* { dg-options "-O2 -mno-sse" } */ ++/* { dg-final { scan-assembler "subq\[\\t \]*\\\$88,\[\\t \]*%rsp" } } */ ++/* { dg-final { scan-assembler-not "subq\[\\t \]*\\\$216,\[\\t \]*%rsp" } } */ ++ ++#include ++ ++void foo (va_list va_arglist); ++ ++void ++test (int a1, ...) ++{ ++ va_list va_arglist; ++ va_start (va_arglist, a1); ++ foo (va_arglist); ++ va_end (va_arglist); ++} +--- gcc/testsuite/gcc.target/i386/amd64-abi-5.c (revision 0) ++++ gcc/testsuite/gcc.target/i386/amd64-abi-5.c (revision 139910) +@@ -0,0 +1,64 @@ ++/* { dg-do run } */ ++/* { dg-require-effective-target lp64 } */ ++/* { dg-options "-O2" } */ ++ ++#include ++#include ++ ++int n1 = 30; ++double n2 = 324; ++double n3 = 39494.94; ++double n4 = 407; ++double n5 = 32.304; ++double n6 = 394.14; ++double n7 = 4.07; ++double n8 = 32.4; ++double n9 = 314.194; ++double n10 = 0.1407; ++ ++int e1; ++double e2; ++double e3; ++double e4; ++double e5; ++double e6; ++double e7; ++double e8; ++double e9; ++double e10; ++ ++static void ++__attribute__((noinline)) ++test (int a1, ...) ++{ ++ e1 = a1; ++ va_list va_arglist; ++ va_start (va_arglist, a1); ++ e2 = va_arg (va_arglist, double); ++ e3 = va_arg (va_arglist, double); ++ e4 = va_arg (va_arglist, double); ++ e5 = va_arg (va_arglist, double); ++ e6 = va_arg (va_arglist, double); ++ e7 = va_arg (va_arglist, double); ++ e8 = va_arg (va_arglist, double); ++ e9 = va_arg (va_arglist, double); ++ e10 = va_arg (va_arglist, double); ++ va_end (va_arglist); ++} ++ ++int ++main () ++{ ++ test (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); ++ assert (n1 == e1); ++ assert (n2 == e2); ++ assert (n3 == e3); ++ assert (n4 == e4); ++ assert (n5 == e5); ++ assert (n6 == e6); ++ assert (n7 == e7); ++ assert (n8 == e8); ++ assert (n9 == e9); ++ assert (n10 == e10); ++ return 0; ++} +--- gcc/testsuite/gcc.target/i386/amd64-abi-4.c (revision 0) ++++ gcc/testsuite/gcc.target/i386/amd64-abi-4.c (revision 139910) +@@ -0,0 +1,47 @@ ++/* { dg-do run } */ ++/* { dg-require-effective-target lp64 } */ ++/* { dg-options "-O2 -mno-sse" } */ ++ ++#include ++#include ++ ++int n1 = 30; ++int n2 = 324; ++void *n3 = (void *) &n2; ++int n4 = 407; ++ ++int e1; ++int e2; ++void *e3; ++int e4; ++ ++static void ++__attribute__((noinline)) ++foo (va_list va_arglist) ++{ ++ e2 = va_arg (va_arglist, int); ++ e3 = va_arg (va_arglist, void *); ++ e4 = va_arg (va_arglist, int); ++} ++ ++static void ++__attribute__((noinline)) ++test (int a1, ...) ++{ ++ e1 = a1; ++ va_list va_arglist; ++ va_start (va_arglist, a1); ++ foo (va_arglist); ++ va_end (va_arglist); ++} ++ ++int ++main () ++{ ++ test (n1, n2, n3, n4); ++ assert (n1 == e1); ++ assert (n2 == e2); ++ assert (n3 == e3); ++ assert (n4 == e4); ++ return 0; ++} +--- gcc/testsuite/gcc.target/i386/amd64-abi-6.c (revision 0) ++++ gcc/testsuite/gcc.target/i386/amd64-abi-6.c (revision 139910) +@@ -0,0 +1,71 @@ ++/* { dg-do run } */ ++/* { dg-require-effective-target lp64 } */ ++/* { dg-options "-O2" } */ ++ ++#include ++#include ++ ++int n1 = 30; ++double n2 = 324; ++double n3 = 39494.94; ++double n4 = 407; ++double n5 = 32.304; ++double n6 = 394.14; ++double n7 = 4.07; ++double n8 = 32.4; ++double n9 = 314.194; ++double n10 = 0.1407; ++ ++int e1; ++double e2; ++double e3; ++double e4; ++double e5; ++double e6; ++double e7; ++double e8; ++double e9; ++double e10; ++ ++static void ++__attribute__((noinline)) ++foo (va_list va_arglist) ++{ ++ e2 = va_arg (va_arglist, double); ++ e3 = va_arg (va_arglist, double); ++ e4 = va_arg (va_arglist, double); ++ e5 = va_arg (va_arglist, double); ++ e6 = va_arg (va_arglist, double); ++ e7 = va_arg (va_arglist, double); ++ e8 = va_arg (va_arglist, double); ++ e9 = va_arg (va_arglist, double); ++ e10 = va_arg (va_arglist, double); ++} ++ ++static void ++__attribute__((noinline)) ++test (int a1, ...) ++{ ++ va_list va_arglist; ++ e1 = a1; ++ va_start (va_arglist, a1); ++ foo (va_arglist); ++ va_end (va_arglist); ++} ++ ++int ++main () ++{ ++ test (n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); ++ assert (n1 == e1); ++ assert (n2 == e2); ++ assert (n3 == e3); ++ assert (n4 == e4); ++ assert (n5 == e5); ++ assert (n6 == e6); ++ assert (n7 == e7); ++ assert (n8 == e8); ++ assert (n9 == e9); ++ assert (n10 == e10); ++ return 0; ++} diff --git a/gcc43.spec b/gcc43.spec index 8adc2ed..d71c4e5 100644 --- a/gcc43.spec +++ b/gcc43.spec @@ -1,6 +1,9 @@ -%define DATE 20080829 +%define DATE 20080905 +%define SVNREV 140029 %define gcc_version 4.3.2 -%define gcc_release 1 +# Note, gcc_release must be integer, if you want to add suffixes to +# %{release}, append them after %{gcc_release} on Release: line. +%define gcc_release 2 %define _unpackaged_files_terminate_build 0 %define multilib_64_archs sparc64 ppc64 s390x x86_64 %define include_gappletviewer 1 @@ -37,6 +40,10 @@ Release: %{gcc_release} # restrictions. License: GPLv3+ and GPLv2+ with exceptions Group: Development/Languages +# The source for this package was pulled from upstream's vcs. Use the +# following commands to generate the tarball: +# svn export svn://gcc.gnu.org/svn/gcc/branches/redhat/gcc-4_3-branch@%{SVNREV} gcc-%{version}-%{DATE} +# tar cf - gcc-%{version}-%{DATE} | bzip2 -9 > gcc-%{version}-%{DATE}.tar.bz2 Source0: gcc-%{version}-%{DATE}.tar.bz2 Source1: libgcc_post_upgrade.c Source2: README.libgcjwebplugin.so @@ -44,7 +51,7 @@ Source3: protoize.1 %define fastjar_ver 0.95 Source4: http://download.savannah.nongnu.org/releases/fastjar/fastjar-%{fastjar_ver}.tar.gz URL: http://gcc.gnu.org -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)) # Need binutils with -pie support >= 2.14.90.0.4-4 # Need binutils which can omit dot symbols and overlap .opd on ppc64 >= 2.15.91.0.2-4 # Need binutils which handle -msecure-plt on ppc >= 2.16.91.0.2-2 @@ -103,27 +110,27 @@ Requires: glibc >= 2.3.90-35 %endif Requires: libgcc >= %{version}-%{release} Requires: libgomp = %{version}-%{release} -Obsoletes: gcc3 -Obsoletes: egcs +#Obsoletes: gcc3 +#Obsoletes: egcs %ifarch sparc -Obsoletes: gcc-sparc32 -Obsoletes: gcc-c++-sparc32 +#Obsoletes: gcc-sparc32 +#Obsoletes: gcc-c++-sparc32 %endif %ifarch ppc -Obsoletes: gcc-ppc32 -Obsoletes: gcc-c++-ppc32 +#Obsoletes: gcc-ppc32 +#Obsoletes: gcc-c++-ppc32 %endif -Obsoletes: gcc-chill +#Obsoletes: gcc-chill %if !%{build_ada} Obsoletes: gcc-gnat < %{version}-%{release} Obsoletes: libgnat < %{version}-%{release} %endif %ifarch sparc sparc64 -Obsoletes: egcs64 +#Obsoletes: egcs64 %endif -Obsoletes: gcc34 -Obsoletes: gcc35 -Obsoletes: gcc4 +#Obsoletes: gcc34 +#Obsoletes: gcc35 +#Obsoletes: gcc4 Prereq: /sbin/install-info AutoReq: true @@ -143,18 +150,8 @@ Patch13: gcc43-i386-libgomp.patch Patch14: gcc43-rh251682.patch Patch15: gcc43-sparc-config-detection.patch Patch16: gcc43-libgomp-omp_h-multilib.patch -Patch17: gcc43-fortran-debug1.patch -Patch18: gcc43-fortran-debug2.patch -Patch19: gcc43-fortran-debug3.patch -Patch20: gcc43-fortran-debug4.patch -Patch21: gcc43-fortran-debug5.patch -Patch22: gcc43-fortran-debug6.patch -Patch23: gcc43-fortran-debug7.patch -Patch24: gcc43-fortran-debug8.patch -Patch25: gcc43-fortran-debug9.patch -Patch26: gcc43-fortran-debug10.patch -Patch27: gcc43-fortran-debug11.patch -Patch28: gcc43-pr37248.patch +Patch17: gcc43-x86_64-va_start.patch +Patch18: gcc43-pr37189.patch # On ARM EABI systems, we do want -gnueabi to be part of the # target triple. @@ -190,10 +187,10 @@ Group: Development/Languages Requires: gcc = %{version}-%{release} Requires: libstdc++ = %{version}-%{release} Requires: libstdc++-devel = %{version}-%{release} -Obsoletes: gcc3-c++ -Obsoletes: gcc34-c++ -Obsoletes: gcc35-c++ -Obsoletes: gcc4-c++ +#Obsoletes: gcc3-c++ +#Obsoletes: gcc34-c++ +#Obsoletes: gcc35-c++ +#Obsoletes: gcc4-c++ Autoreq: true %description c++ @@ -204,8 +201,8 @@ including templates and exception handling. %package -n libstdc++ Summary: GNU Standard C++ Library Group: System Environment/Libraries -Obsoletes: libstdc++3 -Obsoletes: libstdc++34 +#Obsoletes: libstdc++3 +#Obsoletes: libstdc++34 Autoreq: true %description -n libstdc++ @@ -216,8 +213,8 @@ C++ Library. Summary: Header files and libraries for C++ development Group: Development/Libraries Requires: libstdc++ = %{version}-%{release}, %{_prefix}/%{_lib}/libstdc++.so.6 -Obsoletes: libstdc++3-devel -Obsoletes: libstdc++34-devel +#Obsoletes: libstdc++3-devel +#Obsoletes: libstdc++34-devel Autoreq: true %description -n libstdc++-devel @@ -230,7 +227,7 @@ Summary: Objective-C support for GCC Group: Development/Languages Requires: gcc = %{version}-%{release} Requires: libobjc = %{version}-%{release} -Obsoletes: gcc3-objc +#Obsoletes: gcc3-objc Autoreq: true %description objc @@ -263,9 +260,9 @@ Requires: gcc = %{version}-%{release} Requires: libgfortran = %{version}-%{release} BuildRequires: gmp-devel >= 4.1.2-8, mpfr-devel >= 2.2.1 Prereq: /sbin/install-info -Obsoletes: gcc3-g77 -Obsoletes: gcc-g77 -Obsoletes: gcc4-gfortran +#Obsoletes: gcc3-g77 +#Obsoletes: gcc-g77 +#Obsoletes: gcc4-gfortran Autoreq: true %description gfortran @@ -275,7 +272,7 @@ programs with the GNU Compiler Collection. %package -n libgfortran Summary: Fortran 95 runtime Group: System Environment/Libraries -Obsoletes: libf2c +#Obsoletes: libf2c Autoreq: true %description -n libgfortran @@ -320,10 +317,10 @@ Requires: gcc = %{version}-%{release} Requires: libgcj = %{version}-%{release} Requires: libgcj-devel = %{version}-%{release} Requires: /usr/share/java/eclipse-ecj.jar -Obsoletes: gcc3-java -Obsoletes: gcc34-java -Obsoletes: gcc35-java -Obsoletes: gcc4-java +#Obsoletes: gcc3-java +#Obsoletes: gcc34-java +#Obsoletes: gcc35-java +#Obsoletes: gcc4-java Prereq: /sbin/install-info Autoreq: true @@ -348,10 +345,10 @@ BuildRequires: alsa-lib-devel BuildRequires: libXtst-devel BuildRequires: libXt-devel %endif -Obsoletes: gcc-libgcj -Obsoletes: libgcj3 -Obsoletes: libgcj34 -Obsoletes: libgcj4 +#Obsoletes: gcc-libgcj +#Obsoletes: libgcj3 +#Obsoletes: libgcj34 +#Obsoletes: libgcj4 Autoreq: true %description -n libgcj @@ -364,9 +361,9 @@ Group: Development/Languages Requires: libgcj = %{version}-%{release}, %{_prefix}/%{_lib}/libgcj.so.9 Requires: zlib-devel, %{_prefix}/%{_lib}/libz.so Requires: /bin/awk -Obsoletes: libgcj3-devel -Obsoletes: libgcj34-devel -Obsoletes: libgcj4-devel +#Obsoletes: libgcj3-devel +#Obsoletes: libgcj34-devel +#Obsoletes: libgcj4-devel Autoreq: false Autoprov: false @@ -378,7 +375,7 @@ package to compile your Java programs using the GCC Java compiler (gcj). Summary: Java library sources from GCC4 preview Group: System Environment/Libraries Requires: libgcj = %{version}-%{release} -Obsoletes: libgcj4-src +#Obsoletes: libgcj4-src Autoreq: true %description -n libgcj-src @@ -389,7 +386,7 @@ Summary: The C Preprocessor. Group: Development/Languages Prereq: /sbin/install-info %ifarch ia64 -Obsoletes: gnupro +#Obsoletes: gnupro %endif Autoreq: true @@ -419,7 +416,7 @@ macros. Summary: Ada 95 support for GCC Group: Development/Languages Requires: gcc = %{version}-%{release}, libgnat = %{version}-%{release} -Obsoletes: gnat-devel, gcc3-gnat +#Obsoletes: gnat-devel, gcc3-gnat Prereq: /sbin/install-info Autoreq: true @@ -430,7 +427,7 @@ the documents and Ada 95 compiler. %package -n libgnat Summary: GNU Ada 95 runtime shared libraries Group: System Environment/Libraries -Obsoletes: gnat libgnat3 +#Obsoletes: gnat libgnat3 Autoreq: true %description -n libgnat @@ -455,18 +452,8 @@ which are required to run programs compiled with the GNAT. %patch14 -p0 -b .rh251682~ %patch15 -p0 -b .sparc-config-detection~ %patch16 -p0 -b .libgomp-omp_h-multilib~ -%patch17 -p0 -b .fortran-debug1~ -%patch18 -p0 -b .fortran-debug2~ -%patch19 -p0 -b .fortran-debug3~ -%patch20 -p0 -b .fortran-debug4~ -%patch21 -p0 -b .fortran-debug5~ -%patch22 -p0 -b .fortran-debug6~ -%patch23 -p0 -b .fortran-debug7~ -%patch24 -p0 -b .fortran-debug8~ -%patch25 -p0 -b .fortran-debug9~ -%patch26 -p0 -b .fortran-debug10~ -%patch27 -p0 -b .fortran-debug11~ -%patch28 -p0 -b .pr37248~ +%patch17 -p0 -b .x86_64-va_start~ +%patch18 -p0 -b .pr37189~ tar xzf %{SOURCE4} @@ -489,6 +476,38 @@ perl -pi -e 's/^check: check-recursive/ifeq (\$(MULTISUBDIR),)\ncheck: check-rec ./contrib/gcc_update --touch +# To make rpmlint happy (argh), fix up names in ChangeLog entries to valid UTF-8 +LC_ALL=C sed -i \ + -e 's/D\(o\|\xf6\)nmez/D\xc3\xb6nmez/' \ + -e 's/\(Av\|\x81\xc1v\|\xc1v\|\xef\xbf\xbdv\?\|\x81\xc3\x81v\|\xc3v\)ila/\xc3\x81vila/' \ + -e 's/Esp\(in\|\x81\xedn\|\xedn\|\xef\xbf\xbdn\?\|\xef\xbf\xbd\xadn\|\x81\xc3\xadn\)dola/Esp\xc3\xadndola/' \ + -e 's/Schl\(u\|\xef\xbf\xbd\|\xfcu\?\|\x81\xfc\|\x81\xc3\xbc\|\xc3\xaf\xc2\xbf\xc2\xbd\|\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc2\xbc\)ter/Schl\xc3\xbcter/' \ + -e 's/Humi\(e\|\xe8\)res/Humi\xc3\xa8res/' \ + -e 's/L\(ow\|\xc3\xaf\xc2\xbf\xc2\xbd\|oew\|\xf6w\)is/L\xc3\xb6wis/' \ + -e 's/G\xfctlein/G\xc3\xbctlein/' \ + -e 's/G\xe1[b]or/G\xc3\xa1bor/' \ + -e 's/L\xf3ki/L\xc3\xb3ki/' \ + -e 's/Fautr\xc3 /Fautr\xc3\xa9 /' \ + -e 's/S\xe9[b]astian/S\xc3\xa9bastian/' \ + -e 's/Th\xef\xbf\xbd[d]ore/Th\xc3\xa9odore/' \ + -e 's/Cors\xc3\xc2\xa9pius/Cors\xc3\xa9pius/' \ + -e 's/K\xfchl/K\xc3\xbchl/' \ + -e 's/R\xf6nnerup/R\xc3\xb6nnerup/' \ + -e 's/L\xf8vset/L\xc3\xb8vset/' \ + -e 's/Ph\x81\xfb\x81\xf4ng-Th\x81\xe5o/Ph\xc3\xbb\xc3\xb4ng-Th\xc3\xa5o/' \ + -e 's/V\x81\xf5/V\xc3\xb5/' \ + -e 's/J\xf6nsson/J\xc3\xb6nsson/' \ + -e 's/V\xef\xbf\xbdis\xef\xbf\xbdnen/V\xc3\xa4is\xc3\xa4nen/' \ + -e 's/J\xef\xbf\xbdrg/J\xc3\xb6rg/' \ + -e 's/M\xef\xbf\xbdsli/M\xc3\xb6sli/' \ + -e 's/R\xe4ty/R\xc3\xa4ty/' \ + -e 's/2003\xc2\xad-/2003-/' \ + -e 's/\xc2\xa0/ /g' \ + -e 's/ \xa0/ /g' \ + -e 's/\xa0 //' \ + `find . -name \*ChangeLog\*` +LC_ALL=C sed -i -e 's/\xa0/ /' gcc/doc/options.texi + %ifarch ppc if [ -d libstdc++-v3/config/abi/post/powerpc64-linux-gnu ]; then mkdir -p libstdc++-v3/config/abi/post/powerpc64-linux-gnu/64 @@ -523,12 +542,6 @@ rm -fr obj-%{gcc_target_platform} mkdir obj-%{gcc_target_platform} cd obj-%{gcc_target_platform} -if [ ! -f /usr/lib/locale/de_DE/LC_CTYPE ]; then - mkdir locale - localedef -f ISO-8859-1 -i de_DE locale/de_DE - export LOCPATH=`pwd`/locale:/usr/lib/locale -fi - %if %{build_java} %if !%{bootstrap_java} # If we don't have gjavah in $PATH, try to build it with the old gij @@ -738,10 +751,6 @@ perl -pi -e \ cd obj-%{gcc_target_platform} -if [ ! -f /usr/lib/locale/de_DE/LC_CTYPE ]; then - export LOCPATH=`pwd`/locale:/usr/lib/locale -fi - %if %{build_java} export PATH=`pwd`/../fastjar-%{fastjar_ver}/obj-%{gcc_target_platform}${PATH:+:$PATH} %if !%{bootstrap_java} @@ -1073,6 +1082,7 @@ rm -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/{libffi*,libiberty.a} rm -f $FULLEPATH/install-tools/{mkheaders,fixincl} rm -f $RPM_BUILD_ROOT%{_prefix}/lib/{32,64}/libiberty.a rm -f $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libssp* +rm -f $RPM_BUILD_ROOT%{_prefix}/bin/gnative2ascii %ifarch %{multilib_64_archs} # Remove libraries for the other arch on multilib arches @@ -1692,6 +1702,18 @@ fi %doc rpm.doc/changelogs/libmudflap/ChangeLog* %changelog +* Fri Sep 5 2008 Jakub Jelinek 4.3.2-2 +- update from gcc-4_3-branch + - PRs c++/37348, c/37261, fortran/36371, fortran/37193, middle-end/36449, + target/36332, target/37168 +- make ChangeLog files and gcc.info valid UTF-8, remove gnative2ascii from + gcc-gnat, comment out most of the Obsoletes (#225778) +- on x86_64 decrease frame size in varargs functions that don't need saving + gpr or fpr registers +- fix ICE on implicitly determined firstprivate where copy ctor or dtor + needs synthetization (PR c++/37189) +- document how to recrease the tarball + * Fri Aug 29 2008 Jakub Jelinek 4.3.2-1 - update from gcc-4_3-branch - 4.3.2 release diff --git a/sources b/sources index bcc8a35..f764cd9 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -69f70d92142466361146326f840a6185 gcc-4.3.2-20080829.tar.bz2 +373bfd18d804b93123d89b793967fb3b gcc-4.3.2-20080905.tar.bz2 92a70f9e56223b653bce0f58f90cf950 fastjar-0.95.tar.gz