]> gcc.gnu.org Git - 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>
Mon, 18 Sep 2023 18:37:17 +0000 (19:37 +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.cc (DSYMUTIL_VERSION): New.
(darwin_override_options): Choose the default debug DWARF version
depending on the configured dsymutil version.

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

index 747745fa577478545d1d4a463029f7677f6d494c..9df358ee7d3b77087e1bd74efb792388c05efccf 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 154a2b2755a84d1fb8c34c36c634c35dd67ab6e2..d8c8607892b5e10e9e0cbbd5e5ed1b27891bdda8 100644 (file)
@@ -114,6 +114,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];
 
@@ -3357,14 +3370,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 (!OPTION_SET_P (dwarf_strict))
     dwarf_strict = 1;
+
   if (!OPTION_SET_P (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 (OPTION_SET_P (dwarf_split_debug_info))
+  if (OPTION_SET_P (dwarf_split_debug_info) && dwarf_split_debug_info)
     {
       inform (input_location,
              "%<-gsplit-dwarf%> is not supported on this platform, ignored");
This page took 0.06793 seconds and 5 git commands to generate.