From 16e311ab6d4d379da18ad03bc5373f621f488f41 Mon Sep 17 00:00:00 2001 From: Felix Willgerodt Date: Thu, 8 Apr 2021 09:16:15 +0200 Subject: [PATCH] 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 * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/amd64-tdep.c | 9 +++++---- gdb/i386-tdep.c | 9 +++++---- gdb/producer.c | 12 ++++++++++++ gdb/producer.h | 3 +++ 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6fc98a74946..e2fd9122017 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2021-04-08 Felix Willgerodt + + * 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 * producer.c: (producer_is_icc): Update for new version scheme. diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 47d00634ed8..66a7c02f534 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -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); diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 2649fad08f2..50fd2767a18 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -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; diff --git a/gdb/producer.c b/gdb/producer.c index 1cda48c204a..591509fa85c 100644 --- a/gdb/producer.c +++ b/gdb/producer.c @@ -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. */ diff --git a/gdb/producer.h b/gdb/producer.h index 9cfccd63371..d08062e3e6d 100644 --- a/gdb/producer.h +++ b/gdb/producer.h @@ -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);