[1/3] Add new commands for controlling type signature fallback.
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
fail
|
Build failed
|
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
fail
|
Build failed
|
Commit Message
'set dwarf-type-signature-fallback (off|main|full)':
Enable type signature fallback.
If a type signature is not found in the current objfile, either looks up the 'main' objfile or all objfiles in a progspace to find the type signature.
Usually a type signature is unique, ther should only be one type unit for each type signature.
Therefore, it should be okay to check other objfile for a type signature.
However, whether this is really the case depends on the debug info producer.
This is why its disabled by default.
'set dwarf-type-signature-fallback-jit':
Whether the type signature fallback is enabled for only JIT objfiles.
JIT objfiles are self-contained, but usually share most debug info with some already loaded objfile.
This is why JIT objfiles are a major use case for the type signature fallback.
This option is added to restrict the type signature fallback to match this exact use-case and provides a more granular use of the type signature fallback.
---
gdb/NEWS | 14 +++++++++
gdb/doc/gdb.texinfo | 26 +++++++++++++++++
gdb/dwarf2/read.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 110 insertions(+)
Comments
> From: dominikmascherbauer <dominik.mascherbauer@gmail.com>
> Cc: dominikmascherbauer <dominik.mascherbauer@oracle.com>
> Date: Tue, 11 Mar 2025 15:57:18 +0100
>
> 'set dwarf-type-signature-fallback (off|main|full)':
> Enable type signature fallback.
> If a type signature is not found in the current objfile, either looks up the 'main' objfile or all objfiles in a progspace to find the type signature.
> Usually a type signature is unique, ther should only be one type unit for each type signature.
> Therefore, it should be okay to check other objfile for a type signature.
> However, whether this is really the case depends on the debug info producer.
> This is why its disabled by default.
>
> 'set dwarf-type-signature-fallback-jit':
> Whether the type signature fallback is enabled for only JIT objfiles.
> JIT objfiles are self-contained, but usually share most debug info with some already loaded objfile.
> This is why JIT objfiles are a major use case for the type signature fallback.
> This option is added to restrict the type signature fallback to match this exact use-case and provides a more granular use of the type signature fallback.
> ---
> gdb/NEWS | 14 +++++++++
> gdb/doc/gdb.texinfo | 26 +++++++++++++++++
> gdb/dwarf2/read.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 110 insertions(+)
Thanks.
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 2c504a9b603..53368d7463c 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -261,6 +261,20 @@ disable missing-objfile-handler LOCUS HANDLER
> or can be a regular expression which is matched against the filename
> of the primary executable in each program space.
>
> +set dwarf-type-signature-fallback (off|main|full)
> + New command which enables a type signature lookup fallback, if a
> + dwarf objfile from a JIT compilation does not provide its own type
> + units, but relies on type units from other objfiles. The 'main'
> + setting allows to limit the scope of the lookup to just the main
> + symfile objfile, 'full' uses all objfiles in a progspace.
> + The default value is 'off'.
> +
> +set dwarf-type-signature-fallback-jit on|off
> + New command that is used in combination with type-signature-fallback
> + and is on by default. If type signature fallback is enabled,
> + this restricts the fallback to objfiles that were loaded with the
> + JIT debug interface.
> +
> * Changed commands
>
> remove-symbol-file
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 04719bf65e6..901152dd15e 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -42325,6 +42325,32 @@ Symbol "argc" is a complex DWARF expression:
> For more information on these expressions, see
> @uref{http://www.dwarfstd.org/, the DWARF standard}.
>
> +@kindex set dwarf-type-signature-fallback
> +@kindex show dwarf-type-signature-fallback
> +@item set dwarf-type-signature-fallback @samp{full|main|off}
> +@itemx show dwarf-type-signature-fallback
> +Control the behavior of the type signature lookup for type units if a
> +type signature is undefined within an objfile.
> +
> +The default is @code{off}, which means @value{GDBN} will not use other
> +objfiles in the progspace to lookup missing type signatures. When
> +@code{main}, @value{GDBN} will check the current main objfile for a
> +missing signatured type. When @code{full}, all objfiles in the current
> +progspace will be searched for the missing signatured type.
> +
> +@kindex set dwarf-type-signature-fallback-jit
> +@kindex show dwarf-type-signature-fallback-jit
> +@item set dwarf-type-signature-fallback-jit
> +@itemx show dwarf-type-signature-fallback-jit
> +
> +Control whether @code{dwarf type-signature-fallback} is limited to
> +objfiles originated from the JIT interface (@pxref{JIT Interface})
> +or all objfiles with a missing signatured type.
> +
> +The default is @code{on}, which limits the type signature fallback to
> +only objfiles from the JIT interface. When @code{off}, the type signature
> +fallback will look for missing signatured types for all objfiles.
Please leave two spaces between sentences, otherwise the printed
version will be typeset sub-optimally.
More generally, I think both NEWS and the text for the manual doesn't
tell what this means in practical terms and when it would be useful to
fiddle with these options. I find myself wondering why and when would
I need to help GDB look up type signature, and even what is a "type
signature" (it is used in the manual only once, without any
explanations). I think at least the manual should answer these
questions.
> + add_setshow_enum_cmd ("dwarf-type-signature-fallback", class_support,
> + type_signature_fallback_enums, &type_signature_fallback,
> + _ ("\
> +Set resolution of type signatures with other objfiles as fallback."), _ ("\
> +Show resolution of type signatures with other objfiles as fallback."), _ ("\
> +This option will only take effect if set before loading symbols.\n\
> +off == turn type signature fallback off\n\
> +main == use the main symbolfile as fallback objfile\n\
> + for type signature resolution\n\
> +full == use all objfiles with type units in the current progspace\n\
> + as fallback objfiles for type signature resolution."),
The list of possible values should probably start with "main" or
"full", as otherwise the reference to "fallback" in "off" will not be
understood.
Also note that you use "resolution" in the above doc strings, but
"look up" in the manual and NEWS. I think it's better to use the same
terminology; "look up" sounds more accurate to me.
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Thanks for the review.
>> From: dominikmascherbauer <dominik.mascherbauer@gmail.com>
>> Cc: dominikmascherbauer <dominik.mascherbauer@oracle.com>
>> Date: Tue, 11 Mar 2025 15:57:18 +0100
>>
>> 'set dwarf-type-signature-fallback (off|main|full)':
>> Enable type signature fallback.
>> If a type signature is not found in the current objfile, either looks up the 'main' objfile or all objfiles in a progspace to find the type signature.
>> Usually a type signature is unique, ther should only be one type unit for each type signature.
>> Therefore, it should be okay to check other objfile for a type signature.
>> However, whether this is really the case depends on the debug info producer.
>> This is why its disabled by default.
>>
>> 'set dwarf-type-signature-fallback-jit':
>> Whether the type signature fallback is enabled for only JIT objfiles.
>> JIT objfiles are self-contained, but usually share most debug info with some already loaded objfile.
>> This is why JIT objfiles are a major use case for the type signature fallback.
>> This option is added to restrict the type signature fallback to match this exact use-case and provides a more granular use of the type signature fallback.
>> ---
>> gdb/NEWS | 14 +++++++++
>> gdb/doc/gdb.texinfo | 26 +++++++++++++++++
>> gdb/dwarf2/read.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 110 insertions(+)
>
> Thanks.
>
>> diff --git a/gdb/NEWS b/gdb/NEWS
>> index 2c504a9b603..53368d7463c 100644
>> --- a/gdb/NEWS
>> +++ b/gdb/NEWS
>> @@ -261,6 +261,20 @@ disable missing-objfile-handler LOCUS HANDLER
>> or can be a regular expression which is matched against the filename
>> of the primary executable in each program space.
>>
>> +set dwarf-type-signature-fallback (off|main|full)
>> + New command which enables a type signature lookup fallback, if a
>> + dwarf objfile from a JIT compilation does not provide its own type
>> + units, but relies on type units from other objfiles. The 'main'
>> + setting allows to limit the scope of the lookup to just the main
>> + symfile objfile, 'full' uses all objfiles in a progspace.
>> + The default value is 'off'.
>> +
>> +set dwarf-type-signature-fallback-jit on|off
>> + New command that is used in combination with type-signature-fallback
>> + and is on by default. If type signature fallback is enabled,
>> + this restricts the fallback to objfiles that were loaded with the
>> + JIT debug interface.
>> +
>> * Changed commands
>>
>> remove-symbol-file
>> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
>> index 04719bf65e6..901152dd15e 100644
>> --- a/gdb/doc/gdb.texinfo
>> +++ b/gdb/doc/gdb.texinfo
>> @@ -42325,6 +42325,32 @@ Symbol "argc" is a complex DWARF expression:
>> For more information on these expressions, see
>> @uref{http://www.dwarfstd.org/, the DWARF standard}.
>>
>> +@kindex set dwarf-type-signature-fallback
>> +@kindex show dwarf-type-signature-fallback
>> +@item set dwarf-type-signature-fallback @samp{full|main|off}
>> +@itemx show dwarf-type-signature-fallback
>> +Control the behavior of the type signature lookup for type units if a
>> +type signature is undefined within an objfile.
>> +
>> +The default is @code{off}, which means @value{GDBN} will not use other
>> +objfiles in the progspace to lookup missing type signatures. When
>> +@code{main}, @value{GDBN} will check the current main objfile for a
>> +missing signatured type. When @code{full}, all objfiles in the current
>> +progspace will be searched for the missing signatured type.
>> +
>> +@kindex set dwarf-type-signature-fallback-jit
>> +@kindex show dwarf-type-signature-fallback-jit
>> +@item set dwarf-type-signature-fallback-jit
>> +@itemx show dwarf-type-signature-fallback-jit
>> +
>> +Control whether @code{dwarf type-signature-fallback} is limited to
>> +objfiles originated from the JIT interface (@pxref{JIT Interface})
>> +or all objfiles with a missing signatured type.
>> +
>> +The default is @code{on}, which limits the type signature fallback to
>> +only objfiles from the JIT interface. When @code{off}, the type signature
>> +fallback will look for missing signatured types for all objfiles.
>
> Please leave two spaces between sentences, otherwise the printed
> version will be typeset sub-optimally.
>
> More generally, I think both NEWS and the text for the manual doesn't
> tell what this means in practical terms and when it would be useful to
> fiddle with these options. I find myself wondering why and when would
> I need to help GDB look up type signature, and even what is a "type
> signature" (it is used in the manual only once, without any
> explanations). I think at least the manual should answer these
> questions.
>
Would this be enough, or does it need to be more detailed:
diff --git a/gdb/NEWS b/gdb/NEWS
index 53368d7463c..5274c84f168 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -262,18 +262,25 @@ disable missing-objfile-handler LOCUS HANDLER
of the primary executable in each program space.
set dwarf-type-signature-fallback (off|main|full)
- New command which enables a type signature lookup fallback, if a
- dwarf objfile from a JIT compilation does not provide its own type
- units, but relies on type units from other objfiles. The 'main'
- setting allows to limit the scope of the lookup to just the main
- symfile objfile, 'full' uses all objfiles in a progspace.
+ New command which enables a type signature look up fallback for DWARF objfiles.
+ If type signatures in DWARF objfile are unique, enabling this option to look
+ up type signatures from fallback DWARF objfiles. Reusing type units from
+ fallback objfiles can be used to avoid duplicating those type units.
+
+ The 'main' setting allows to limit the scope of the lookup to just the main
+ symfile objfile to reduce the overhead of type signature lookup. The 'full'
+ setting uses all objfiles in a progspace to find as many type signatures as
+ possible.
The default value is 'off'.
set dwarf-type-signature-fallback-jit on|off
- New command that is used in combination with type-signature-fallback
+ New command that is used in combination with dwarf-type-signature-fallback
and is on by default. If type signature fallback is enabled,
this restricts the fallback to objfiles that were loaded with the
JIT debug interface.
+ JIT objfiles are produced at run-time and often rely on already available
+ type information. This allows the debug info producer to skip generating type
+ units that are known to be present in other objfiles.
* Changed commands
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 901152dd15e..9581ea915e4 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -42329,27 +42329,35 @@ For more information on these expressions, see
@kindex show dwarf-type-signature-fallback
@item set dwarf-type-signature-fallback @samp{full|main|off}
@itemx show dwarf-type-signature-fallback
-Control the behavior of the type signature lookup for type units if a
-type signature is undefined within an objfile.
+Control the behavior of the type signature look up in DWARF objfiles. Type
+Signatures in DWARF uniquely identify a type unit. A type unit contains debug
+info for a type and can b referenced by its type signature. Type signature
+look up allows @value{GDBN} to look up type signatures not only in objfile
+containing the refererence to a type signature, but also other type signatures
+in the progspace. This allows to avoid duplicating type units, by looking them
+up from other DWARF objfiles.
The default is @code{off}, which means @value{GDBN} will not use other
-objfiles in the progspace to lookup missing type signatures. When
-@code{main}, @value{GDBN} will check the current main objfile for a
-missing signatured type. When @code{full}, all objfiles in the current
+objfiles in the progspace to look up missing type signatures. When
+@code{main}, @value{GDBN} will check the current main symfile objfile for a
+missing signatured type. If the main symfile objfile contains most of the
+debug info required for debugging, this setting reduces the impact of type
+signature look up. When @code{full}, all DWARF objfiles in the current
progspace will be searched for the missing signatured type.
@kindex set dwarf-type-signature-fallback-jit
@kindex show dwarf-type-signature-fallback-jit
@item set dwarf-type-signature-fallback-jit
@itemx show dwarf-type-signature-fallback-jit
-
-Control whether @code{dwarf type-signature-fallback} is limited to
+Control whether @code{dwarf-type-signature-fallback} is limited to DWARF
objfiles originated from the JIT interface (@pxref{JIT Interface})
-or all objfiles with a missing signatured type.
+or all DWARF objfiles with a missing signatured type. If only objfiles loaded
+through the JIT interface rely on existing types and type units this
+setting allows to limit type signature look up to avoid undesired behavior.
The default is @code{on}, which limits the type signature fallback to
-only objfiles from the JIT interface. When @code{off}, the type signature
-fallback will look for missing signatured types for all objfiles.
+only DWARF objfiles from the JIT interface. When @code{off}, type signature
+look up is performed for missing signatured types in all DWARF objfiles.
@kindex maint set dwarf max-cache-age
@kindex maint show dwarf max-cache-age
>> + add_setshow_enum_cmd ("dwarf-type-signature-fallback", class_support,
>> + type_signature_fallback_enums, &type_signature_fallback,
>> + _ ("\
>> +Set resolution of type signatures with other objfiles as fallback."), _ ("\
>> +Show resolution of type signatures with other objfiles as fallback."), _ ("\
>> +This option will only take effect if set before loading symbols.\n\
>> +off == turn type signature fallback off\n\
>> +main == use the main symbolfile as fallback objfile\n\
>> + for type signature resolution\n\
>> +full == use all objfiles with type units in the current progspace\n\
>> + as fallback objfiles for type signature resolution."),
>
> The list of possible values should probably start with "main" or
> "full", as otherwise the reference to "fallback" in "off" will not be
> understood.
>
> Also note that you use "resolution" in the above doc strings, but
> "look up" in the manual and NEWS. I think it's better to use the same
> terminology; "look up" sounds more accurate to me.
>
Ok, I will change that.
> Reviewed-By: Eli Zaretskii <eliz@gnu.org>
> Date: Wed, 12 Mar 2025 10:12:23 +0100
> Cc: gdb-patches@sourceware.org
> From: Dominik Mascherbauer <dominik.mascherbauer@gmail.com>
>
> Would this be enough, or does it need to be more detailed:
I think it should be enough, but there are typos to fix:
> + If type signatures in DWARF objfile are unique, enabling this option to look
> + up type signatures from fallback DWARF objfiles.
This sentence is incomplete, or maybe some words need to be modified.
> +Control the behavior of the type signature look up in DWARF objfiles. Type
> +Signatures in DWARF uniquely identify a type unit. A type unit contains debug
> +info for a type and can b referenced by its type signature. Type signature
^
"be"
Thanks.
>> Date: Wed, 12 Mar 2025 10:12:23 +0100
>> Cc: gdb-patches@sourceware.org
>> From: Dominik Mascherbauer <dominik.mascherbauer@gmail.com>
>>
>> Would this be enough, or does it need to be more detailed:
>
> I think it should be enough, but there are typos to fix:
>
>> + If type signatures in DWARF objfile are unique, enabling this option to look
>> + up type signatures from fallback DWARF objfiles.
>
> This sentence is incomplete, or maybe some words need to be modified.
>
>> +Control the behavior of the type signature look up in DWARF objfiles. Type
>> +Signatures in DWARF uniquely identify a type unit. A type unit contains debug
>> +info for a type and can b referenced by its type signature. Type signature
> ^
> "be"
>
> Thanks.
I'll fix that.
Thanks.
@@ -261,6 +261,20 @@ disable missing-objfile-handler LOCUS HANDLER
or can be a regular expression which is matched against the filename
of the primary executable in each program space.
+set dwarf-type-signature-fallback (off|main|full)
+ New command which enables a type signature lookup fallback, if a
+ dwarf objfile from a JIT compilation does not provide its own type
+ units, but relies on type units from other objfiles. The 'main'
+ setting allows to limit the scope of the lookup to just the main
+ symfile objfile, 'full' uses all objfiles in a progspace.
+ The default value is 'off'.
+
+set dwarf-type-signature-fallback-jit on|off
+ New command that is used in combination with type-signature-fallback
+ and is on by default. If type signature fallback is enabled,
+ this restricts the fallback to objfiles that were loaded with the
+ JIT debug interface.
+
* Changed commands
remove-symbol-file
@@ -42325,6 +42325,32 @@ Symbol "argc" is a complex DWARF expression:
For more information on these expressions, see
@uref{http://www.dwarfstd.org/, the DWARF standard}.
+@kindex set dwarf-type-signature-fallback
+@kindex show dwarf-type-signature-fallback
+@item set dwarf-type-signature-fallback @samp{full|main|off}
+@itemx show dwarf-type-signature-fallback
+Control the behavior of the type signature lookup for type units if a
+type signature is undefined within an objfile.
+
+The default is @code{off}, which means @value{GDBN} will not use other
+objfiles in the progspace to lookup missing type signatures. When
+@code{main}, @value{GDBN} will check the current main objfile for a
+missing signatured type. When @code{full}, all objfiles in the current
+progspace will be searched for the missing signatured type.
+
+@kindex set dwarf-type-signature-fallback-jit
+@kindex show dwarf-type-signature-fallback-jit
+@item set dwarf-type-signature-fallback-jit
+@itemx show dwarf-type-signature-fallback-jit
+
+Control whether @code{dwarf type-signature-fallback} is limited to
+objfiles originated from the JIT interface (@pxref{JIT Interface})
+or all objfiles with a missing signatured type.
+
+The default is @code{on}, which limits the type signature fallback to
+only objfiles from the JIT interface. When @code{off}, the type signature
+fallback will look for missing signatured types for all objfiles.
+
@kindex maint set dwarf max-cache-age
@kindex maint show dwarf max-cache-age
@item maint set dwarf max-cache-age
@@ -737,6 +737,49 @@ show_dwarf_max_cache_age (struct ui_file *file, int from_tty,
value);
}
+/* If the type for a type signature is not found in the CUs objfile
+ fallback to other objfiles for type signature resolution */
+const char type_signature_fallback_off[] = "off";
+const char type_signature_fallback_main[] = "main";
+const char type_signature_fallback_full[] = "full";
+static const char *type_signature_fallback_enums[] =
+ {
+ type_signature_fallback_off,
+ type_signature_fallback_main,
+ type_signature_fallback_full,
+ nullptr
+ };
+static const char *type_signature_fallback = type_signature_fallback_off;
+
+static void
+show_type_signature_fallback (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ gdb_printf (file, _ ("Resolution of type signatures with "
+ "fallback objfiles is %s.\n"),
+ value);
+}
+
+/* Type signature fallback is by default restricted to only jit objfiles. */
+static bool type_signature_fallback_jit = true;
+
+static void
+show_type_signature_fallback_jit (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ gdb_printf (file, _ ("Whether type signature resolution with "
+ "fallback objfiles is restricted to jit objfiles is %s.\n"),
+ value);
+}
+
+/* Check if type signature fallback applies to OBJFILE. */
+static bool
+use_type_signature_fallback (struct objfile *objfile)
+{
+ return type_signature_fallback != type_signature_fallback_off &&
+ (!type_signature_fallback_jit || objfile->flags & OBJF_JIT);
+}
+
/* When true, wait for DWARF reading to be complete. */
static bool dwarf_synchronous = false;
@@ -20103,6 +20146,33 @@ caching, which can slow down startup."),
&set_dwarf_cmdlist,
&show_dwarf_cmdlist);
+ add_setshow_enum_cmd ("dwarf-type-signature-fallback", class_support,
+ type_signature_fallback_enums, &type_signature_fallback,
+ _ ("\
+Set resolution of type signatures with other objfiles as fallback."), _ ("\
+Show resolution of type signatures with other objfiles as fallback."), _ ("\
+This option will only take effect if set before loading symbols.\n\
+off == turn type signature fallback off\n\
+main == use the main symbolfile as fallback objfile\n\
+ for type signature resolution\n\
+full == use all objfiles with type units in the current progspace\n\
+ as fallback objfiles for type signature resolution."),
+ NULL, show_type_signature_fallback, &setlist,
+ &showlist);
+
+ add_setshow_boolean_cmd ("dwarf-type-signature-fallback-jit", class_support,
+ &type_signature_fallback_jit,
+ _ ("\
+Set wether resolution of type signatures with other objfiles as fallback\n\
+is restricted to jit objfiles."), _ ("\
+Show resolution of type signatures with other objfiles as fallback\n\
+is restricted to jit objfiles."), _ ("\
+By default, type signature resolution with fallback objfiles is restricted\n\
+to jit objfiles.\n\
+This option will only take effect if type-signature-fallback is enabled."),
+ NULL, show_type_signature_fallback_jit, &setlist,
+ &showlist);
+
add_setshow_boolean_cmd ("synchronous", class_obscure,
&dwarf_synchronous, _("\
Set whether DWARF is read synchronously."), _("\