+2004-10-20  Zack Weinberg  <zack@codesourcery.com>
+
+       * dbxout.c (asmfile): Delete.  All uses changed to asm_out_file.
+       (DBX_BLOCKS_FUNCTION_RELATIVE, DBX_LINES_FUNCTION_RELATIVE):
+       Default to 0.
+       (dbxout_source_line): Use DBX_OUTPUT_SOURCE_LINE when defined.
+       When it is not, but DBX_LINES_FUNCTION_RELATIVE is true, emit
+       an internal label and an N_SLINE .stabn whose value is the
+       difference between that label and the function entry label.
+       (dbxout_finish): If DBX_OUTPUT_MAIN_SOURCE_FILE_END is not defined,
+       but DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END is, emit a
+       label and an N_SO stab with an empty string referring to it.
+       (dbx_output_lbrac, dbx_output_rbrac): Use if statement instead
+       of #ifdef directive to test DBX_BLOCKS_FUNCTION_RELATIVE.
+       (dbxout_type_methods, dbxout_symbol): Remove #if 0 block.
+       (dbxout_prepare_symbol): Remove #ifdef WINNING_GDB block, this
+       macro is never defined.
+       * sdbout.c (sdbout_source_line_counter): Delete.
+       (PUT_SDB_SRC_FILE): Delete.  Uses replaced with sole definition.
+       (sdbout_source_line): Use SDB_OUTPUT_SOURCE_LINE, which takes
+       only two arguments.
+       * xcoffout.c (ASM_OUTPUT_SOURCE_LINE): Rename ASM_OUTPUT_LINE.
+
+       * config/dbxcoff.h, config/dbxelf.h: Remove unncessary #undefs.
+       * config/c4x/c4x.h, config/pa/pa.h: Remove unnecessary macro
+       definitions (identical to default).
+       * config/darwin.h, config/dbxcoff.h, config/dbxelf.h, config/ptx4.h
+       * config/h8300/coff.h, config/pa/som.h, config/sh/elf.h:
+       Define DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END, not
+       DBX_OUTPUT_MAIN_SOURCE_FILE_END.
+       * config/dbxcoff.h, config/dbxelf.h, config/ptx4.h
+       * config/mcore/mcore-pe.h, config/pa/som.h, config/sh/elf.h:
+       Define DBX_LINES_FUNCTION_RELATIVE, not ASM_OUTPUT_SOURCE_LINE.
+       * config/alpha/alpha-protos.h: Don't prototype alpha_output_lineno.
+       * config/alpha/alpha.c: Move declaration of num_source_filenames up.
+       (alpha_start_function): Use SDB_OUTPUT_SOURCE_LINE.
+       (sym_lineno): Delete.
+       (alpha_output_filename): Do not emit N_SOL stabs here.  Remove
+       now-unused variable.
+       (alpha_output_lineno): Delete.
+       * config/mips/mips-protos.h: Don't prototype mips_output_lineno.
+       * config/mips/mips.c (mips_output_filename): Don't use
+       ASM_OUTPUT_FILENAME. Don't emit N_SOL stabs here.
+       (mips_output_lineno): Delete.
+       (mips_output_function_prologue: Use SDB_OUTPUT_SOURCE_LINE.
+       * config/alpha/alpha.h: Define DBX_OUTPUT_SOURCE_LINE and
+       SDB_OUTPUT_SOURCE_LINE, not ASM_OUTPUT_SOURCE_LINE.
+       * config/mips/mips.h: Likewise.  Don't define ASM_OUTPUT_FILENAME.
+       * config/mips/sdb.h: Use SDB_OUTPUT_SOURCE_LINE.
+       * config/avr/avr.h: Don't define ASM_OUTPUT_SOURCE_LINE.
+       * config/mmix/mmix.h: Likewise.
+       * config/mmix/mmix.c (mmix_asm_output_source_line): Delete.
+       * config/mmix/mmix-protos.h: Don't prototype it.
+       * config/alpha/unicosmk.h: Also #undef PREFERRED_DEBUGGING_TYPE;
+       no need to #undef ASM_OUTPUT_SOURCE_LINE.
+       * config/arm/aout.h: Remove RISCiX-specific definition of
+       DBX_OUTPUT_MAIN_SOURCE_FILENAME.
+       * config/m32r/m32r.h: Define DBX_OUTPUT_SOURCE_LINE, not
+       ASM_OUTPUT_SOURCE_LINE.
+       * config/rs6000/rs6000.h: (ASM_OUTPUT_SOURCE_LINE): Rename
+       DBX_OUTPUT_SOURCE_LINE.  Don't use current_function_func_begin_label.
+       * config/vax/elf.h: No need to define DBX_OUTPUT_FUNCTION_END.
+
+       * doc/tm.texi: Update.
+
 2004-10-20  Richard Henderson  <rth@redhat.com>
 
        * tree-sra.c (instantiate_element): Copy DECL_IGNORED_P also.
        * c-parse.in (reservedwords): Add OBJC_TYPE_QUAL as alternative.
 
 2004-10-18  Eric Botcazou  <ebotcazou@libertysurf.fr>
-            Roger Sayle  <roger@eyesopen.com>
+           Roger Sayle  <roger@eyesopen.com>
 
        PR middle-end/17813
        * dojump.c (discard_pending_stack_adjust): New function.
 
 2004-10-18  Richard Henderson  <rth@redhat.com>
 
-       * c-common.c (handle_mode_attribute): Allow scalar->vector 
+       * c-common.c (handle_mode_attribute): Allow scalar->vector
        type changes yet.
 
 2004-10-18  Kazu Hirata  <kazu@cs.umass.edu>
        * params.def: Add parameter to restrict the number of expansions.
        * params.h: (MAX_VARIABLE_EXPANSIONS): New define to restrict
        the number of expansions.
-       * common.opt: (fvariable-expansion-in-unroller): New flag. 
+       * common.opt: (fvariable-expansion-in-unroller): New flag.
        * doc/invoke.texi: (fvariable-expansion-in-unroller): Document.
 
 2004-10-18  Danny Smith  <dannysmith@users.sourceforge.net>
        Revert:
        2004-10-17  Andrew Pinski  <pinskia@physics.uc.edu>
 
-        * c-typeck.c (default_function_array_conversion): Always create
-        &a[0] for array types.
-        (build_unary_op): Do not fold &a[x] into a + x.
+       * c-typeck.c (default_function_array_conversion): Always create
+       &a[0] for array types.
+       (build_unary_op): Do not fold &a[x] into a + x.
 
 2004-10-17  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * tree.h (struct pointer_set_t): Declare as opaque type.
        (tree_walk): Last argument is pointer_set_t* now.
        * tree-inline.c (WALK_SUBTREE): Convert from htab to pset.
-       (walk_type_fields): 
+       (walk_type_fields):
        (walk_tree): Convert from htab_t to pointer_set_t for keeping
        track of which nodes have already been visited.
        (walk_tree_without_duplicates): Convert from htab_t to pointer_set_t.
        (tree-inline.o): Depends on pointer-set.h
        (tree-dfa.o): Likewise
        (cgraphunit.o): Likewise
-       
+
 2004-10-14  Geoffrey Keating  <geoffk@apple.com>
 
        * config/rs6000/darwin.h (ASM_SPEC): Delete.
        PR 17635
        * tree-if-conv.c (process_phi_nodes): Process latch block.
        (combine_blocks): Process latch block and update loop structure.
-       
+
 2004-10-14  Olga Golovanevsky  <olga@il.ibm.com>
 
        * tree-vectorizer.c (vect_generate_tmps_on_preheader):
        (tree_duplicate_loop_to_edge_cfg):
        (add_loop_guard):
        (vect_analyze_loop_with_symbolic_num_of_iters):
-       (verify_loop_for_duplication): 
+       (verify_loop_for_duplication):
        (vect_gen_niters_for_prolog_loop):
        (vect_update_niters_after_peeling):
        (vect_update_inits_of_dr):
        (vect_build_loop_niters):
        (vect_do_peeling_for_alignment): New functions.
        (vect_transform_loop): Add unknown and known but indivisible loop
-       bound support; add peeling for unalignment support. 
+       bound support; add peeling for unalignment support.
        (vect_analyze_loop_form): Support symbolic number of iterations.
        (vect_transform_loop_bound): New input parameter.
        (vect_get_loop_niters): Change input parameter type.
        (vectorize_loops): Add rewrite_into_loop_closed_ssa.
        (vect_analyze_data_refs_alignment): Allowed one unaligned
        store.
-       * tree-vectorizer.h (LOOP_VINFO_NITERS_KNOWN_P): Redefined 
+       * tree-vectorizer.h (LOOP_VINFO_NITERS_KNOWN_P): Redefined
        to use tree.
        (LOOP_VINFO_INT_NITERS): New macro.
        (MAX_NUMBER_OF_UNALIGNED_DATA_REFS): New define.
 
 2004-10-13  Richard Henderson  <rth@redhat.com>
 
-        PR c/17384
-        * c-common.c (handle_mode_attribute): Disallow mode changes that
-        alter the CODE of the top-level type.
- 
-        * crtstuff.c (__FRAME_END__): Remove mode attribute.  Find 32-bit
-        integer from internal limits macros.
-        * config/i386/mm3dnow.h (__v2sf): Fix base type.
+       PR c/17384
+       * c-common.c (handle_mode_attribute): Disallow mode changes that
+       alter the CODE of the top-level type.
+
+       * crtstuff.c (__FRAME_END__): Remove mode attribute.  Find 32-bit
+       integer from internal limits macros.
+       * config/i386/mm3dnow.h (__v2sf): Fix base type.
 
 2004-10-13  Richard Henderson  <rth@redhat.com>
- 
-        PR debug/13841
-        * function.c (instantiate_decl): Recurse for CONCAT.
+
+       PR debug/13841
+       * function.c (instantiate_decl): Recurse for CONCAT.
 
 2004-10-13  David Edelsohn  <edelsohn@gnu.org>
 
 
        * Makefile.in (tree-ssa-loop-niter.o): Depends on tree-data-ref.h.
        * cfgloop.c (initialize_loops_parallel_p): New.
-       (flow_loops_find): Initialize the parallel_p field to true for all 
+       (flow_loops_find): Initialize the parallel_p field to true for all
        the loops.
        * tree-ssa-loop-niter.c: Include "tree-data-ref.h".
-       (estimate_numbers_of_iterations_loop): Infers the loop bounds from 
+       (estimate_numbers_of_iterations_loop): Infers the loop bounds from
        the size of the data accessed in the loop.
-       (struct nb_iter_bound): Moved... 
+       (struct nb_iter_bound): Moved...
        * cfgloop.h (struct nb_iter_bound): ... here.
        (estimated_nb_iterations, parallel_p): New fields in struct loop.
        (record_estimate): Declare extern here.
        * tree-chrec.c: Fix comments.
        (nb_vars_in_chrec): New function.
        * tree-chrec.h (nb_vars_in_chrec): Declared here.
-       * tree-data-ref.c: Don't include lambda.h, that is already included 
+       * tree-data-ref.c: Don't include lambda.h, that is already included
        in tree-data-ref.h.
        (tree_fold_divides_p): Don't check for integer_onep.
        (tree_fold_bezout): Removed.
        (gcd): New static duplicated function.
        (int_divides_p, dump_subscript): New.
        (dump_data_dependence_relation): Use dump_subscript.
-       (dump_dist_dir_vectors, dump_ddrs, compute_estimated_nb_iterations, 
+       (dump_dist_dir_vectors, dump_ddrs, compute_estimated_nb_iterations,
        estimate_niter_from_size_of_data): New.
-       (analyze_array_indexes, analyze_array): Call 
-       estimate_niter_from_size_of_data during the detection of array 
-       references.  Pass in a pointer to the statement that contains the 
+       (analyze_array_indexes, analyze_array): Call
+       estimate_niter_from_size_of_data during the detection of array
+       references.  Pass in a pointer to the statement that contains the
        array reference.
        (all_chrecs_equal_p): New.
        (compute_distance_vector): Renamed compute_subscript_distance.
        Deal with multivariate conflict functions.
-       (initialize_data_dependence_relation): Initialize DDR_AFFINE_P, 
+       (initialize_data_dependence_relation): Initialize DDR_AFFINE_P,
        DDR_SIZE_VECT, DDR_DIST_VECT, and DDR_DIR_VECT.
        (non_affine_dependence_relation): New.
-       (analyze_ziv_subscript, analyze_siv_subscript_cst_affine, 
-       analyze_siv_subscript, analyze_miv_subscript, 
-       analyze_overlapping_iterations, subscript_dependence_tester): 
+       (analyze_ziv_subscript, analyze_siv_subscript_cst_affine,
+       analyze_siv_subscript, analyze_miv_subscript,
+       analyze_overlapping_iterations, subscript_dependence_tester):
        Initialize and return last_conflicts function.
        (initialize_matrix_A, FLOOR, compute_overlap_steps_for_affine_univar,
        compute_overlap_steps_for_affine_1_2): New.
        (analyze_siv_subscript_affine_cst): Removed.
-       (analyze_subscript_affine_affine): Disprove dependences based on the 
-       iteration domains.  Solve the univariate dependence case as before, 
+       (analyze_subscript_affine_affine): Disprove dependences based on the
+       iteration domains.  Solve the univariate dependence case as before,
        but use lambda_matrix_right_hermite instead of tree_fold_bezout.
        Implement the multivariate case of 2 versus 1 variables.
-       (build_classic_dist_vector, build_classic_dir_vector): Implement some 
+       (build_classic_dist_vector, build_classic_dir_vector): Implement some
        unhandled cases.
-       (find_data_references_in_loop): Compute and initialize 
+       (find_data_references_in_loop): Compute and initialize
        loop->estimated_nb_iterations and loop->parallel_p.
        (analyze_all_data_dependences): Modify the debug dump order.
        * tree-data-ref.h (SUB_LAST_CONFLICT_IN_A, SUB_LAST_CONFLICT_IN_B,
        subscript->last_conflict_in_a, subscript->last_conflict_in_b): Removed.
-       (SUB_LAST_CONFLICT, subscript->last_conflict, 
+       (SUB_LAST_CONFLICT, subscript->last_conflict,
        data_dependence_relation->affine_p, data_dependence_relation->size_vect,
        DDR_AFFINE_P, DDR_SIZE_VECT): New.
        (find_data_references_in_loop, initialize_data_dependence_relation,
        PR 17892
        * tree-ssa-dom.c (unsafe_associative_fp_binop): New function.
        (simplify_rhs_and_lookup_avail_expr): Disallow associativity
-       and constant folding of floating point MULT_EXPR/PLUS_EXPR 
+       and constant folding of floating point MULT_EXPR/PLUS_EXPR
        expressions.
 
 2004-10-12  Ulrich Weigand  <uweigand@de.ibm.com>
        PR middle-end/17657
        * stmt.c (add_case_node): Add additional type argument.  Declare
        as static to match prototype.  Convert the upper and lower bounds
-       to the specified index type.  Optimize away case ranges/values 
+       to the specified index type.  Optimize away case ranges/values
        that are outside the index type's bounds.  Truncate case ranges
        that span the index type's bounds.
        (expand_case): Avoid unnessary computation and memory allocation
 
 #include "regs.h"
 #include "insn-config.h"
 #include "reload.h"
-#include "output.h" /* ASM_OUTPUT_SOURCE_LINE may refer to sdb functions.  */
+#include "output.h"
 #include "dbxout.h"
 #include "toplev.h"
 #include "tm_p.h"
 #define NO_DBX_BNSYM_ENSYM 0
 #endif
 
+#ifndef DBX_BLOCKS_FUNCTION_RELATIVE
+#define DBX_BLOCKS_FUNCTION_RELATIVE 0
+#endif
+
+#ifndef DBX_LINES_FUNCTION_RELATIVE
+#define DBX_LINES_FUNCTION_RELATIVE 0
+#endif
+
 enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED};
 
 /* Structure recording information about a C data type.
 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
 #endif
 
-/* Stream for writing to assembler file.  */
-
-static FILE *asmfile;
-
 /* These variables are for dbxout_symbol to communicate to
    dbxout_finish_symbol.
    current_sym_code is the symbol-type-code, a symbol N_... define in stab.h.
      the system doesn't insert underscores in front of user generated
      labels.  */
   ASM_GENERATE_INTERNAL_LABEL (lscope_label_name, "Lscope", scope_labelno);
-  targetm.asm_out.internal_label (asmfile, "Lscope", scope_labelno);
+  targetm.asm_out.internal_label (asm_out_file, "Lscope", scope_labelno);
   scope_labelno++;
 
   /* The N_FUN tag at the end of the function is a GNU extension,
   /* By convention, GCC will mark the end of a function with an N_FUN
      symbol and an empty string.  */
 #ifdef DBX_OUTPUT_NFUN
-  DBX_OUTPUT_NFUN (asmfile, lscope_label_name, current_function_decl);
+  DBX_OUTPUT_NFUN (asm_out_file, lscope_label_name, current_function_decl);
 #else
-  fprintf (asmfile, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN);
-  assemble_name (asmfile, lscope_label_name);
-  putc ('-', asmfile);
-  assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
-  fprintf (asmfile, "\n");
+  fprintf (asm_out_file, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN);
+  assemble_name (asm_out_file, lscope_label_name);
+  putc ('-', asm_out_file);
+  assemble_name (asm_out_file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
+  fprintf (asm_out_file, "\n");
 #endif
 
   if (!NO_DBX_BNSYM_ENSYM && !flag_debug_only_used_symbols)
-    fprintf (asmfile, "%s%d,0,0\n", ASM_STABD_OP, N_ENSYM);
+    fprintf (asm_out_file, "%s%d,0,0\n", ASM_STABD_OP, N_ENSYM);
 }
 #endif /* DBX_DEBUGGING_INFO */
 
   char ltext_label_name[100];
   tree syms = lang_hooks.decls.getdecls ();
 
-  asmfile = asm_out_file;
-
   typevec_len = 100;
   typevec = ggc_calloc (typevec_len, sizeof typevec[0]);
 
       if (cwd)
        {
 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
-         DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile, cwd);
+         DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asm_out_file, cwd);
 #else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
-         fprintf (asmfile, "%s", ASM_STABS_OP);
-         output_quoted_string (asmfile, cwd);
-         fprintf (asmfile, ",%d,0,%d,", N_SO, get_lang_number ());
-         assemble_name (asmfile, ltext_label_name);
-         fputc ('\n', asmfile);
+         fprintf (asm_out_file, "%s", ASM_STABS_OP);
+         output_quoted_string (asm_out_file, cwd);
+         fprintf (asm_out_file, ",%d,0,%d,", N_SO, get_lang_number ());
+         assemble_name (asm_out_file, ltext_label_name);
+         fputc ('\n', asm_out_file);
 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
        }
     }
 
 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
