1. hex_init
  2. bfd_init
  3. bfd_set_error_program_name
  4. select_emulation_mode
  5. parse_args
    1. md_parse_option
    2. md_show_usage
    3. md_debug_format_selector
    4. md_after_parse_args
  6. symbol_begin
    1. symbol_lastP = NULL
    2. symbol_rootP = NULL
    3. sy_hash = hash_new()
    4. local_hash = hash_new()
    5. fb_label_init
  7. frag_init
    1. zero_address_frag.fr_type = rs_fill
    2. predefined_address_frag.fr_type = rs_fill
  8. subsegs_begin
    1. obstack_begin(&frchains, chunksize)
    2. frchain_now = NULL
    3. frag_now = &dummy_frag
  9. read_begin
    1. pobegin
      1. po_hash = hash_new ()
      2. pop_table_name = "md"
      3. md_pop_insert ()
        1. pop_insert (md_pseudo_table)
      4. pop_table_name = "obj"
      5. pop_override_ok = 1
      6. obj_pop_insert ()
      7. pop_table_name = "standard"
      8. pop_insert (potable)
      9. pop_table_name = "cfi"
      10. pop_override_ok = 1
      11. cfi_pop_insert ()
    2. obj_read_begin_hook
      1. elf_obj_read_begin_hook
    3. obstack_begin(&notes, chunksize)
    4. obstack_begin(&cond_obstack, chunksize)
  10. input_scrub_begin
    1. input_file_begin
    2. buffer_length = input_file_buffer_size
    3. buffer_start = xmalloc ()
    4. logical_input_line = -1
    5. logical_input_file = NULL
    6. physical_input_file = NULL
    7. next_saved_file = NULL
    8. do_scrub_begin (flag_m68k_mri)
  11. expr_begin
    1. expr_set_precedence
  12. xatexit (close_output_file)
    1. output_file_close
    2. if (!keep_it) unlink_if_ordinary
  13. macro_init
  14. output_file_create
    1. stdoutput = bfd_openw (name, TARGET_FORMAT)
    2. bfd_set_format (stdoutput, bfd_object)
    3. bfd_set_arch_mach (stdoutput, TARGET_ARCH, TARGET_MACH)
    4. stdoutput->flags |= BFD_TRADITIONAL_FORMAT
  15. dot_symbol_init
    1. dot_symbol.bsym = bfd_make_empty_symbol (stdoutput)
    2. dot_symbol.bsym->name = "."
    3. dot_symbol.sy_forward_ref = 1
    4. dot_symbol.sy_value.X_op = O_constant
  16. tc_init_after_args
  17. itbl_init
  18. dwarf2_init
    1. all_segs_hash = hash_new ()
    2. last_seg_ptr = &all_segs
  19. local_symbol_make (".gasversion.", absolute_section, BFD_VERSION / 10000, &predefined_address_frag)
  20. while (defsyms != NULL)
    1. sym = symbol_new (defsyms->name, absolute_section)
    2. S_SET_VOLATILE (sym)
    3. symbol_table_insert (sym)
  21. perform_an_assembly_pass
    1. text_section = subseg_new (TEXT_SECTION_NAME, 0)
    2. data_section = subseg_new (DATA_SECTION_NAME, 0)
    3. bss_section = subseg_new (BSS_SECTION_NAME, 0)
    4. applicable = bfd_applicable_section_flags
    5. bfd_set_section_flags (text_section)
    6. bfd_set_section_flags (data_section)
    7. bfd_set_section_flags (bss_section)
    8. seg_info (bss_section)->bss = 1
    9. subseg_new (BFD_ABS_SECTION_NAME)
    10. subseg_new (BFD_UND_SECTION_NAME)
    11. reg_section = subseg_new ("*GAS `reg' section*")
    12. expr_section = subseg_new ("*GAS `expr' section*")
    13. subseg_set (text_section, 0)
    14. md_begin
    15. gas_cgen_begin
    16. obj_begin
    17. read_a_source_file
      1. input_scrub_new_file
        1. input_file_open
        2. physical_input_file = filename
        3. physical_input_line = 0
        4. partial_size = 0
      2. listing_file
      3. listing_newline
      4. register_dependency
      5. generate_file_debug
        1. stabs_generate_asm_file
      6. while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
        1. while (input_line_pointer < buffer_limit)
          1. was_new_line = is_end_of_line
          2. if (was_new_line)
          3. symbol_set_value_now (&dot_symbol)
          4. md_start_line_hook
          5. if (listing)
          6. find_end_of_line
          7. listing_newline
          8. if (was_new_line)
          9. line_label = NULL
          10. if (LABEL_WITHOUT_COLONS || flag_m68k_mri)
          11. if (is_name_beginner)
          12. c = get_symbol_end
          13. if (!mri_line_macro && TC_START_LABEL_WITHOUT_COLON)
          14. line_label = colon (line_start)
          15. else
          16. line_label = symbol_create (line_start, absolute_section, 0, &zero_adress_frag)
          17. skip spaces
          18. if (is_name_beginner)
          19. HANDLE_CONDITIONAL_ASSEMBLY
          20. s = --input_line_pointer
          21. c = get_symbol_end ()
          22. if (TC_START_LABEL (c, s, input_line_pointer))
          23. line_label = colon (s) /* User-defined label. */
          24. if (LOCAL_LABELS_DOLLAR && !bfd_is_local_label_name (stdoutput, sym_name))
          25. dollar_label_clear
          26. if (new_broken_words)
          27. obj_frob_colon (sym_name)
          28. if (symbolP = symbol_find (sym_name)) != 0)
          29. S_CLEAR_WEAKREFR
          30. if (LOCAL_SYMBOL_CHECK (symbolP))
          31. else if (!(S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) || S_IS_COMMON (symbolP) || S_IS_VOLATILE (symbolP))
          32. if (S_IS_VOLATILE (symbolP))
          33. symbolP = symbol_clone (symbolP, 1)
          34. S_SET_VALUE (symbolP, 0)
          35. S_CLEAR_VOLATILE (symbolP)
          36. if (S_GET_VALUE (symbolP) == 0)
          37. define_sym_at_dot (symbolP)
          38. else
          39. else
          40. else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
          41. symbolP = local_symbol_make (sym_name, now_seg, frag_now_fix (), frag_now)
          42. else
          43. symbolP = symbol_new (sym_name, now_seg, frag_now_fix (), frag_now)
          44. symbol_table_insert (symbolP)
          45. tc_frob_label (symbolP)
          46. obj_frob_label (symbolP)
          47. *input_line_pointer++ = ':'
          48. tc_check_label (line_label)
          49. SKIP_WHITESPACE
          50. else if ((c == '=' && input_line_pointer[1] == '=') || ((c == ' ' || c == '\t') && input_line_pointer[1] == '=' && input_line_pointer[2] == '='))
          51. equals (s, -1)
          52. assign_symbol
          53. demand_empty_reset_of_line ()
          54. else if ((c == '=' || ((c == ' ' || c == '\t') && input_line_pointer[1] == '=')) && !TC_EQUAL_IN_INSN (c, s))
          55. equals (s, 1)
          56. demand_empty_rest_of_line
          57. else /* Expect pseudo-op or machine instruction. */
          58. pop = NULL
          59. if (NO_PSEUDO_DOT || flag_m68k_mri)
          60. pop = hash_find (po_hash, s)
          61. if (pop != NULL || (!flag_m68k_mri && *s == '.'))
          62. pop = hash_find (po_hash, s + 1)
          63. (*pop->poc_handler (pop->poc_val)
          64. else
          65. _find_end_of_line (input_line_pointer, flag_m68k_mri, 1, 0)
          66. generate_lineno_debug
          67. if (macro_defined && try_macro (c, s))
          68. continue
          69. if (mri_pending_align)
          70. do_align ()
          71. mri_pending_align
          72. if (line_label != NULL)
          73. symbol_set_frag (line_label, frag_now)
          74. S_SET_VALUE (line_label, frag_now_fix ())
          75. assemble_one
          76. md_assemble
          77. *input_line_pointer++ = c
          78. continue
          79. if (is_end_of_line)
          80. continue
          81. if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (c))
          82. HANDLE_CONDITIONAL_ASSEMBLY
          83. while (ISDIGIT())
          84. if (c && strchr (line_comment_chars, c))
          85. HANDLE_CONDITIONAL_ASSEMBLY ()
          86. if (tc_unrecognized_line (c))
          87. continue
          88. input_line_pointer--
          89. demand_empty_reset_of_line ()
      7. symbol_set_value_now (&dot_symbol)
      8. md_cleanup
      9. input_scrub_close
  22. cond_finish_check
  23. md_end
  24. create_obj_attrs_section
    1. bfd_elf_obj_attr_size
    2. get_elf_backend_data
    3. subseg_new (".gnu.attributes", 0)
    4. get_elf_backend_data
    5. bfd_set_section_flags (SEC_READONLY | SEC_DATA)
    6. frag_now_fix
    7. frag_more
    8. bfd_elf_set_obj_attr_contents
  25. if ((flag_execstack || flag_noexecstack) && OUTPUT_FLAVOR == bfd_target_elf_flavour)
    1. gnustack = sebseg_new (".note.GNU-stack")
  26. dwarf2_finish
  27. cfi_finish
  28. subsegs_finish
    1. for all sections
      1. for all frchainP
        1. subseg_set (s, frchainP->frch_subseg)
        2. alignment = SUB_SSEGMENT_ALIGN (now_seg, frchainP)
        3. if (subseg_text_p (now_seg))
          1. frag_align_code (alignment, 0)
        4. else
          1. frag_align (alignment, 0, 0)
        5. frag_wane (frag_now)
        6. frag_now->fr_fix = 0
  29. write_object_file
    1. md_pre_output_hook
    2. md_pre_relax_hook
    3. bfd_section_list_remove (reg_section)
    4. bfd_section_list_remove (expr_section)
    5. renumber_sections
    6. chain_frchains_together
      1. info = seg_info (section)
      2. if (info != (segment_info_type *) NULL)
        1. info->frchainP->frch_last = chain_frchains_together_1 (section, info->frchainP)
      3. frags_chained = 1
    7. if (flag_readonly_data_in_text)
      1. merge_data_into_text
    8. rsi.pass = 0
    9. while (1)
      1. rsi.changed = 0
      2. relax_seg
        1. relax_segment
          1. subseg_change (segment, 0)
          2. address = 0
          3. for all fragment
          4. fragP->relax_marker = 0
          5. fragP->fr_address = address
          6. address += fragP->fr_fix
          7. switch (fragP->fr_type)
          8. rs_machine_dependent
          9. if (fragP->fr_symbol)
          10. resolve_symbol_value (fragP->fr_symbol)
          11. address += md_estimate_size_before_relax (fragP, segment)
          12. do while (stretched && -- max_iterations)
          13. stretch = 0
          14. stretched = 0
          15. for all fragment
          16. fragP->relax_marker ^= 1
          17. was_address = fragP->fr_address
          18. address = fragP->fr_address += stretch
          19. symbolP = fragP->fr_symbol
          20. offset = fragP->fr_offset
          21. switch (fragP->fr_type)
          22. rs_machine_dependent
          23. growth = md_relax_frag (segment, fragP, stretch)
          24. if (growth)
          25. stretch += growth
          26. stretched = 1
          27. for all fragment
          28. if (fragP->last_fr_address != fragP->fr_address)
          29. fragP->last_fr_address = fragP->fr_address
          30. ret = 1
        2. if return value of relax_segment > 0, info->changed = 1
      3. rsi.pass++
      4. if (!rsi.changed)
        1. break
    10. finalize_syms = TC_FINALIZE_SYMS_BEFORE_SIZE_SEG
    11. size_seg
      1. subseg_change (sec, 0)
      2. seginfo = seg_info (sec)
      3. if (seginfo && seginfo->frchainP)
        1. for all fragments
          1. cvt_frag_to_fill
          2. switch (fragP->fr_type)
          3. rs_machine_dependent
          4. md_convert_frag
          5. frag_wane
          6. md_frag_check
        2. get last fragP
        3. size = fragP->fr_address + fragP->fr_fix
      4. else
        1. size = 0
      5. newsize = md_section_align (sec, size)
      6. x = bfd_set_section_size (abfd, sec, newsize)
      7. tc_frob_section
      8. obj_frob_section
    12. finalize_syms = 1 /* Relaxation has completed. Freeze all syms. */
    13. md_post_relax_hook
    14. processing broken_words
    15. if (symbol_rootP)
      1. for all symbols
        1. resolve_symbol_value
    16. resolve_local_symbol_values
    17. resolve_reloc_expr_symbols
    18. tc_frob_file_before_adjust
    19. obj_frob_file_before_adjust
    20. adjust_reloc_syms
      1. dump_section_relocs (abfd, sec, stderr)
      2. for all fixup
        1. if (fixp->fx_done)
          1. ignore it
        2. else if (fixp->fx_addsy)
          1. sym = fixp->fx_addsy
          2. resolve_symbol_value (sym)
          3. if (fixp->fx_subsy != NULL)
          4. resolve_symbol_value (fixp->fx_subsy)
          5. while (symbol_equated_reloc_p (sym) || S_IS_WEAKREFR (sym))
          6. newsym = symbol_get_value_expression (sym)->X_add_symbol
          7. if (LOCAL_SYMBOL_CHECK (s))
          8. s = local_symbol_convert ((struct local_symbol *) s)
          9. return &s->sy_value
          10. if (sym == newsym)
          11. break
          12. fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
          13. fixp->fx_addsy = newsym;
          14. sym = newsym;
          15. if (symbol_mri_common_p (sym))
          16. fixp->fx_offset += S_GET_VALUE (sym)
          17. fixp->fx_addsy = symbol_get_value_expression (sym)->X_add_symbol
          18. continue
          19. if (S_FORCE_RELOC (fixp->fx_addsy, 1))
          20. continue
          21. if (! tc_fix_adjustable (fixp))
          22. continue
          23. if (symbol_section_p (sym))
          24. continue
          25. symsec = S_GET_SEGMENT (sym)
          26. if (symsec == NULL)
          27. abort
          28. if (bfd_is_abs_section (symsec))
          29. continue
          30. if (symsec != sec && S_IS_LOCAL (sym))
          31. if ((symmsec->flags & SEC_LINK_ONCE) != 0 || (IS_ELF && strncmp (segment_name (symsec), ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0))
          32. continue
          33. if ((symsec->flags * SEC_MERGE) != 0 && (fixp->fx_offset != 0 || fixp->fx_subsy != NULL))
          34. continue
          35. if ((symsec->flags & SEC_THREAD_LOCAL) != 0)
          36. continue
          37. fixp->fx_offset += S_GET_VALUE (sym)
          38. fixp->fx_addsy = section_symbol (S_GET_SEGMENT (sym))
      3. dump_section_relocs (abfd, sec, stderr)
    21. tc_frob_file_before_fix
    22. obj_frob_file_before_fix
    23. fix_segment
      1. seginfo = seg_info (sec)
      2. fixup_segment (seginfo->fix_root, sec)
        1. add_symbol_segment = absolute_section
        2. if (fixP != NULL && abs_section_sym == NULL)
          1. abs_section_sym = section_symbol (absolute_section)
        3. if (linkrelax && TC_LINKRELAX_FIXUP (this_segment))
          1. for all fixup
          2. if (!fixP->fx_done)
          3. if (fixP->fx_addsy == NULL)
          4. fixP->fx_addsy = abs_section_sym
          5. symbol_mark_used_in_reloc (fixP->fx_addsy)
          6. if (fixP->fx_subsy != NULL)
          7. symbol_mark_used_in_reloc (fixP->fx_subsy)
          8. return
        4. for all fixup
          1. fragP = fixP->fx_frag
          2. TC_VALIDATE_FIX (fixP, this_segment, skip)
          3. add_number = fixP->fx_offset
          4. if (fixP->fx_addsy != NULL)
          5. add_symbol_segment = S_GET_SEGMENT (fixP->fx_addsy)
          6. if (fixP->fx_subsy != NULL)
          7. resolve_symbol_value (fixP->fx_subsy)
          8. sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy)
          9. if (fixP->fx_addsy != NULL && sub_symbol_segment == add_symbol_segment && !S_FORCE_RELOC (fixP->fx_addsy, 0) && !S_FORCE_RELOC (fixP->fx_subsy, 0) && !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
          10. add_number += S_GET_VALUE (fixP->fx_addsy)
          11. add_number -= S_GET_VALUE (fixP->fx_subsy)
          12. fixP->fx_offset = add_number
          13. fixP->fx_addsy = NULL
          14. fixP->fx_subsy = NULL
          15. fixP->fx_pcrel = 0
          16. else if (sub_symbol_segment == absolute_section && !S_FORCE_RELOC (fixP->fx_subsy, 0) && !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment))
          17. add_number -= S_GET_VALUE (fixP->fx_subsy)
          18. fixP->fx_offset = add_number
          19. fixP->fx_subsy = NULL
          20. else if (sub_symbol_segment == this_segment && !S_FORCE_RELOC (fixP->fx_subsy, 0) && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP, add_symbol_segment))
          21. add_number -= S_GET_VALUE (fixP->fx_subsy)
          22. fixP->fx_offset = (add_number + fixP->fx_dot_value + fixP->fx_dot_frag->fr_address)
          23. if (0 || !fixP->fx_pcrel)
          24. add_number += MD_PCREL_FROM_SECTION (fixP, this_segment)
          25. fixP->fx_subsy = NULL
          26. fixP->fx_pcrel = 1
          27. else if (!TC_VALIDATE_FIX_SUB (fixP, add_symbol_segment))
          28. if (!md_register_arithmetic && (add_symbol_segment == reg_section || sub_symbol_segment == reg_section))
          29. as_bad_where
          30. else
          31. as_bad_where
          32. if (fixP->fx_addsy)
          33. if (add_symbol_segment == this_segment && !TC_FORCE_RELOCATION_LOCAL)
          34. add_number += S_GET_VALUE (fixP->fx_addsy)
          35. fixP->fx_offset = add_number
          36. if (fixP->fx_pcrel)
          37. add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment)
          38. fixP->fx_addsy = NULL
          39. fixP->fx_pcrel = 0
          40. else if (add_symbol_segment == absolute_section && !TC_FORCE_RELOCATION_ABS (fixP))
          41. add_number += S_GET_VALUE (fixP->fx_addsy)
          42. fixP->fx_offset = add_number
          43. fixP->fx_addsy = NULL
          44. else if (add_symbol_segment != undefined_section && ! bfd_is_com_section (add_symbol_segment) && MD_APPLY_SYM_VALUE (fixP))
          45. add_number += S_GET_VALUE (fixP->fx_addsy)
          46. if (fixP->fx_pcrel)
          47. add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment)
          48. if (!fixP->fx_done && fixP->fx_addsy == NULL)
          49. fixP->fx_addsy = abs_section_sym
          50. if (!fixP->fx_done)
          51. md_apply_fix (fixP, &add_number, this_segment)
          52. if (!fixP->fx_done)
          53. if (fixP->fx_addsy == NULL)
          54. fixP->fx_addsy = abs_section_sym
          55. symbol_mark_used_in_reloc (fixP->fx_addsy)
          56. if (fixP->fx_subsy != NULL)
          57. symbol_mark_used_in_reloc (fixP->fx_subsy)
          58. if (!fixP->fx_bit_fixP && !fixP->fx_no_overflow && fixP->fx_size != 0)
          59. TODO
          60. print_fixup (fixP)
          61. TC_ADJUST_RELOC_COUNT (fixP, seg_reloc_count
    24. if (symbol_rootP)
      1. for all symbols
        1. punt = 0
        2. if (skip_next_symbol)
          1. symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp)
          2. skip_next_symbol = FALSE
          3. continue
        3. if (symbol_mri_common_p (symp))
          1. if (S_IS_EXTERNAL (symp))
          2. as_bad
          3. symbol_remove (symp, &symbol_rootP, &symbol_lastP)
          4. continue
        4. name = S_GET_NAME (symp)
        5. if (name)
          1. name2 = decode_local_label_name (S_GET_NAME (symp))
          2. if (name2 != name && S_IS_DEFINED (symp))
          3. as_bad
        6. resolve_symbol_value (symp)
        7. if (symbol_equated_reloc_p (symp) || S_IS_WEAKREFR (symp))
          1. sname = S_GET_NAME (symp)
          2. if (S_IS_COMMON (symp) && !TC_FAKE_LABEL (sname) && !S_IS_WEAKREFR (symp) && (!S_IS_EXTERNAL (symp) || S_IS_LOCAL (symp)))
          3. e = symbol_get_value_expression (symp)
          4. as_bad
          5. if (S_GET_SEGMENT (symp) != reg_section
          6. if (S_GET_NAME (symp) != reg_section->name)
          7. as_bad
          8. symbol_remove (symp, &symbol_rootP, &symbol_lastP)
          9. continue
        8. obj_frob_symbol (symp, punt)
        9. if (! punt || symbol_used_in_reloc_p (symp))
          1. tc_frob_symbol (symp, punt)
        10. if (symp == abs_section_sym || (! EMIT_SECTION_SYMBOLS && symbol_section_p (symp)) || (!S_IS_EXTERNAL (symp) && (punt || S_IS_LOCAL (symp) || (S_IS_WEAKREFD (symp) && !symbol_used_p (symp))) && ! symbol_used_in_reloc_p (symp)))
          1. symbol_remove (symp, &symbol_rootP, &symbol_lastP)
          2. continue
        11. if (! symbol_resolved_p (symp))
          1. as_bad
          2. symbol_mark_resolved (symp)
        12. symbol_get_bfdsym (symp)->value = S_GET_VALUE (symp)
        13. if (symbol_get_bfdsym (symp)->flags & BSF_WARNING)
          1. skip_next_symbol = TRUE
    25. tc_adjust_symtab
    26. obj_adjust_symtab
    27. set_symtab
      1. nsyms = 0
      2. for all symbols
        1. nsyms++
      3. if (nsyms)
        1. amt = nsyms * sizeof (asymbol *)
        2. asympp = bfd_alloc (stdoutput, amt)
        3. symp = symbol_rootP
        4. for all symbols
          1. asympp[i] = symbol_get_bfdsym (symp)
          2. if (asympp[i]->flags != BSF_SECTION_SYM || !(bfd_is_const_section (asympp[i]->section) && asympp[i]->section->symbol == asympp[i]))
          3. asym pp[i]->flags |= BSF_KEEP
          4. symbol_mark_written (symp)
          5. if (LOCAL_SYMBOL_CHECK (s))
          6. return
          7. s->sy_flags.sy_written = 0
      4. else
        1. asympp = 0
      5. result = bfd_set_symtab (stdoutput, asympp, nsyms)
      6. symbol_table_frozen = 1
    28. tc_frob_file
    29. obj_frob_file
    30. obj_coff_generate_pdata
    31. write_relocs
      1. seginfo = seg_info (sec)
      2. if (seginfo == NULL)
        1. return
      3. for all fixup in the section
        1. if (!fixp->fx_done)
          1. n++
      4. rp = &reloc_list
      5. my_reloc_list = NULL
      6. while ((r = *rp) != NULL)
        1. if (r->u.b.sec == sec)
          1. rp = r->next
          2. r->next = my_reloc_list
          3. my_reloc_list = r
          4. n++
        2. else
          1. rp = &r->next
      7. relocs = xcalloc (n, sizeof (arelent *))
      8. n = 0
      9. r = my_reloc_list
      10. last_frag = NULL
      11. for all fixup in the section
        1. if (fixp->fx_done)
          1. continue
        2. fx_size = fixp->fx_size
        3. slack = TC_FX_SIZE_SLACK (fixp)
        4. if (slack > 0)
          1. fx_size = fx_size > slack ? fx_size - slack : 0
        5. loc = fixp->fx_where + fx_size
        6. reloc = tc_gen_reloc (sec, fixp)
        7. while (*reloc)
          1. while (r != NULL && r->u.b.r.address < (*reloc)->address)
          2. f = get_frag_for_reloc (last_frag, seginfo, r)
          3. if (f != NULL)
          4. last_frag = f
          5. relocs[n++] = &r->u.b.r
          6. install_reloc (sec, &r->u.b.r, f, r->file, r->line)
          7. r = r->next
          8. relocs[n++] = *reloc
          9. install_reloc (sec, *reloc, fixp->fx_frag, fixp->fx_file, fixp->fx_line)
          10. reloc++
      12. while (r != NULL)
        1. f = get_frag_for_reloc (last_frag, seginfo, r)
        2. if (f != NULL)
          1. last_frag = f
          2. relocs[n++] = &r->u.b.r
          3. install_reloc (sec, &r->u.b.r, f, r->file, r->line)
        3. r = r->next
      13. if (n)
        1. flags = bfd_get_section_flags (abfd, sec)
        2. flags |= SEC_RELOC
        3. bfd_set_section_flags (abfd, sec, flags)
        4. bfd_set_reloc (stdoutput, sec, relocs, n)
      14. SET_SECTION_RELOCS (sec, relocs, n)
    32. tc_frob_file_after_relocs
    33. obj_frob_file_after_relocs
    34. compress_debug
      1. seginfo = seg_info (sec)
      2. uncompressed_size = sec->size
      3. flags = bfd_get_section_flags (abfd, sec)
      4. if (seginfo == NULL || sec->size < 32 || (flags & (SEC_ALLOC | SEC_HAS_CONTENTS)) == SEC_ALLOC)
        1. return
      5. section_name = bfd_get_section_name (stdoutput, sec)
      6. if (strncmp (section_name, ".debug_", 7) != 0)
        1. return
      7. strm = compress_init
      8. if (strm == NULL)
        1. return
      9. ...
      10. for all fragments
        1. compress_frag
      11. bfd_set_section_size (abfd, sec, compressed_size)
    35. write_contents
      1. seginfo = seg_info
      2. offset = 0
      3. if (seginfo == NULL || !(bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS)
        1. return
      4. for all fragments
        1. if (f->fr_fix)
          1. x = bfd_set_section_contents (stdoutput, sec, f->fr_literal, offset, f->fr_fix)
          2. if (!x)
          3. as_fatal
          4. offset += f->fr_fix
        2. fill_literal = f->fr_literal + f->fr_fix
        3. fill_size = f->fr_var
        4. count = f->fr_offset
        5. if (fill_size && count)
          1. if (fill_size > sizeof (buf))
          2. while (count--)
          3. bfd_set_section_contents (stdoutput, sec, fill_literal, offset, fill_size)
          4. offset += fill_size
          5. else
          6. if (fill_size == 1)
          7. n_per_buf = sizeof (buf)
          8. memset (buf, *fill_literal, n_per_buf)
          9. else
          10. n_per_buf = sizeof (buf) / fill_size
          11. for (i = n_per_buf, bufp = buf; i; i--, bufp += fill_size)
          12. memcpy (bufp, fill_literal, fill_size)
          13. for (; count > 0; count -= n_per_buf)
          14. n_per_buf = n_per_buf > count ? count : n_per_buf
          15. x = bfd_set_section_contents (stdoutput, sec, buf, offset, n_per_buf * fill_size)
          16. offset += n_per_buf * fill_size
  30. fflush (stderr)
  31. listing_print
  32. input_scrub_end
  33. print_dependencies