gdb: Allow prologue detection via symbols for Intel compilers.

The next-gen Intel Fortran compiler isn't flang-based, but emits
prologue_end in the same manner.  As do the newer Intel C/C++ compilers.
This allows prologue detection based on dwarf for all newer Intel compilers.
The cut-off version was not chosen for any specific reason other than the
effort to test this.

gdb/Changelog:
2021-04-08  Felix Willgerodt  <felix.willgerodt@intel.com>

    	* i386-tdep.c (i386_skip_prologue): Use symbol table to find the
    	prologue end for Intel compilers.
    	* amd64-tdep.c (amd64_skip_prologue): Likewise.
    	* producer.c (producer_is_icc_ge_19): New function.
    	* producer.h (producer_is_icc_ge_19): New declaration.
This commit is contained in:
Felix Willgerodt 2021-04-08 09:16:15 +02:00
parent fbb3bcfcd8
commit 16e311ab6d
5 changed files with 33 additions and 8 deletions

View File

@ -1,3 +1,11 @@
2021-04-08 Felix Willgerodt <felix.willgerodt@intel.com>
* i386-tdep.c (i386_skip_prologue): Use symbol table to find the
prologue end for Intel compilers.
* amd64-tdep.c (amd64_skip_prologue): Likewise.
* producer.c (producer_is_icc_ge_19): New function.
* producer.h (producer_is_icc_ge_19): New declaration.
2021-04-08 Felix Willgerodt <felix.willgerodt@intel.com>
* producer.c: (producer_is_icc): Update for new version scheme.

View File

@ -2527,13 +2527,14 @@ amd64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
/* LLVM backend (Clang/Flang) always emits a line note before the
prologue and another one after. We trust clang to emit usable
line notes. */
prologue and another one after. We trust clang and newer Intel
compilers to emit usable line notes. */
if (post_prologue_pc
&& (cust != NULL
&& COMPUNIT_PRODUCER (cust) != NULL
&& producer_is_llvm (COMPUNIT_PRODUCER (cust))))
return std::max (start_pc, post_prologue_pc);
&& (producer_is_llvm (COMPUNIT_PRODUCER (cust))
|| producer_is_icc_ge_19 (COMPUNIT_PRODUCER (cust)))))
return std::max (start_pc, post_prologue_pc);
}
amd64_init_frame_cache (&cache);

View File

@ -1847,13 +1847,14 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
/* LLVM backend (Clang/Flang) always emits a line note before the
prologue and another one after. We trust clang to emit usable
line notes. */
prologue and another one after. We trust clang and newer Intel
compilers to emit usable line notes. */
if (post_prologue_pc
&& (cust != NULL
&& COMPUNIT_PRODUCER (cust) != NULL
&& producer_is_llvm (COMPUNIT_PRODUCER (cust))))
return std::max (start_pc, post_prologue_pc);
&& (producer_is_llvm (COMPUNIT_PRODUCER (cust))
|| producer_is_icc_ge_19 (COMPUNIT_PRODUCER (cust)))))
return std::max (start_pc, post_prologue_pc);
}
cache.locals = -1;

View File

@ -73,6 +73,18 @@ producer_is_gcc (const char *producer, int *major, int *minor)
return 0;
}
/* See producer.h. */
bool
producer_is_icc_ge_19 (const char *producer)
{
int major, minor;
if (! producer_is_icc (producer, &major, &minor))
return false;
return major >= 19;
}
/* See producer.h. */

View File

@ -30,6 +30,9 @@ extern int producer_is_gcc_ge_4 (const char *producer);
is NULL or it isn't GCC. */
extern int producer_is_gcc (const char *producer, int *major, int *minor);
/* Check for Intel compilers >= 19.0. */
extern bool producer_is_icc_ge_19 (const char *producer);
/* Returns true if the given PRODUCER string is Intel or false
otherwise. Sets the MAJOR and MINOR versions when not NULL. */
extern bool producer_is_icc (const char *producer, int *major, int *minor);