-  DBX_OUTPUT_MAIN_SOURCE_FILENAME (asmfile, input_file_name);
+  DBX_OUTPUT_MAIN_SOURCE_FILENAME (asm_out_file, input_file_name);
 #else /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
   /* We include outputting `Ltext:' here,
      because that gives you a way to override it.  */
   /* Used to put `Ltext:' before the reference, but that loses on sun 4.  */
-  fprintf (asmfile, "%s", ASM_STABS_OP);
-  output_quoted_string (asmfile, input_file_name);
-  fprintf (asmfile, ",%d,0,%d,", N_SO, get_lang_number ());
-  assemble_name (asmfile, ltext_label_name);
-  fputc ('\n', asmfile);
+  fprintf (asm_out_file, "%s", ASM_STABS_OP);
+  output_quoted_string (asm_out_file, input_file_name);
+  fprintf (asm_out_file, ",%d,0,%d,", N_SO, get_lang_number ());
+  assemble_name (asm_out_file, ltext_label_name);
+  fputc ('\n', asm_out_file);
   text_section ();
-  targetm.asm_out.internal_label (asmfile, "Ltext", 0);
+  targetm.asm_out.internal_label (asm_out_file, "Ltext", 0);
 #endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
 
 #ifdef DBX_OUTPUT_GCC_MARKER
