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. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.501 diff -u -r1.501 Makefile.in --- Makefile.in 16 Feb 2004 21:05:08 -0000 1.501 +++ Makefile.in 17 Feb 2004 15:08:31 -0000 @@ -1703,7 +1703,7 @@ 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) Index: frv-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/frv-tdep.c,v retrieving revision 1.71 diff -u -r1.71 frv-tdep.c --- frv-tdep.c 16 Feb 2004 21:49:21 -0000 1.71 +++ frv-tdep.c 17 Feb 2004 15:08:32 -0000 @@ -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); @@ -412,62 +413,6 @@ { 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. Index: ia64-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ia64-tdep.c,v retrieving revision 1.114 diff -u -r1.114 ia64-tdep.c --- ia64-tdep.c 14 Feb 2004 15:46:33 -0000 1.114 +++ ia64-tdep.c 17 Feb 2004 15:08:32 -0000 @@ -930,6 +930,9 @@ 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) { Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.282 diff -u -r1.282 mips-tdep.c --- mips-tdep.c 11 Feb 2004 18:47:26 -0000 1.282 +++ mips-tdep.c 17 Feb 2004 15:08:33 -0000 @@ -4564,62 +4564,6 @@ 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. */ Index: rs6000-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v retrieving revision 1.180 diff -u -r1.180 rs6000-tdep.c --- rs6000-tdep.c 16 Feb 2004 21:49:22 -0000 1.180 +++ rs6000-tdep.c 17 Feb 2004 15:08:34 -0000 @@ -425,6 +425,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) { Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.126 diff -u -r1.126 symtab.c --- symtab.c 7 Feb 2004 23:13:47 -0000 1.126 +++ symtab.c 17 Feb 2004 15:08:35 -0000 @@ -3860,6 +3860,60 @@ 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) Index: symtab.h =================================================================== RCS file: /cvs/src/src/gdb/symtab.h,v retrieving revision 1.87 diff -u -r1.87 symtab.h --- symtab.h 7 Feb 2004 23:13:47 -0000 1.87 +++ symtab.h 17 Feb 2004 15:08:35 -0000 @@ -1318,6 +1318,8 @@ 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 *);