Add -gcodeview option

Message ID 20221024002828.28861-1-mark@harmstone.com
State Unresolved
Headers
Series Add -gcodeview option |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Mark Harmstone Oct. 24, 2022, 12:28 a.m. UTC
  Both current lld and the next version of ld have an option -pdb, which
creates a PDB file which Microsoft's debuggers can use. This patch adds
a -gcodeview option, which passes this to the linker.

I do intend to expand this so it also creates the .debug$S and .debug$T
sections which would make this useful - I submitted patches for this a
while back, but they need to be rewritten to parse the DWARF DIEs rather
than using debug_hooks.

Clang also has -gcodeview, but AFAICS only uses it for .debug$S and
.debug$T, and doesn't use it for linker options (though IMO it probably
should).

---
 gcc/common.opt      | 4 ++++
 gcc/doc/invoke.texi | 7 +++++++
 gcc/gcc.cc          | 4 ++++
 gcc/opts.cc         | 3 +++
 4 files changed, 18 insertions(+)
  

Comments

Martin Storsjö Oct. 24, 2022, 11:08 a.m. UTC | #1
On Mon, 24 Oct 2022, Mark Harmstone wrote:

> Both current lld and the next version of ld have an option -pdb, which
> creates a PDB file which Microsoft's debuggers can use. This patch adds
> a -gcodeview option, which passes this to the linker.
>
> I do intend to expand this so it also creates the .debug$S and .debug$T
> sections which would make this useful - I submitted patches for this a
> while back, but they need to be rewritten to parse the DWARF DIEs rather
> than using debug_hooks.
>
> Clang also has -gcodeview, but AFAICS only uses it for .debug$S and
> .debug$T, and doesn't use it for linker options (though IMO it probably
> should).

That's true - in Clang, this option doesn't affect linking, it only 
affects code generation.