-  DBX_OUTPUT_GCC_MARKER (asmfile);
+  DBX_OUTPUT_GCC_MARKER (asm_out_file);
 #else
   /* Emit an N_OPT stab to indicate that this file was compiled by GCC.  */
-  fprintf (asmfile, "%s\"%s\",%d,0,0,0\n",
+  fprintf (asm_out_file, "%s\"%s\",%d,0,0,0\n",
           ASM_STABS_OP, STABS_GCC_MARKER, N_OPT);
 #endif
 
 static void
 emit_bincl_stab (const char *name)
 {
-  fprintf (asmfile, "%s", ASM_STABS_OP);
-  output_quoted_string (asmfile, name);
-  fprintf (asmfile, ",%d,0,0,0\n", N_BINCL);
+  fprintf (asm_out_file, "%s", ASM_STABS_OP);
+  output_quoted_string (asm_out_file, name);
+  fprintf (asm_out_file, ",%d,0,0,0\n", N_BINCL);
 }
 
 /* If there are pending bincls then it is time to emit all of them.  */
 #ifdef DBX_USE_BINCL
   /* Emit EINCL stab only if BINCL is not pending.  */
   if (current_file->bincl_status == BINCL_PROCESSED)
-    fprintf (asmfile, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
+    fprintf (asm_out_file, "%s%d,0,0,0\n", ASM_STABN_OP, N_EINCL);
   current_file->bincl_status = BINCL_NOT_REQUIRED;
   current_file = current_file->next;
 #endif
                                   source_label_number);
       fprintf (file, "%s", ASM_STABS_OP);
       output_quoted_string (file, filename);
-      fprintf (asmfile, ",%d,0,0,", N_SOL);
-      assemble_name (asmfile, ltext_label_name);
-      fputc ('\n', asmfile);
+      fprintf (asm_out_file, ",%d,0,0,", N_SOL);
+      assemble_name (asm_out_file, ltext_label_name);
+      fputc ('\n', asm_out_file);
       if (current_function_decl != NULL_TREE
          && DECL_SECTION_NAME (current_function_decl) != NULL_TREE)
        ; /* Don't change section amid function.  */
       && !NO_DBX_FUNCTION_END
       && !NO_DBX_BNSYM_ENSYM
       && !flag_debug_only_used_symbols)
