static void xcoffout_block (tree block, int depth, tree args) { while (block) { /* Ignore blocks never expanded or otherwise marked as real. */ if (TREE_USED (block)) { /* When we reach the specified block, output its symbols. */ if (BLOCK_NUMBER (block) == do_block) { /* Output the syms of the block. */ if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0) dbxout_syms (BLOCK_VARS (block)); if (args) dbxout_reg_parms (args); /* We are now done with the block. Don't go to inner blocks. */ return; } /* If we are past the specified block, stop the scan. */ else if (BLOCK_NUMBER (block) >= do_block) return; /* Output the subblocks. */ xcoffout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE); } block = BLOCK_CHAIN (block); } }
/* Return sope resulting from combination of S1 and S2. */ tree choose_inner_scope (tree s1, tree s2) { if (!s1) return s2; if (!s2) return s1; if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2)) return s1; return s2; }
static void set_block_levels (tree block, int level) { while (block) { BLOCK_NUMBER (block) = level; set_block_levels (BLOCK_SUBBLOCKS (block), level + 1); block = BLOCK_CHAIN (block); } }
static void change_scope (rtx orig_insn, tree s1, tree s2) { rtx insn = orig_insn; tree com = NULL_TREE; tree ts1 = s1, ts2 = s2; tree s; while (ts1 != ts2) { if (ts1 == NULL || ts2 == NULL) abort (); if (BLOCK_NUMBER (ts1) > BLOCK_NUMBER (ts2)) ts1 = BLOCK_SUPERCONTEXT (ts1); else if (BLOCK_NUMBER (ts1) < BLOCK_NUMBER (ts2)) ts2 = BLOCK_SUPERCONTEXT (ts2); else { ts1 = BLOCK_SUPERCONTEXT (ts1); ts2 = BLOCK_SUPERCONTEXT (ts2); } } com = ts1; /* Close scopes. */ s = s1; while (s != com) { rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn); NOTE_BLOCK (note) = s; s = BLOCK_SUPERCONTEXT (s); } /* Open scopes. */ s = s2; while (s != com) { insn = emit_note_before (NOTE_INSN_BLOCK_BEG, insn); NOTE_BLOCK (insn) = s; s = BLOCK_SUPERCONTEXT (s); } }
static void sdbout_block (tree block) { while (block) { /* Ignore blocks never expanded or otherwise marked as real. */ if (TREE_USED (block)) { /* When we reach the specified block, output its symbols. */ if (BLOCK_NUMBER (block) == do_block) sdbout_syms (BLOCK_VARS (block)); /* If we are past the specified block, stop the scan. */ if (BLOCK_NUMBER (block) > do_block) return; /* Scan the blocks within this block. */ sdbout_block (BLOCK_SUBBLOCKS (block)); } block = BLOCK_CHAIN (block); } }
void print_insn (pretty_printer *pp, const_rtx x, int verbose) { if (verbose) { /* Blech, pretty-print can't print integers with a specified width. */ char uid_prefix[32]; snprintf (uid_prefix, sizeof uid_prefix, " %4d: ", INSN_UID (x)); pp_string (pp, uid_prefix); } switch (GET_CODE (x)) { case INSN: print_pattern (pp, PATTERN (x), verbose); break; case DEBUG_INSN: { const char *name = "?"; if (DECL_P (INSN_VAR_LOCATION_DECL (x))) { tree id = DECL_NAME (INSN_VAR_LOCATION_DECL (x)); char idbuf[32]; if (id) name = IDENTIFIER_POINTER (id); else if (TREE_CODE (INSN_VAR_LOCATION_DECL (x)) == DEBUG_EXPR_DECL) { sprintf (idbuf, "D#%i", DEBUG_TEMP_UID (INSN_VAR_LOCATION_DECL (x))); name = idbuf; } else { sprintf (idbuf, "D.%i", DECL_UID (INSN_VAR_LOCATION_DECL (x))); name = idbuf; } } pp_printf (pp, "debug %s => ", name); if (VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (x))) pp_string (pp, "optimized away"); else print_pattern (pp, INSN_VAR_LOCATION_LOC (x), verbose); } break; case JUMP_INSN: print_pattern (pp, PATTERN (x), verbose); break; case CALL_INSN: if (GET_CODE (PATTERN (x)) == PARALLEL) print_pattern (pp, XVECEXP (PATTERN (x), 0, 0), verbose); else print_pattern (pp, PATTERN (x), verbose); break; case CODE_LABEL: pp_printf (pp, "L%d:", INSN_UID (x)); break; case JUMP_TABLE_DATA: pp_string (pp, "jump_table_data{\n"); print_pattern (pp, PATTERN (x), verbose); pp_right_brace (pp); break; case BARRIER: pp_string (pp, "barrier"); break; case NOTE: { pp_string (pp, GET_NOTE_INSN_NAME (NOTE_KIND (x))); switch (NOTE_KIND (x)) { case NOTE_INSN_EH_REGION_BEG: case NOTE_INSN_EH_REGION_END: pp_printf (pp, " %d", NOTE_EH_HANDLER (x)); break; case NOTE_INSN_BLOCK_BEG: case NOTE_INSN_BLOCK_END: pp_printf (pp, " %d", BLOCK_NUMBER (NOTE_BLOCK (x))); break; case NOTE_INSN_BASIC_BLOCK: pp_printf (pp, " %d", NOTE_BASIC_BLOCK (x)->index); break; case NOTE_INSN_DELETED_LABEL: case NOTE_INSN_DELETED_DEBUG_LABEL: { const char *label = NOTE_DELETED_LABEL_NAME (x); if (label == NULL) label = ""; pp_printf (pp, " (\"%s\")", label); } break; case NOTE_INSN_VAR_LOCATION: case NOTE_INSN_CALL_ARG_LOCATION: pp_left_brace (pp); print_pattern (pp, NOTE_VAR_LOCATION (x), verbose); pp_right_brace (pp); break; default: break; } break; } default: gcc_unreachable (); } } /* print_insn */
Record the function's starting line number, so we can output relative line numbers for the other lines. Record the file name that this function is contained in. */ void xcoffout_begin_prologue (unsigned int line, const char *file ATTRIBUTE_UNUSED) { ASM_OUTPUT_LFB (asm_out_file, line); dbxout_parms (DECL_ARGUMENTS (current_function_decl)); /* Emit the symbols for the outermost BLOCK's variables. sdbout.c does this in sdbout_begin_block, but there is no guarantee that there will be any inner block 1, so we must do it here. This gives a result similar to dbxout, so it does make some sense. */ do_block = BLOCK_NUMBER (DECL_INITIAL (current_function_decl)); xcoffout_block (DECL_INITIAL (current_function_decl), 0, DECL_ARGUMENTS (current_function_decl)); ASM_OUTPUT_LINE (asm_out_file, line); } /* Called at end of function (before epilogue). Describe end of outermost block. */ void xcoffout_end_function (unsigned int last_linenum) { ASM_OUTPUT_LFE (asm_out_file, last_linenum); }