(FWIW, if I understand it correctly, Clang also does support generating 
both DWARF and CodeView at the same time - I think that would require 
passing something like "-g -gdwarf-4 -gcodeview" at the same time - but I 
don't have experience with playing with such setups.)

Another vague oddity in how this option is handled in Clang, is that if I 
only pass "-gcodeview" to the compiler, it doesn't actually generate any 
debug info (it just changes preference, in case I would request debug info 
separately), while one has to pass e.g. "-g -gcodeview" for it to do 
what's expected. I'm not sure if this is the same with dwarf, or if 
passing "-gdwarf-4" is enough for actually enabling generating dwarf debug 
info too. In any case, I don't think this aspect needs to be matched 
closely (unless dwarf does the same), as any existing users of PDB 
generation do use "-g -gcodeview", so as long as that case works, there 
shouldn't be any interop issues.

> ---
> gcc/common.opt      | 4 ++++
> gcc/doc/invoke.texi | 7 +++++++
> gcc/gcc.cc          | 4 ++++
> gcc/opts.cc         | 3 +++
> 4 files changed, 18 insertions(+)
>
> @@ -4608,6 +4608,10 @@ driver_handle_option (struct gcc_options *opts,
>       do_save = false;
>       break;
>
> +    case OPT_gcodeview:
> +      add_infile ("-pdb=", "*");
> +      break;

Hmm, what does this end up passing to the linker in the end - does it just 
pass "-pdb="? (What does the "*" parameter do here?) If that's the case - 
that sounds reasonable - assuming that if a user passes an extra 
-Wl,--pdb,myspecificname.pdb, that would take precedence (i.e. be passed 
after the compiler's default one).

// Martin
  
Mark Harmstone Oct. 24, 2022, 11:20 p.m. UTC | #2
On 24/10/22 12:08, Martin Storsjö wrote:
> Hmm, what does this end up passing to the linker in the end - does it just pass "-pdb="? (What does the "*" parameter do here?) If that's the case - that sounds reasonable - assuming that if a user passes an extra -Wl,--pdb,myspecificname.pdb, that would take precedence (i.e. be passed after the compiler's default one). 

That's right. The "*" means "all languages".

Mark
  
Martin Storsjö Oct. 25, 2022, 8:21 a.m. UTC | #3
On Tue, 25 Oct 2022, Mark Harmstone wrote:

> On 24/10/22 12:08, Martin Storsjö wrote:
>> Hmm, what does this end up passing to the linker in the end - does it just 
>> pass "-pdb="? (What does the "*" parameter do here?) If that's the case - 
>> that sounds reasonable - assuming that if a user passes an extra 
>> -Wl,--pdb,myspecificname.pdb, that would take precedence (i.e. be passed 
>> after the compiler's default one). 
>
> That's right. The "*" means "all languages".

Ok, great.

Btw, stylistically, should we strive towards using double dashes for the 
pdb option? I think that's the most canonical way for such getopt options 
(even though it doesn't make any practical difference). I've started 
trying to update various users to prefer that form (together with 
preferring -Wl,--pdb=<name> over -Wl,--pdb,<name>) and probably will send 
a few more.

// Martin
  
Mark Harmstone Oct. 27, 2022, 3:36 a.m. UTC | #4
On 25/10/22 09:21, Martin Storsjö wrote:
> Btw, stylistically, should we strive towards using double dashes for the pdb option? I think that's the most canonical way for such getopt options (even though it doesn't make any practical difference). I've started trying to update various users to prefer that form (together with preferring -Wl,--pdb=<name> over -Wl,--pdb,<name>) and probably will send a few more.
Thanks Martin. Yes, I agree.
  

Patch

diff --git a/gcc/common.opt b/gcc/common.opt
index 8a0dafc522d..77103f961d8 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -3253,6 +3253,10 @@  gas-locview-support
 Common Driver Var(dwarf2out_as_locview_support)
 Assume assembler support for view in (DWARF2+) .loc directives.
 
+gcodeview
+Common Driver JoinedOrMissing
+Generate debug information in CodeView format.
+
 gcoff
 Common Driver WarnRemoved
 Does nothing.  Preserved for backward compatibility.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index ff6c338bedb..2d29fd2611d 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -483,6 +483,7 @@  Objective-C and Objective-C++ Dialects}.
 -gstabs  -gstabs+  -gstrict-dwarf  -gno-strict-dwarf @gol
 -gas-loc-support  -gno-as-loc-support @gol
 -gas-locview-support  -gno-as-locview-support @gol
+-gcodeview @gol
 -gcolumn-info  -gno-column-info  -gdwarf32  -gdwarf64 @gol
 -gstatement-frontiers  -gno-statement-frontiers @gol
 -gvariable-location-views  -gno-variable-location-views @gol
@@ -10358,6 +10359,12 @@  assembler (GAS) to fail with an error.
 Produce debugging information in Alpha/VMS debug format (if that is
 supported).  This is the format used by DEBUG on Alpha/VMS systems.
 
+@item -gcodeview
+@opindex gcodeview
+Produce debugging information in CodeView debug format (if that is
+supported).  This is the format used by Microsoft Visual C++ on
+Windows.
+
 @item -g@var{level}
 @itemx -ggdb@var{level}
 @itemx -gstabs@var{level}
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index bb07cc244e3..2820f325282 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -4608,6 +4608,10 @@  driver_handle_option (struct gcc_options *opts,
       do_save = false;
       break;
 
+    case OPT_gcodeview:
+      add_infile ("-pdb=", "*");
+      break;
+
     default:
       /* Various driver options need no special processing at this
 	 point, having been handled in a prescan above or being
diff --git a/gcc/opts.cc b/gcc/opts.cc
index 3a89da2dd03..e2633ee5439 100644
--- a/gcc/opts.cc
+++ b/gcc/opts.cc
@@ -3089,6 +3089,9 @@  common_handle_option (struct gcc_options *opts,
       set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc);
       break;
 
+    case OPT_gcodeview:
+      break;
+
     case OPT_gstabs:
     case OPT_gstabs_:
       set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set,