-    fprintf (asmfile, "%s%d,0,0\n", ASM_STABD_OP, N_BNSYM);
+    fprintf (asm_out_file, "%s%d,0,0\n", ASM_STABD_OP, N_BNSYM);
 
   dbxout_source_line (lineno, filename);
 }
 static void
 dbxout_source_line (unsigned int lineno, const char *filename)
 {
-  dbxout_source_file (asmfile, filename);
+  dbxout_source_file (asm_out_file, filename);
 
-#ifdef ASM_OUTPUT_SOURCE_LINE
+#ifdef DBX_OUTPUT_SOURCE_LINE
   dbxout_source_line_counter += 1;
-  ASM_OUTPUT_SOURCE_LINE (asmfile, lineno, dbxout_source_line_counter);
+  DBX_OUTPUT_SOURCE_LINE (asm_out_file, lineno, dbxout_source_line_counter);
 #else
-  fprintf (asmfile, "%s%d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);
+  if (DBX_LINES_FUNCTION_RELATIVE)
+    {
+      char label[100];
+      dbxout_source_line_counter += 1;
+
+      ASM_GENERATE_INTERNAL_LABEL (label, "LM", dbxout_source_line_counter);
+      fprintf (asm_out_file, "%s%d,0,%d,", ASM_STABN_OP, N_SLINE, lineno);
+      assemble_name (asm_out_file, label);
+      putc ('-', asm_out_file);
+      assemble_name (asm_out_file,
+                    XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
+      putc ('\n', asm_out_file);
+      targetm.asm_out.internal_label (asm_out_file, "LM",
+                                     dbxout_source_line_counter);
+    }
+  else
+    fprintf (asm_out_file, "%s%d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);
 #endif
 }
 
 dbxout_begin_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
 {
   emit_pending_bincls_if_required ();
-  targetm.asm_out.internal_label (asmfile, "LBB", n);
+  targetm.asm_out.internal_label (asm_out_file, "LBB", n);
 }
 
 /* Describe the end line-number of an internal block within a function.  */
 dbxout_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int n)
 {
   emit_pending_bincls_if_required ();
-  targetm.asm_out.internal_label (asmfile, "LBE", n);
+  targetm.asm_out.internal_label (asm_out_file, "LBE", n);
 }
 
 /* Output dbx data for a function definition.
 #endif
   dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
 #ifdef DBX_OUTPUT_FUNCTION_END
-  DBX_OUTPUT_FUNCTION_END (asmfile, decl);
+  DBX_OUTPUT_FUNCTION_END (asm_out_file, decl);
 #endif
   dbxout_function_end ();
 }
 }
 
 /* At the end of compilation, finish writing the symbol table.
-   Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
-   to do nothing.  */
+   The default is to call debug_free_queue but do nothing else.  */
 
 static void
 dbxout_finish (const char *filename ATTRIBUTE_UNUSED)
 {
 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
-  DBX_OUTPUT_MAIN_SOURCE_FILE_END (asmfile, filename);
-#endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
-
+  DBX_OUTPUT_MAIN_SOURCE_FILE_END (asm_out_file, filename);
+#elif defined DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
+ {
+   char letext_label[100];
+   ASM_GENERATE_INTERNAL_LABEL (letext_label, "Letext", 0);
+   fprintf (asm_out_file, "%s\"\",%d,0,0,", ASM_STABS_OP, N_SO);
+   assemble_name (asm_out_file, letext_label);
+   putc ('\n', asm_out_file);
+   targetm.asm_out.internal_label (asm_out_file, "Letext", 0);
+ }
+#endif
   debug_free_queue ();
 }
 
 dbxout_type_index (tree type)
 {
 #ifndef DBX_USE_BINCL
-  fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
+  fprintf (asm_out_file, "%d", TYPE_SYMTAB_ADDRESS (type));
   CHARS (3);
 #else
   struct typeinfo *t = &typevec[TYPE_SYMTAB_ADDRESS (type)];
-  fprintf (asmfile, "(%d,%d)", t->file_number, t->type_number);
+  fprintf (asm_out_file, "(%d,%d)", t->file_number, t->type_number);
   CHARS (9);
 #endif
 }
 {
   emit_pending_bincls_if_required ();
 #ifdef DBX_CONTIN_CHAR
-  fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
+  fprintf (asm_out_file, "%c", DBX_CONTIN_CHAR);
 #else
-  fprintf (asmfile, "\\\\");
+  fprintf (asm_out_file, "\\\\");
 #endif
   dbxout_finish_symbol (NULL_TREE);
-  fprintf (asmfile, "%s\"", ASM_STABS_OP);
+  fprintf (asm_out_file, "%s\"", ASM_STABS_OP);
   current_sym_nchars = 0;
 }
 #endif /* DBX_CONTIN_LENGTH > 0 */
 
          if (DECL_NAME (tem))
            {
-             fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem)));
+             fprintf (asm_out_file, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem)));
              CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem)));
            }
          else
            {
-             fprintf (asmfile, ":");
+             fprintf (asm_out_file, ":");
              CHARS (1);
            }
 
                  || TREE_CODE (tem) != FIELD_DECL))
            {
              have_used_extensions = 1;
-             putc ('/', asmfile);
+             putc ('/', asm_out_file);
              putc ((TREE_PRIVATE (tem) ? '0'
                     : TREE_PROTECTED (tem) ? '1' : '2'),
-                   asmfile);
+                   asm_out_file);
              CHARS (2);
            }
 
                  tree name = DECL_ASSEMBLER_NAME (tem);
 
                  have_used_extensions = 1;
-                 fprintf (asmfile, ":%s;", IDENTIFIER_POINTER (name));
+                 fprintf (asm_out_file, ":%s;", IDENTIFIER_POINTER (name));
                  CHARS (IDENTIFIER_LENGTH (name) + 2);
                }
              else
                {
                  /* If TEM is non-static, GDB won't understand it.  */
-                 fprintf (asmfile, ",0,0;");
+                 fprintf (asm_out_file, ",0,0;");
                  CHARS (5);
                }
            }
          else
            {
-             putc (',', asmfile);
+             putc (',', asm_out_file);
              print_wide_int (int_bit_position (tem));
-             putc (',', asmfile);
+             putc (',', asm_out_file);
              print_wide_int (tree_low_cst (DECL_SIZE (tem), 1));
-             putc (';', asmfile);
+             putc (';', asm_out_file);
              CHARS (3);
            }
        }
        c2 = '.';
     }
 
-  fprintf (asmfile, ":%s;%c%c%c", debug_name,
+  fprintf (asm_out_file, ":%s;%c%c%c", debug_name,
           TREE_PRIVATE (decl) ? '0'
           : TREE_PROTECTED (decl) ? '1' : '2', c1, c2);
   CHARS (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl)) + 6
   if (DECL_VINDEX (decl) && host_integerp (DECL_VINDEX (decl), 0))
     {
       print_wide_int (tree_low_cst (DECL_VINDEX (decl), 0));
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
       dbxout_type (DECL_CONTEXT (decl), 0);
-      fprintf (asmfile, ";");
+      fprintf (asm_out_file, ";");
       CHARS (1);
     }
 }
 
   type_encoding = DECL_NAME (TYPE_NAME (type));
 
