From: Andrew Cagney Date: Tue, 17 Feb 2004 15:21:22 +0000 (+0000) Subject: 2004-02-17 Andrew Cagney X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=634aa483dd4a87a16b9ebd0a1bd8621dc4196fb2;p=binutils-gdb.git 2004-02-17 Andrew Cagney * symtab.c (skip_prologue_using_sal): New function. * symtab.h (skip_prologue_using_sal): Declare. * frv-tdep.c: Include "symtab.h". (skip_prologue_using_sal): Delete function. * mips-tdep.c (skip_prologue_using_sal): Delete function. * rs6000-tdep.c (refine_prologue_limit): Mention skip_prologue_using_sal. * ia64-tdep.c (refine_prologue_limit): Ditto. * Makefile.in: Update dependencies. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b7a112cb824..c2767d0b81e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,4 +1,16 @@ -2004-02-09 Andrew Cagney +2004-02-17 Andrew Cagney + + * symtab.c (skip_prologue_using_sal): New function. + * symtab.h (skip_prologue_using_sal): Declare. + * frv-tdep.c: Include "symtab.h". + (skip_prologue_using_sal): Delete function. + * mips-tdep.c (skip_prologue_using_sal): Delete function. + * rs6000-tdep.c (refine_prologue_limit): Mention + skip_prologue_using_sal. + * ia64-tdep.c (refine_prologue_limit): Ditto. + * Makefile.in: Update dependencies. + +2004-02-16 Andrew Cagney * config/alpha/tm-nbsd.h: Update copyright, delete #undef START_INFERIOR_TRAPS_EXPECTED. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index f600575c164..c9235197b6e 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1703,7 +1703,7 @@ frame-unwind.o: frame-unwind.c $(defs_h) $(frame_h) $(frame_unwind_h) \ frv-tdep.o: frv-tdep.c $(defs_h) $(gdb_string_h) $(inferior_h) $(gdbcore_h) \ $(arch_utils_h) $(regcache_h) $(frame_h) $(frame_unwind_h) \ $(frame_base_h) $(trad_frame_h) $(dis_asm_h) $(gdb_assert_h) \ - $(sim_regno_h) $(gdb_sim_frv_h) $(opcodes_frv_desc_h) + $(sim_regno_h) $(gdb_sim_frv_h) $(opcodes_frv_desc_h) $(symtab_h) f-typeprint.o: f-typeprint.c $(defs_h) $(gdb_obstack_h) $(bfd_h) $(symtab_h) \ $(gdbtypes_h) $(expression_h) $(value_h) $(gdbcore_h) $(target_h) \ $(f_lang_h) $(gdb_string_h) diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c index 621848e4d46..b7936e7e454 100644 --- a/gdb/frv-tdep.c +++ b/gdb/frv-tdep.c @@ -33,6 +33,7 @@ #include "sim-regno.h" #include "gdb/sim-frv.h" #include "opcodes/frv-desc.h" /* for the H_SPR_... enums */ +#include "symtab.h" extern void _initialize_frv_tdep (void); @@ -413,62 +414,6 @@ is_argument_reg (int reg) return (8 <= reg && reg <= 13); } -/* Given PC at the function's start address, attempt to find the - prologue end using SAL information. Return zero if the skip fails. - - A non-optimized prologue traditionally has one SAL for the function - and a second for the function body. A single line function has - them both pointing at the same line. - - An optimized prologue is similar but the prologue may contain - instructions (SALs) from the instruction body. Need to skip those - while not getting into the function body. - - The functions end point and an increasing SAL line are used as - indicators of the prologue's endpoint. - - This code is based on the function refine_prologue_limit (versions - found in both ia64 and ppc). */ - -static CORE_ADDR -skip_prologue_using_sal (CORE_ADDR func_addr) -{ - struct symtab_and_line prologue_sal; - CORE_ADDR start_pc; - CORE_ADDR end_pc; - - /* Get an initial range for the function. */ - find_pc_partial_function (func_addr, NULL, &start_pc, &end_pc); - start_pc += FUNCTION_START_OFFSET; - - prologue_sal = find_pc_line (start_pc, 0); - if (prologue_sal.line != 0) - { - while (prologue_sal.end < end_pc) - { - struct symtab_and_line sal; - - sal = find_pc_line (prologue_sal.end, 0); - if (sal.line == 0) - break; - /* Assume that a consecutive SAL for the same (or larger) - line mark the prologue -> body transition. */ - if (sal.line >= prologue_sal.line) - break; - /* The case in which compiler's optimizer/scheduler has - moved instructions into the prologue. We look ahead in - the function looking for address ranges whose - corresponding line number is less the first one that we - found for the function. This is more conservative then - refine_prologue_limit which scans a large number of SALs - looking for any in the prologue */ - prologue_sal = sal; - } - } - return prologue_sal.end; -} - - /* Scan an FR-V prologue, starting at PC, until frame->PC. If FRAME is non-zero, fill in its saved_regs with appropriate addresses. We assume FRAME's saved_regs array has already been allocated and cleared. diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index 2b293f2325e..f871533c9df 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -930,6 +930,9 @@ static int max_skip_non_prologue_insns = 40; used with no further scanning in the event that the function is frameless. */ +/* FIXME: cagney/2004-02-14: This function and logic have largely been + superseded by skip_prologue_using_sal. */ + static CORE_ADDR refine_prologue_limit (CORE_ADDR pc, CORE_ADDR lim_pc, int *trust_limit) { diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index fb80964e6ed..9638b0862f4 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -4564,62 +4564,6 @@ mips_step_skips_delay (CORE_ADDR pc) extract_unsigned_integer (buf, MIPS_INSTLEN)); } - -/* Given PC at the function's start address, attempt to find the - prologue end using SAL information. Return zero if the skip fails. - - A non-optimized prologue traditionally has one SAL for the function - and a second for the function body. A single line function has - them both pointing at the same line. - - An optimized prologue is similar but the prologue may contain - instructions (SALs) from the instruction body. Need to skip those - while not getting into the function body. - - The functions end point and an increasing SAL line are used as - indicators of the prologue's endpoint. - - This code is based on the function refine_prologue_limit (versions - found in both ia64 and ppc). */ - -static CORE_ADDR -skip_prologue_using_sal (CORE_ADDR func_addr) -{ - struct symtab_and_line prologue_sal; - CORE_ADDR start_pc; - CORE_ADDR end_pc; - - /* Get an initial range for the function. */ - find_pc_partial_function (func_addr, NULL, &start_pc, &end_pc); - start_pc += FUNCTION_START_OFFSET; - - prologue_sal = find_pc_line (start_pc, 0); - if (prologue_sal.line != 0) - { - while (prologue_sal.end < end_pc) - { - struct symtab_and_line sal; - - sal = find_pc_line (prologue_sal.end, 0); - if (sal.line == 0) - break; - /* Assume that a consecutive SAL for the same (or larger) - line mark the prologue -> body transition. */ - if (sal.line >= prologue_sal.line) - break; - /* The case in which compiler's optimizer/scheduler has - moved instructions into the prologue. We look ahead in - the function looking for address ranges whose - corresponding line number is less the first one that we - found for the function. This is more conservative then - refine_prologue_limit which scans a large number of SALs - looking for any in the prologue */ - prologue_sal = sal; - } - } - return prologue_sal.end; -} - /* Skip the PC past function prologue instructions (32-bit version). This is a helper function for mips_skip_prologue. */ diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 32cedc048fe..5eef8959115 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -425,6 +425,10 @@ static int max_skip_non_prologue_insns = 10; the line data in the symbol table. If successful, a better guess on where the prologue ends is returned, otherwise the previous value of lim_pc is returned. */ + +/* FIXME: cagney/2004-02-14: This function and logic have largely been + superseded by skip_prologue_using_sal. */ + static CORE_ADDR refine_prologue_limit (CORE_ADDR pc, CORE_ADDR lim_pc) { diff --git a/gdb/symtab.c b/gdb/symtab.c index 622e27788ca..99f138a3063 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -3860,6 +3860,60 @@ in_prologue (CORE_ADDR pc, CORE_ADDR func_start) return func_addr <= pc && pc < sal.end; } +/* Given PC at the function's start address, attempt to find the + prologue end using SAL information. Return zero if the skip fails. + + A non-optimized prologue traditionally has one SAL for the function + and a second for the function body. A single line function has + them both pointing at the same line. + + An optimized prologue is similar but the prologue may contain + instructions (SALs) from the instruction body. Need to skip those + while not getting into the function body. + + The functions end point and an increasing SAL line are used as + indicators of the prologue's endpoint. + + This code is based on the function refine_prologue_limit (versions + found in both ia64 and ppc). */ + +CORE_ADDR +skip_prologue_using_sal (CORE_ADDR func_addr) +{ + struct symtab_and_line prologue_sal; + CORE_ADDR start_pc; + CORE_ADDR end_pc; + + /* Get an initial range for the function. */ + find_pc_partial_function (func_addr, NULL, &start_pc, &end_pc); + start_pc += FUNCTION_START_OFFSET; + + prologue_sal = find_pc_line (start_pc, 0); + if (prologue_sal.line != 0) + { + while (prologue_sal.end < end_pc) + { + struct symtab_and_line sal; + + sal = find_pc_line (prologue_sal.end, 0); + if (sal.line == 0) + break; + /* Assume that a consecutive SAL for the same (or larger) + line mark the prologue -> body transition. */ + if (sal.line >= prologue_sal.line) + break; + /* The case in which compiler's optimizer/scheduler has + moved instructions into the prologue. We look ahead in + the function looking for address ranges whose + corresponding line number is less the first one that we + found for the function. This is more conservative then + refine_prologue_limit which scans a large number of SALs + looking for any in the prologue */ + prologue_sal = sal; + } + } + return prologue_sal.end; +} struct symtabs_and_lines decode_line_spec (char *string, int funfirstline) diff --git a/gdb/symtab.h b/gdb/symtab.h index b5d9ffd65b4..5a6c3984bd1 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1318,6 +1318,8 @@ extern enum language deduce_language_from_filename (char *); extern int in_prologue (CORE_ADDR pc, CORE_ADDR func_start); +extern CORE_ADDR skip_prologue_using_sal (CORE_ADDR func_addr); + extern struct symbol *fixup_symbol_section (struct symbol *, struct objfile *);