[clang] [clang] Do not pass -canonical-system-headers on Windows by default (PR #71097)

Arthur Eubanks via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 2 13:03:02 PDT 2023


https://github.com/aeubanks created https://github.com/llvm/llvm-project/pull/71097

Canonicalizing paths on Windows leads to unexpected things like changing
drive letters. As a short term fix, do not canonicalize system headers
on Windows by default.

Fixes #70011


>From 3d519b42c350417727570ad405201cff6f1fb186 Mon Sep 17 00:00:00 2001
From: Arthur Eubanks <aeubanks at google.com>
Date: Thu, 2 Nov 2023 13:00:33 -0700
Subject: [PATCH] [clang] Do not pass -canonical-system-headers on Windows by
 default

Canonicalizing paths on Windows leads to unexpected things like changing
drive letters. As a short term fix, do not canonicalize system headers
on Windows by default.

Fixes #70011
---
 clang/lib/Driver/ToolChains/Clang.cpp            | 13 ++++++++++++-
 clang/test/Driver/canonical-system-headers-win.c |  9 +++++++++
 clang/test/Driver/canonical-system-headers.c     |  3 +++
 3 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Driver/canonical-system-headers-win.c

diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 79f7fba22570746..b94728f79e0a175 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1180,8 +1180,19 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
     if (ArgM->getOption().matches(options::OPT_M) ||
         ArgM->getOption().matches(options::OPT_MD))
       CmdArgs.push_back("-sys-header-deps");
+
+      // #70011: Canonicalization on Windows does unexpected things like change
+      // drive letters.
+      // FIXME: find and use Windows API that canonicalizes paths except for
+      // drive letter.
+#if defined(_WIN32) || defined(_WIN64)
+    bool CanonicalSystemHeadersDefault = false;
+#else
+    bool CanonicalSystemHeadersDefault = true;
+#endif
     if (Args.hasFlag(options::OPT_canonical_prefixes,
-                     options::OPT_no_canonical_prefixes, true))
+                     options::OPT_no_canonical_prefixes,
+                     CanonicalSystemHeadersDefault))
       CmdArgs.push_back("-canonical-system-headers");
     if ((isa<PrecompileJobAction>(JA) &&
          !Args.hasArg(options::OPT_fno_module_file_deps)) ||
diff --git a/clang/test/Driver/canonical-system-headers-win.c b/clang/test/Driver/canonical-system-headers-win.c
new file mode 100644
index 000000000000000..cc3ec57ff4de614
--- /dev/null
+++ b/clang/test/Driver/canonical-system-headers-win.c
@@ -0,0 +1,9 @@
+// REQUIRES: system-windows
+// The default on Windows is false due to #70011.
+
+// RUN: %clang -MD -no-canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO
+// RUN: %clang -MD -canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-YES
+// RUN: %clang -MD -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO
+
+// CHECK-YES: "-canonical-system-headers"
+// CHECK-NO-NOT: "-canonical-system-headers"
diff --git a/clang/test/Driver/canonical-system-headers.c b/clang/test/Driver/canonical-system-headers.c
index a7ab57521fc2249..d37b5925c73035d 100644
--- a/clang/test/Driver/canonical-system-headers.c
+++ b/clang/test/Driver/canonical-system-headers.c
@@ -1,3 +1,6 @@
+// REQUIRES: !system-windows
+// The default on Windows is false due to #70011.
+
 // RUN: %clang -MD -no-canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO
 // RUN: %clang -MD -canonical-prefixes -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-YES
 // RUN: %clang -MD -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-YES



More information about the cfe-commits mailing list