-#if 0
-  /* C++: Template classes break some assumptions made by this code about
-     the class names, constructor names, and encodings for assembler
-     label names.  For now, disable output of dbx info for them.  */
-  {
-    const char *ptr = IDENTIFIER_POINTER (type_encoding);
-    /* This should use index.  (mrs) */
-    while (*ptr && *ptr != '<') ptr++;
-    if (*ptr != 0)
-      {
-       static int warned;
-       if (!warned)
-           warned = 1;
-       return;
-      }
-  }
-#endif
-
   type_identifier_length = IDENTIFIER_LENGTH (type_encoding);
 
   sprintf (formatted_type_identifier_length, "%d", type_identifier_length);
          if (need_prefix)
            {
              tree name = DECL_NAME (fndecl);
-             fprintf (asmfile, "%s::", IDENTIFIER_POINTER (name));
+             fprintf (asm_out_file, "%s::", IDENTIFIER_POINTER (name));
              CHARS (IDENTIFIER_LENGTH (name) + 2);
              need_prefix = 0;
            }
        }
       if (!need_prefix)
        {
-         putc (';', asmfile);
+         putc (';', asm_out_file);
          CHARS (1);
        }
     }
 static void
 dbxout_range_type (tree type)
 {
-  fprintf (asmfile, "r");
+  fprintf (asm_out_file, "r");
   if (TREE_TYPE (type))
     dbxout_type (TREE_TYPE (type), 0);
   else if (TREE_CODE (type) != INTEGER_TYPE)
   if (TYPE_MIN_VALUE (type) != 0
       && host_integerp (TYPE_MIN_VALUE (type), 0))
     {
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
       if (print_int_cst_bounds_in_octal_p (type))
         print_int_cst_octal (TYPE_MIN_VALUE (type));
     }
   else
     {
-      fprintf (asmfile, ";0");
+      fprintf (asm_out_file, ";0");
       CHARS (2);
     }
 
   if (TYPE_MAX_VALUE (type) != 0
       && host_integerp (TYPE_MAX_VALUE (type), 0))
     {
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
       if (print_int_cst_bounds_in_octal_p (type))
         print_int_cst_octal (TYPE_MAX_VALUE (type));
       else
         print_wide_int (tree_low_cst (TYPE_MAX_VALUE (type), 0));
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
     }
   else
     {
-      fprintf (asmfile, ";-1;");
+      fprintf (asm_out_file, ";-1;");
       CHARS (4);
     }
 }
 
   /* Output a definition now.  */
 
