]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Darwin,debug : Switch to DWARF 3 or 4 when dsymutil supports it.
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 17 Sep 2023 14:56:07 +0000 (15:56 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Thu, 25 Apr 2024 19:23:00 +0000 (20:23 +0100)
The main reason that Darwin has been using DWARF2 only as debug is that
earlier debug linkers (dsymutil) did not support any extensions to this
so that the default "non-strict" mode used in GCC would cause tool errors.

There are two sources for dsymutil, those based off a closed source base
"dwarfutils" and those based off LLVM.

For dsymutil versions based off LLVM-7+ we can use up to DWARF-4, and for
versions based on dwarfutils 121+ we can use DWARF-3.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin-protos.h (enum darwin_external_toolchain): New.
* config/darwin.c (DSYMUTIL_VERSION): New.
(darwin_override_options): Choose the default debug DWARF version
depending on the configured dsymutil version.

(cherry picked from commit 47346acb72b50d178dae72393c851d57beec383f)

gcc/config/darwin-protos.h
gcc/config/darwin.c

index f5ef82456aa067be1e5b89b32ee60dc4322db616..440e76ead421337d3a57988f28d97eae65a1ea8e 100644 (file)
@@ -129,4 +129,15 @@ extern void darwin_patch_builtins (void);
 extern void darwin_rename_builtins (void);
 extern bool darwin_libc_has_function (enum function_class fn_class, tree);
 
+/* For this port, there are several possible sources for external toolchain
+   components (e.g. as, ld, dsymutil) and we have to alter the allowable
+   output in response to which version and source is in use.  */
+enum darwin_external_toolchain {
+  DET_UNKNOWN=0,
+  CCTOOLS,
+  DWARFUTILS,
+  LLVM,
+  CLANG
+};
+
 #endif /* CONFIG_DARWIN_PROTOS_H */
index db0e80889ab5af9d1a7b9d32579dcb620300b64a..e01460a996f7907878779bcc5ed3b5157c8ee938 100644 (file)
@@ -111,6 +111,19 @@ static bool ld_needs_eh_markers = false;
 /* Emit a section-start symbol for mod init and term sections.  */
 static bool ld_init_term_start_labels = false;
 
+/* The source and version of dsymutil in use.  */
+#ifndef DSYMUTIL_VERSION
+# warning Darwin toolchain without a defined dsymutil.
+# define DSYMUTIL_VERSION DET_UNKNOWN,0,0,0
+#endif
+
+struct {
+  darwin_external_toolchain kind; /* cctools, llvm, clang etc.  */
+  int major; /* version number.  */
+  int minor;
+  int tiny;
+} dsymutil_version = {DSYMUTIL_VERSION};
+
 /* Section names.  */
 section * darwin_sections[NUM_DARWIN_SECTIONS];
 
@@ -3316,14 +3329,26 @@ darwin_override_options (void)
                  global_options.x_flag_objc_abi);
     }
 
-  /* Don't emit DWARF3/4 unless specifically selected.  This is a
-     workaround for tool bugs.  */
+  /* Limit DWARF to the chosen version, the linker and debug linker might not
+     be able to consume newer structures.  */
   if (!global_options_set.x_dwarf_strict)
     dwarf_strict = 1;
+
   if (!global_options_set.x_dwarf_version)
-    dwarf_version = 2;
+    {
+      /* External toolchains based on LLVM or clang 7+ have support for
+        dwarf-4.  */
+      if ((dsymutil_version.kind == LLVM && dsymutil_version.major >= 7)
+         || (dsymutil_version.kind == CLANG && dsymutil_version.major >= 7))
+       dwarf_version = 4;
+      else if (dsymutil_version.kind == DWARFUTILS
+              && dsymutil_version.major >= 121)
+       dwarf_version = 3;  /* From XC 6.4.  */
+      else
+       dwarf_version = 2;  /* Older cannot safely exceed dwarf-2.  */
+    }
 
-  if (global_options_set.x_dwarf_split_debug_info)
+  if (global_options_set.x_dwarf_split_debug_info && dwarf_split_debug_info)
     {
       inform (input_location,
              "%<-gsplit-dwarf%> is not supported on this platform, ignored");