-  fprintf (asmfile, "=");
+  fprintf (asm_out_file, "=");
   CHARS (1);
 
   /* Mark it as defined, so that if it is self-referent
      cv-qualified types if we're using extensions.  */
   if (TYPE_READONLY (type) > TYPE_READONLY (main_variant))
     {
-      putc ('k', asmfile);
+      putc ('k', asm_out_file);
       CHARS (1);
       dbxout_type (build_type_variant (type, 0, TYPE_VOLATILE (type)), 0);
       return;
     }
   else if (TYPE_VOLATILE (type) > TYPE_VOLATILE (main_variant))
     {
-      putc ('B', asmfile);
+      putc ('B', asm_out_file);
       CHARS (1);
       dbxout_type (build_type_variant (type, TYPE_READONLY (type), 0), 0);
       return;
             from the output of pcc.
             This used to use `r2' explicitly and we used to
             take care to make sure that `char' was type number 2.  */
-         fprintf (asmfile, "r");
+         fprintf (asm_out_file, "r");
          CHARS (1);
          dbxout_type_index (type);
-         fprintf (asmfile, ";0;127;");
+         fprintf (asm_out_file, ";0;127;");
          CHARS (7);
        }
 
              && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
            {
              have_used_extensions = 1;
-             fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
+             fprintf (asm_out_file, "@s%d;", TYPE_PRECISION (type));
              CHARS (5);
            }
 
              && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
            {
              have_used_extensions = 1;
-             fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
+             fprintf (asm_out_file, "@s%d;", TYPE_PRECISION (type));
              CHARS (5);
            }
 
          if (print_int_cst_bounds_in_octal_p (type))
            {
-             fprintf (asmfile, "r");
+             fprintf (asm_out_file, "r");
              CHARS (1);
 
               /* If this type derives from another type, output type index of
               else
                 dbxout_type_index (type);
 
-             fprintf (asmfile, ";");
+             fprintf (asm_out_file, ";");
              CHARS (1);
              print_int_cst_octal (TYPE_MIN_VALUE (type));
-             fprintf (asmfile, ";");
+             fprintf (asm_out_file, ";");
              CHARS (1);
              print_int_cst_octal (TYPE_MAX_VALUE (type));
-             fprintf (asmfile, ";");
+             fprintf (asm_out_file, ";");
              CHARS (1);
            }
 
     case REAL_TYPE:
       /* This used to say `r1' and we used to take care
         to make sure that `int' was type number 1.  */
-      fprintf (asmfile, "r");
+      fprintf (asm_out_file, "r");
       CHARS (1);
       dbxout_type_index (integer_type_node);
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
       print_wide_int (int_size_in_bytes (type));
-      fputs (";0;", asmfile);
+      fputs (";0;", asm_out_file);
       CHARS (3);
       break;
 
       if (use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         fputs ("@s", asmfile);
+         fputs ("@s", asm_out_file);
          CHARS (2);
          print_wide_int (BITS_PER_UNIT * int_size_in_bytes (type));
-         fputs (";-20;", asmfile);
+         fputs (";-20;", asm_out_file);
          CHARS (4);
        }
       else
        {
          /* Output the type `char' as a subrange of itself.
             That is what pcc seems to do.  */
-         fprintf (asmfile, "r");
+         fprintf (asm_out_file, "r");
          CHARS (1);
          dbxout_type_index (char_type_node);
-         fprintf (asmfile, ";0;%d;", TYPE_UNSIGNED (type) ? 255 : 127);
+         fprintf (asm_out_file, ";0;%d;", TYPE_UNSIGNED (type) ? 255 : 127);
          CHARS (7);
        }
       break;
       if (use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         fputs ("@s", asmfile);
+         fputs ("@s", asm_out_file);
          CHARS (2);
          print_wide_int (BITS_PER_UNIT * int_size_in_bytes (type));
-         fputs (";-16;", asmfile);
+         fputs (";-16;", asm_out_file);
          CHARS (4);
        }
       else /* Define as enumeral type (False, True) */
        {
-         fprintf (asmfile, "eFalse:0,True:1,;");
+         fprintf (asm_out_file, "eFalse:0,True:1,;");
          CHARS (17);
        }
       break;
 
     case FILE_TYPE:
-      putc ('d', asmfile);
+      putc ('d', asm_out_file);
       CHARS (1);
       dbxout_type (TREE_TYPE (type), 0);
       break;
 
       if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
        {
-         fputs ("R3;", asmfile);
+         fputs ("R3;", asm_out_file);
          CHARS (3);
          print_wide_int (2 * int_size_in_bytes (TREE_TYPE (type)));
-         fputs (";0;", asmfile);
+         fputs (";0;", asm_out_file);
          CHARS (3);
        }
       else
        {
          /* Output a complex integer type as a structure,
             pending some other way to do it.  */
-         putc ('s', asmfile);
+         putc ('s', asm_out_file);
          CHARS (1);
          print_wide_int (int_size_in_bytes (type));
-         fprintf (asmfile, "real:");
+         fprintf (asm_out_file, "real:");
          CHARS (5);
 
          dbxout_type (TREE_TYPE (type), 0);
-         fprintf (asmfile, ",0,%d;", TYPE_PRECISION (TREE_TYPE (type)));
+         fprintf (asm_out_file, ",0,%d;", TYPE_PRECISION (TREE_TYPE (type)));
          CHARS (7);
-         fprintf (asmfile, "imag:");
+         fprintf (asm_out_file, "imag:");
          CHARS (5);
          dbxout_type (TREE_TYPE (type), 0);
-         fprintf (asmfile, ",%d,%d;;", TYPE_PRECISION (TREE_TYPE (type)),
+         fprintf (asm_out_file, ",%d,%d;;", TYPE_PRECISION (TREE_TYPE (type)),
                   TYPE_PRECISION (TREE_TYPE (type)));
          CHARS (10);
        }
       if (use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         fputs ("@s", asmfile);
+         fputs ("@s", asm_out_file);
          CHARS (2);
          print_wide_int (BITS_PER_UNIT * int_size_in_bytes (type));
-         putc (';', asmfile);
+         putc (';', asm_out_file);
          CHARS (1);
 
          /* Check if a bitstring type, which in Chill is
             different from a [power]set.  */
          if (TYPE_STRING_FLAG (type))
            {
-             fprintf (asmfile, "@S;");
+             fprintf (asm_out_file, "@S;");
              CHARS (3);
            }
        }
-      putc ('S', asmfile);
+      putc ('S', asm_out_file);
       CHARS (1);
       dbxout_type (TYPE_DOMAIN (type), 0);
       break;
       if (TYPE_PACKED (type) && use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         fputs ("@s", asmfile);
+         fputs ("@s", asm_out_file);
          CHARS (2);
          print_wide_int (BITS_PER_UNIT * int_size_in_bytes (type));
-         fprintf (asmfile, ";@S;S");
+         fprintf (asm_out_file, ";@S;S");
          CHARS (5);
          dbxout_type (TYPE_DOMAIN (type), 0);
          break;
       if (TYPE_STRING_FLAG (type) && use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         fprintf (asmfile, "@S;");
+         fprintf (asm_out_file, "@S;");
          CHARS (3);
        }
       tem = TYPE_DOMAIN (type);
       if (tem == NULL)
        {
-         fprintf (asmfile, "ar");
+         fprintf (asm_out_file, "ar");
          CHARS (2);
          dbxout_type_index (integer_type_node);
-         fprintf (asmfile, ";0;-1;");
+         fprintf (asm_out_file, ";0;-1;");
          CHARS (6);
        }
       else
        {
-         fprintf (asmfile, "a");
+         fprintf (asm_out_file, "a");
          CHARS (1);
          dbxout_range_type (tem);
        }
               If the type has a name, don't nest its definition within
               another type's definition; instead, output an xref
               and let the definition come when the name is defined.  */
-           fputs ((TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu", asmfile);
+           fputs ((TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu", asm_out_file);
            CHARS (2);
-#if 0 /* This assertion is legitimately false in C++.  */
-           /* We shouldn't be outputting a reference to a type before its
-              definition unless the type has a tag name.
-              A typedef name without a tag name should be impossible.  */
-           gcc_assert (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE);
-#endif
            if (TYPE_NAME (type) != 0)
              dbxout_type_name (type);
            else
              {
-               fprintf (asmfile, "$$%d", anonymous_type_number++);
+               fprintf (asm_out_file, "$$%d", anonymous_type_number++);
                CHARS (5);
              }
 
-           fprintf (asmfile, ":");
+           fprintf (asm_out_file, ":");
            CHARS (1);
            typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
            break;
          }
 
        /* Identify record or union, and print its size.  */
-       putc (((TREE_CODE (type) == RECORD_TYPE) ? 's' : 'u'), asmfile);
+       putc (((TREE_CODE (type) == RECORD_TYPE) ? 's' : 'u'), asm_out_file);
        CHARS (1);
        print_wide_int (int_size_in_bytes (type));
 
                if (BINFO_N_BASE_BINFOS (binfo))
                  {
                    have_used_extensions = 1;
-                   fprintf (asmfile, "!%u,", BINFO_N_BASE_BINFOS (binfo));
+                   fprintf (asm_out_file, "!%u,", BINFO_N_BASE_BINFOS (binfo));
                    CHARS (8);
                  }
              }
                if (use_gnu_debug_info_extensions)
                  {
                    have_used_extensions = 1;
-                   putc (BINFO_VIRTUAL_P (child) ? '1' : '0', asmfile);
+                   putc (BINFO_VIRTUAL_P (child) ? '1' : '0', asm_out_file);
                    putc (access == access_public_node ? '2' :
                          (access == access_protected_node ? '1' :'0'),
-                         asmfile);
+                         asm_out_file);
                    CHARS (2);
                    if (BINFO_VIRTUAL_P (child)
                        && strcmp (lang_hooks.name, "GNU C++") == 0)
                    else
                      print_wide_int (tree_low_cst (BINFO_OFFSET (child), 0)
                                      * BITS_PER_UNIT);
-                   putc (',', asmfile);
+                   putc (',', asm_out_file);
                    CHARS (1);
                    dbxout_type (BINFO_TYPE (child), 0);
-                   putc (';', asmfile);
+                   putc (';', asm_out_file);
                    CHARS (1);
                  }
                else
                       fields which have the same names at the types
                       they hold.  */
                    dbxout_type_name (BINFO_TYPE (child));
-                   putc (':', asmfile);
+                   putc (':', asm_out_file);
                    CHARS (1);
                    dbxout_type (BINFO_TYPE (child), full);
-                   putc (',', asmfile);
+                   putc (',', asm_out_file);
                    CHARS (1);
                    print_wide_int (tree_low_cst (BINFO_OFFSET (child), 0)
                                    * BITS_PER_UNIT);
-                   putc (',', asmfile);
+                   putc (',', asm_out_file);
                    CHARS (1);
                    print_wide_int
                      (tree_low_cst (TYPE_SIZE (BINFO_TYPE (child)), 0)
                       * BITS_PER_UNIT);
-                   putc (';', asmfile);
+                   putc (';', asm_out_file);
                    CHARS (1);
                  }
              }
          dbxout_type_methods (type);
        }
 
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
 
       if (use_gnu_debug_info_extensions && TREE_CODE (type) == RECORD_TYPE
          have_used_extensions = 1;
 
          /* Tell GDB+ that it may keep reading.  */
-         putc ('~', asmfile);
+         putc ('~', asm_out_file);
          CHARS (1);
 
          /* We need to write out info about what field this class
             figure out which field it's using in time.  */
          if (TYPE_VFIELD (type))
            {
-             putc ('%', asmfile);
+             putc ('%', asm_out_file);
              CHARS (1);
              dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type)), 0);
            }
 
-         putc (';', asmfile);
+         putc (';', asm_out_file);
          CHARS (1);
        }
       break;
           && !full)
          || !COMPLETE_TYPE_P (type))
        {
-         fprintf (asmfile, "xe");
+         fprintf (asm_out_file, "xe");
          CHARS (2);
          dbxout_type_name (type);
          typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
-         putc (':', asmfile);
+         putc (':', asm_out_file);
          CHARS (1);
          return;
        }
       if (use_gnu_debug_info_extensions
          && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
        {
-         fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
+         fprintf (asm_out_file, "@s%d;", TYPE_PRECISION (type));
          CHARS (5);
        }
 
-      putc ('e', asmfile);
+      putc ('e', asm_out_file);
       CHARS (1);
       for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))
        {
-         fprintf (asmfile, "%s:", IDENTIFIER_POINTER (TREE_PURPOSE (tem)));
+         fprintf (asm_out_file, "%s:", IDENTIFIER_POINTER (TREE_PURPOSE (tem)));
          CHARS (IDENTIFIER_LENGTH (TREE_PURPOSE (tem)) + 1);
          if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == 0)
            print_wide_int (TREE_INT_CST_LOW (TREE_VALUE (tem)));
          else
            print_int_cst_octal (TREE_VALUE (tem));
 
-         putc (',', asmfile);
+         putc (',', asm_out_file);
          CHARS (1);
          if (TREE_CHAIN (tem) != 0)
            CONTIN;
        }
 
-      putc (';', asmfile);
+      putc (';', asm_out_file);
       CHARS (1);
       break;
 
     case POINTER_TYPE:
-      putc ('*', asmfile);
+      putc ('*', asm_out_file);
       CHARS (1);
       dbxout_type (TREE_TYPE (type), 0);
       break;
       if (use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         putc ('#', asmfile);
+         putc ('#', asm_out_file);
          CHARS (1);
 
          /* Write the argument types out longhand.  */
          dbxout_type (TYPE_METHOD_BASETYPE (type), 0);
-         putc (',', asmfile);
+         putc (',', asm_out_file);
          CHARS (1);
          dbxout_type (TREE_TYPE (type), 0);
          dbxout_args (TYPE_ARG_TYPES (type));
-         putc (';', asmfile);
+         putc (';', asm_out_file);
          CHARS (1);
        }
       else
       if (use_gnu_debug_info_extensions)
        {
          have_used_extensions = 1;
-         putc ('@', asmfile);
+         putc ('@', asm_out_file);
          CHARS (1);
          dbxout_type (TYPE_OFFSET_BASETYPE (type), 0);
-         putc (',', asmfile);
+         putc (',', asm_out_file);
          CHARS (1);
          dbxout_type (TREE_TYPE (type), 0);
        }
     case REFERENCE_TYPE:
       if (use_gnu_debug_info_extensions)
        have_used_extensions = 1;
-      putc (use_gnu_debug_info_extensions ? '&' : '*', asmfile);
+      putc (use_gnu_debug_info_extensions ? '&' : '*', asm_out_file);
       CHARS (1);
       dbxout_type (TREE_TYPE (type), 0);
       break;
 
     case FUNCTION_TYPE:
-      putc ('f', asmfile);
+      putc ('f', asm_out_file);
       CHARS (1);
       dbxout_type (TREE_TYPE (type), 0);
       break;
   else
     high = 0, low &= (((HOST_WIDE_INT) 1 << width) - 1);
 
-  fprintf (asmfile, "0");
+  fprintf (asm_out_file, "0");
   CHARS (1);
 
   if (excess == 3)
                  << (HOST_BITS_PER_WIDE_INT / 3 * 3))
                 - 1);
 
-      fprintf (asmfile, "%o%01o", (int) beg, (int) middle);
+      fprintf (asm_out_file, "%o%01o", (int) beg, (int) middle);
       CHARS (2);
       print_octal (end, HOST_BITS_PER_WIDE_INT / 3);
     }
   int i;
 
   for (i = digits - 1; i >= 0; i--)
-    fprintf (asmfile, "%01o", (int) ((value >> (3 * i)) & 7));
+    fprintf (asm_out_file, "%01o", (int) ((value >> (3 * i)) & 7));
 
   CHARS (digits);
 }
 {
   int digs = 0;
 
-  fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, c);
+  fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, c);
 
   if (c < 0)
     digs++, c = -c;
       gcc_unreachable ();
     }
 
-  fprintf (asmfile, "%s", IDENTIFIER_POINTER (t));
+  fprintf (asm_out_file, "%s", IDENTIFIER_POINTER (t));
   CHARS (IDENTIFIER_LENGTH (t));
 }
 
          dbxout_class_name_qualifiers (name);
          name = DECL_NAME (name);
        }
-      fprintf (asmfile, "%s::", IDENTIFIER_POINTER (name));
+      fprintf (asm_out_file, "%s::", IDENTIFIER_POINTER (name));
       CHARS (IDENTIFIER_LENGTH (name) + 2);
     }
 }
        break;
       FORCE_TEXT;
 
-      fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
+      fprintf (asm_out_file, "%s\"%s:%c", ASM_STABS_OP,
               IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
               TREE_PUBLIC (decl) ? 'F' : 'f');
       result = 1;
         mention the containing function name
         as well as (since dbx wants it) our own assembler-name.  */
       if (context != 0)
-       fprintf (asmfile, ",%s,%s",
+       fprintf (asm_out_file, ",%s,%s",
                 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
                 IDENTIFIER_POINTER (DECL_NAME (context)));
 
                current_sym_addr = 0;
                current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
 
-               fprintf (asmfile, "%s\"%s:T", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"%s:T", ASM_STABS_OP,
                         IDENTIFIER_POINTER (name));
                dbxout_type (type, 1);
                dbxout_finish_symbol (NULL_TREE);
              }
 
            /* Output .stabs (or whatever) and leading double quote.  */
-           fprintf (asmfile, "%s\"", ASM_STABS_OP);
+           fprintf (asm_out_file, "%s\"", ASM_STABS_OP);
 
            if (use_gnu_debug_info_extensions)
              {
              }
 
            /* Output typedef name.  */
-           fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (decl)));
+           fprintf (asm_out_file, "%s:", IDENTIFIER_POINTER (DECL_NAME (decl)));
 
            /* Short cut way to output a tag also.  */
            if ((TREE_CODE (type) == RECORD_TYPE
              {
                if (use_gnu_debug_info_extensions && have_used_extensions)
                  {
-                   putc ('T', asmfile);
+                   putc ('T', asm_out_file);
                    TREE_ASM_WRITTEN (TYPE_NAME (type)) = 1;
                  }
-#if 0 /* Now we generate the tag for this case up above.  */
-               else
-                 tag_needed = 1;
-#endif
              }
 
-           putc ('t', asmfile);
+           putc ('t', asm_out_file);
            current_sym_code = DBX_TYPE_DECL_STABS_CODE;
 
            dbxout_type (type, 1);
            current_sym_addr = 0;
            current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
 
-           fprintf (asmfile, "%s\"%s:T", ASM_STABS_OP,
+           fprintf (asm_out_file, "%s\"%s:T", ASM_STABS_OP,
                     IDENTIFIER_POINTER (name));
            dbxout_type (type, 1);
            dbxout_finish_symbol (NULL_TREE);
 
            /* Some debuggers fail when given NULL names, so give this a
               harmless name of ` '.  */
-           fprintf (asmfile, "%s\" :T", ASM_STABS_OP);
+           fprintf (asm_out_file, "%s\" :T", ASM_STABS_OP);
            dbxout_type (type, 1);
            dbxout_finish_symbol (NULL_TREE);
          }
                  || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
                {
                  HOST_WIDE_INT ival = tree_low_cst (DECL_INITIAL (decl), 0);
-                 fprintf (asmfile, "%s\"%s:c=i" HOST_WIDE_INT_PRINT_DEC
+                 fprintf (asm_out_file, "%s\"%s:c=i" HOST_WIDE_INT_PRINT_DEC
                           "\",0x%x,0,0,0\n",
                           ASM_STABS_OP, name, ival, N_LSYM);
                  DBXOUT_DECR_NESTING;
   FORCE_TEXT;
 
 #ifdef DBX_STATIC_BLOCK_START
-  DBX_STATIC_BLOCK_START (asmfile, current_sym_code);
+  DBX_STATIC_BLOCK_START (asm_out_file, current_sym_code);
 #endif
 
   dbxout_symbol_name (decl, suffix, letter);
   dbxout_finish_symbol (decl);
 
 #ifdef DBX_STATIC_BLOCK_END
-  DBX_STATIC_BLOCK_END (asmfile, current_sym_code);
+  DBX_STATIC_BLOCK_END (asm_out_file, current_sym_code);
 #endif
   return 1;
 }
 
   if (name == 0)
     name = "(anon)";
-  fprintf (asmfile, "%s\"%s%s:", ASM_STABS_OP, name,
+  fprintf (asm_out_file, "%s\"%s%s:", ASM_STABS_OP, name,
           (suffix ? suffix : ""));
 
   if (letter)
-    putc (letter, asmfile);
+    putc (letter, asm_out_file);
 }
 
 static void
 dbxout_prepare_symbol (tree decl ATTRIBUTE_UNUSED)
 {
-#ifdef WINNING_GDB
-  const char *filename = DECL_SOURCE_FILE (decl);
-
-  dbxout_source_file (asmfile, filename);
-#endif
-
   /* Initialize variables used to communicate each symbol's debug
      information to dbxout_finish_symbol with zeroes.  */
 
   if (use_gnu_debug_info_extensions && sym != 0)
     line = DECL_SOURCE_LINE (sym);
 
-  fprintf (asmfile, "\",%d,0,%d,", current_sym_code, line);
+  fprintf (asm_out_file, "\",%d,0,%d,", current_sym_code, line);
   if (current_sym_addr)
-    output_addr_const (asmfile, current_sym_addr);
+    output_addr_const (asm_out_file, current_sym_addr);
   else
-    fprintf (asmfile, "%d", current_sym_value);
-  putc ('\n', asmfile);
+    fprintf (asm_out_file, "%d", current_sym_value);
+  putc ('\n', asm_out_file);
 #endif
 }
 
              {
                current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
 
-               fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"%s:%c", ASM_STABS_OP,
                         IDENTIFIER_POINTER (DECL_NAME (parms)),
                         DBX_MEMPARM_STABS_LETTER);
              }
            else
              {
                current_sym_nchars = 8;
-               fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"(anon):%c", ASM_STABS_OP,
                         DBX_MEMPARM_STABS_LETTER);
              }
 
            if (DECL_NAME (parms))
              {
                current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
-               fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"%s:%c", ASM_STABS_OP,
                         IDENTIFIER_POINTER (DECL_NAME (parms)),
                         regparm_letter);
              }
            else
              {
                current_sym_nchars = 8;
-               fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"(anon):%c", ASM_STABS_OP,
                         regparm_letter);
              }
 
                current_sym_nchars
                  = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
 
-               fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"%s:%c", ASM_STABS_OP,
                         IDENTIFIER_POINTER (DECL_NAME (parms)),
                         regparm_letter);
              }
            else
              {
                current_sym_nchars = 8;
-               fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"(anon):%c", ASM_STABS_OP,
                         regparm_letter);
              }
 
            current_sym_code = N_PSYM;
 
            FORCE_TEXT;
-           fprintf (asmfile, "%s\"%s:v", ASM_STABS_OP, decl_name);
+           fprintf (asm_out_file, "%s\"%s:v", ASM_STABS_OP, decl_name);
 
            current_sym_value
              = DEBUGGER_ARG_OFFSET (current_sym_value,
                current_sym_nchars
                  = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
 
-               fprintf (asmfile, "%s\"%s:%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"%s:%c", ASM_STABS_OP,
                         IDENTIFIER_POINTER (DECL_NAME (parms)),
                         DBX_MEMPARM_STABS_LETTER);
              }
            else
              {
                current_sym_nchars = 8;
-               fprintf (asmfile, "%s\"(anon):%c", ASM_STABS_OP,
+               fprintf (asm_out_file, "%s\"(anon):%c", ASM_STABS_OP,
                DBX_MEMPARM_STABS_LETTER);
              }
 
 {
   while (args)
     {
-      putc (',', asmfile);
+      putc (',', asm_out_file);
       dbxout_type (TREE_VALUE (args), 0);
       CHARS (1);
       args = TREE_CHAIN (args);
                  const char *begin_label ATTRIBUTE_UNUSED)
 {
 #ifdef DBX_OUTPUT_LBRAC
-  DBX_OUTPUT_LBRAC (asmfile, label);
+  DBX_OUTPUT_LBRAC (asm_out_file, label);
 #else
-  fprintf (asmfile, "%s%d,0,0,", ASM_STABN_OP, N_LBRAC);
-  assemble_name (asmfile, label);
-#if DBX_BLOCKS_FUNCTION_RELATIVE
-  putc ('-', asmfile);
-  assemble_name (asmfile, begin_label);
-#endif
-  fprintf (asmfile, "\n");
+  fprintf (asm_out_file, "%s%d,0,0,", ASM_STABN_OP, N_LBRAC);
+  assemble_name (asm_out_file, label);
+  if (DBX_BLOCKS_FUNCTION_RELATIVE)
+    {
+      putc ('-', asm_out_file);
+      assemble_name (asm_out_file, begin_label);
+    }
+  fprintf (asm_out_file, "\n");
 #endif
 }
 
                  const char *begin_label ATTRIBUTE_UNUSED)
 {
 #ifdef DBX_OUTPUT_RBRAC
-  DBX_OUTPUT_RBRAC (asmfile, label);
+  DBX_OUTPUT_RBRAC (asm_out_file, label);
 #else
-  fprintf (asmfile, "%s%d,0,0,", ASM_STABN_OP, N_RBRAC);
-  assemble_name (asmfile, label);
-#if DBX_BLOCKS_FUNCTION_RELATIVE
-  putc ('-', asmfile);
-  assemble_name (asmfile, begin_label);
-#endif
-  fprintf (asmfile, "\n");
+  fprintf (asm_out_file, "%s%d,0,0,", ASM_STABN_OP, N_RBRAC);
+  assemble_name (asm_out_file, label);
+  if (DBX_BLOCKS_FUNCTION_RELATIVE)
+    {
+      putc ('-', asm_out_file);
+      assemble_name (asm_out_file, begin_label);
+    }
+  fprintf (asm_out_file, "\n");
 #endif
 }
 
 dbxout_block (tree block, int depth, tree args)
 {
   const char *begin_label;
-  if (current_function_func_begin_label != NULL)
-    begin_label = current_function_func_begin_label;
-  else
-    begin_label = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
+  begin_label = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
 
   while (block)
     {
                  tree decl = BLOCK_VARS (block);
                  while (decl)
                    {
-                     fprintf (asmfile, "%s\"%s:C1\",%d,0,0,", ASM_STABS_OP,
+                     fprintf (asm_out_file, "%s\"%s:C1\",%d,0,0,", ASM_STABS_OP,
                               IDENTIFIER_POINTER (DECL_NAME (decl)), N_CATCH);
-                     assemble_name (asmfile, scope_start);
-                     fprintf (asmfile, "\n");
+                     assemble_name (asm_out_file, scope_start);
+                     fprintf (asm_out_file, "\n");
                      decl = TREE_CHAIN (decl);
                    }
                }