Origami404 updated this revision to Diff 471865.
Origami404 added a comment.

I'm sorry that my patch can not pass the CI test, but I can not reproduce the CI
failure loaclly, including clang-format related problems. On my machine, 
`ninja check-clang` shows:

  [0/1] Running the Clang regression tests
  llvm-lit: 
/home/origami/llvm/llvm-project/llvm/utils/lit/lit/llvm/config.py:456: note: 
using clang: /home/origami/llvm/llvm-project/build-release/bin/clang
  
  Testing Time: 183.65s
    Skipped          :    35
    Unsupported      :  1681
    Passed           : 29839
    Expectedly Failed:    26

And `git clang-format HEAD~1` show:

  clang-format did not modify any files

I am on Fedora 36, with clang-format 14.0.5 and python 3.10.7. I guess the test
failure maybe lead to incorrect platform setting, so I change the new regression
test in this patch to only run on Linux now by adding `-target` triple.

I am not familiar with the LLVM pybindings, but I will be more than appreciative
if someone can tell me how to fix the CI failure.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137043/new/

https://reviews.llvm.org/D137043

Files:
  clang/include/clang/Driver/Options.td
  clang/include/clang/Lex/PreprocessorOptions.h
  clang/lib/Driver/Job.cpp
  clang/lib/Driver/ToolChains/Linux.cpp
  clang/lib/Driver/ToolChains/Linux.h
  clang/lib/Frontend/CompilerInvocation.cpp
  clang/lib/Frontend/InitPreprocessor.cpp
  clang/test/ClangScanDeps/Inputs/has_include_if_elif.json
  clang/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json
  clang/test/ClangScanDeps/Inputs/headerwithdirname.json
  clang/test/ClangScanDeps/Inputs/headerwithdirnamefollowedbyinclude.json
  clang/test/ClangScanDeps/Inputs/module_fmodule_name_cdb.json
  clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_a.json.template
  clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b.json.template
  clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_pch.json
  clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_tu.json
  clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_pch.json
  clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_tu.json
  clang/test/ClangScanDeps/Inputs/modules-pch/cdb_pch.json
  clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json
  clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu_with_common.json
  clang/test/ClangScanDeps/Inputs/modules_cdb.json
  clang/test/ClangScanDeps/Inputs/modules_inferred_cdb.json
  clang/test/ClangScanDeps/Inputs/no-werror.json
  clang/test/ClangScanDeps/Inputs/preprocess_minimized_pragmas_cdb.json
  clang/test/ClangScanDeps/Inputs/regular_cdb.json
  clang/test/ClangScanDeps/Inputs/relative_directory.json
  clang/test/ClangScanDeps/Inputs/static-analyzer-cdb.json
  clang/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
  clang/test/ClangScanDeps/Inputs/symlink_cdb.json
  clang/test/ClangScanDeps/Inputs/target-filename-cdb.json
  clang/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
  clang/test/ClangScanDeps/header-search-pruning-transitive.c
  clang/test/ClangScanDeps/modules-dep-args.c
  clang/test/ClangScanDeps/modules-header-sharing.m
  clang/test/ClangScanDeps/modules-implementation-module-map.c
  clang/test/ClangScanDeps/modules-implicit-dot-private.m
  clang/test/ClangScanDeps/modules-incomplete-umbrella.c
  clang/test/ClangScanDeps/modules-no-undeclared-includes.c
  clang/test/Driver/Inputs/stdc-predef/usr/include/stdc-predef.h
  clang/test/Driver/stdc-predef.c
  clang/test/Driver/stdc-predef.i
  clang/unittests/Tooling/TestVisitor.h
  clang/unittests/libclang/LibclangTest.cpp

Index: clang/unittests/libclang/LibclangTest.cpp
===================================================================
--- clang/unittests/libclang/LibclangTest.cpp
+++ clang/unittests/libclang/LibclangTest.cpp
@@ -366,8 +366,11 @@
     "printf(\"mmm!!\");\n"
     "#endif");
 
-  ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0,
-                                       nullptr, 0, TUFlags);
+  const char *argv[] = {"-ffreestanding"};
+  const int argc = sizeof(argv) / sizeof(*argv);
+
+  ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), argv, argc, nullptr,
+                                       0, TUFlags);
 
   CXSourceRangeList *Ranges = clang_getAllSkippedRanges(ClangTU);
   EXPECT_EQ(2U, Ranges->count);
@@ -607,6 +610,9 @@
     "printf(\"mmm!!\");\n"
     "#endif");
 
+  const char *argv[] = {"-ffreestanding"};
+  const int argc = sizeof(argv) / sizeof(*argv);
+
   for (int i = 0; i != 3; ++i) {
     unsigned flags = TUFlags | CXTranslationUnit_PrecompiledPreamble;
     if (i == 2)
@@ -616,7 +622,7 @@
        clang_disposeTranslationUnit(ClangTU);  // dispose from previous iter
 
     // parse once
-    ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0,
+    ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), argv, argc,
                                          nullptr, 0, flags);
     if (i != 0) {
       // reparse
Index: clang/unittests/Tooling/TestVisitor.h
===================================================================
--- clang/unittests/Tooling/TestVisitor.h
+++ clang/unittests/Tooling/TestVisitor.h
@@ -53,6 +53,7 @@
   /// \brief Runs the current AST visitor over the given code.
   bool runOver(StringRef Code, Language L = Lang_CXX) {
     std::vector<std::string> Args;
+    Args.push_back("-ffreestanding");
     switch (L) {
       case Lang_C:
         Args.push_back("-x");
Index: clang/test/Driver/stdc-predef.i
===================================================================
--- /dev/null
+++ clang/test/Driver/stdc-predef.i
@@ -0,0 +1,8 @@
+// The automatic preinclude of stdc-predef.h should not occur if
+// the source filename indicates a preprocessed file.
+//
+// RUN: %clang %s -### -c 2>&1 \
+// RUN: --sysroot=%S/Inputs/stdc-predef \
+// RUN: | FileCheck --implicit-check-not "stdc-predef.h" %s
+
+int i;
Index: clang/test/Driver/stdc-predef.c
===================================================================
--- /dev/null
+++ clang/test/Driver/stdc-predef.c
@@ -0,0 +1,25 @@
+// Test that clang preincludes stdc-predef.h, if the include file is available
+//
+// RUN: %clang %s -### -c 2>&1 \
+// RUN: --sysroot=%S/Inputs/stdc-predef -target x86_64-linux-gnu \
+// RUN: | FileCheck -check-prefix CHECK-PREDEF %s
+// RUN: %clang %s -### -c -ffreestanding 2>&1 \
+// RUN: --sysroot=%S/Inputs/stdc-predef -target x86_64-linux-gnu \
+// RUN: | FileCheck --implicit-check-not "stdc-predef.h" %s
+// RUN: %clang %s -c -E 2>&1 \
+// RUN: --sysroot=%S/Inputs/basic_linux_tree -target x86_64-linux-gnu \
+// RUN: | FileCheck --implicit-check-not "stdc-predef.h" %s
+// RUN: %clang -x cpp-output %s -### -c 2>&1 \
+// RUN: --sysroot=%S/Inputs/stdc-predef -target x86_64-linux-gnu \
+// RUN: | FileCheck --implicit-check-not "stdc-predef.h" %s
+// RUN: %clang -c %s -target x86_64-linux-gnu -Xclang -verify -DCHECK_DUMMY=1 \
+// RUN: --sysroot=%S/Inputs/stdc-predef 
+// expected-no-diagnostics
+
+// CHECK-PREDEF: "-fsystem-include-if-exists" "stdc-predef.h"
+int i;
+#if CHECK_DUMMY
+#if !DUMMY_STDC_PREDEF 
+  #error "Expected macro symbol DUMMY_STDC_PREDEF is not defined."
+#endif
+#endif
Index: clang/test/Driver/Inputs/stdc-predef/usr/include/stdc-predef.h
===================================================================
--- /dev/null
+++ clang/test/Driver/Inputs/stdc-predef/usr/include/stdc-predef.h
@@ -0,0 +1,4 @@
+#ifndef	_STDC_PREDEF_H
+#define	_STDC_PREDEF_H	1
+#define DUMMY_STDC_PREDEF 1
+#endif
Index: clang/test/ClangScanDeps/modules-no-undeclared-includes.c
===================================================================
--- clang/test/ClangScanDeps/modules-no-undeclared-includes.c
+++ clang/test/ClangScanDeps/modules-no-undeclared-includes.c
@@ -24,7 +24,7 @@
 //--- cdb.json.template
 [{
   "directory": "DIR",
-  "command": "clang -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -IDIR/undeclared -c DIR/test.c -o DIR/test.o",
+  "command": "clang -ffreestanding -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -IDIR/undeclared -c DIR/test.c -o DIR/test.o",
   "file": "DIR/test.c"
 }]
 
Index: clang/test/ClangScanDeps/modules-incomplete-umbrella.c
===================================================================
--- clang/test/ClangScanDeps/modules-incomplete-umbrella.c
+++ clang/test/ClangScanDeps/modules-incomplete-umbrella.c
@@ -26,7 +26,7 @@
 [{
   "file": "DIR/from_tu.m",
   "directory": "DIR",
-  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -iframework DIR/frameworks -c DIR/from_tu.m -o DIR/from_tu.o"
+  "command": "clang -ffreestanding -fmodules -fmodules-cache-path=DIR/cache -iframework DIR/frameworks -c DIR/from_tu.m -o DIR/from_tu.o"
 }]
 //--- from_tu.m
 #include "FW/FW.h"
Index: clang/test/ClangScanDeps/modules-implicit-dot-private.m
===================================================================
--- clang/test/ClangScanDeps/modules-implicit-dot-private.m
+++ clang/test/ClangScanDeps/modules-implicit-dot-private.m
@@ -15,7 +15,7 @@
 [{
   "file": "DIR/tu.m",
   "directory": "DIR",
-  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -iframework DIR/frameworks -c DIR/tu.m -o DIR/tu.o"
+  "command": "clang -ffreestanding -fmodules -fmodules-cache-path=DIR/cache -iframework DIR/frameworks -c DIR/tu.m -o DIR/tu.o"
 }]
 //--- tu.m
 @import FW.Private;
Index: clang/test/ClangScanDeps/modules-implementation-module-map.c
===================================================================
--- clang/test/ClangScanDeps/modules-implementation-module-map.c
+++ clang/test/ClangScanDeps/modules-implementation-module-map.c
@@ -5,7 +5,7 @@
 [{
   "file": "DIR/tu.m",
   "directory": "DIR",
-  "command": "clang -fmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -fmodule-name=FWPrivate -c DIR/tu.m -o DIR/tu.o -F DIR/frameworks -Wprivate-module"
+  "command": "clang -ffreestanding -fmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -fmodule-name=FWPrivate -c DIR/tu.m -o DIR/tu.o -F DIR/frameworks -Wprivate-module"
 }]
 
 //--- frameworks/FW.framework/Modules/module.modulemap
Index: clang/test/ClangScanDeps/modules-header-sharing.m
===================================================================
--- clang/test/ClangScanDeps/modules-header-sharing.m
+++ clang/test/ClangScanDeps/modules-header-sharing.m
@@ -55,7 +55,7 @@
 [{
   "file": "DIR/tu.m",
   "directory": "DIR",
-  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -fmodule-name=A -ivfsoverlay DIR/overlay.json -F DIR/frameworks -c DIR/tu.m -o DIR/tu.o"
+  "command": "clang -ffreestanding -fmodules -fmodules-cache-path=DIR/cache -fmodule-name=A -ivfsoverlay DIR/overlay.json -F DIR/frameworks -c DIR/tu.m -o DIR/tu.o"
 }]
 
 //--- tu.m
Index: clang/test/ClangScanDeps/modules-dep-args.c
===================================================================
--- clang/test/ClangScanDeps/modules-dep-args.c
+++ clang/test/ClangScanDeps/modules-dep-args.c
@@ -8,7 +8,7 @@
 [{
   "file": "DIR/tu.c",
   "directory": "DIR",
-  "command": "clang DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -o DIR/tu.o"
+  "command": "clang DIR/tu.c -ffreestanding -fmodules -fmodules-cache-path=DIR/cache -o DIR/tu.o"
 }]
 
 //--- module.modulemap
Index: clang/test/ClangScanDeps/header-search-pruning-transitive.c
===================================================================
--- clang/test/ClangScanDeps/header-search-pruning-transitive.c
+++ clang/test/ClangScanDeps/header-search-pruning-transitive.c
@@ -41,14 +41,14 @@
 [{
   "file": "DIR/test.c",
   "directory": "DIR",
-  "command": "clang -fsyntax-only test.c -fmodules -fimplicit-modules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -Ibegin -Ia -Ib -Iend"
+  "command": "clang -fsyntax-only test.c -ffreestanding -fmodules -fimplicit-modules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -Ibegin -Ia -Ib -Iend"
 }]
 
 //--- cdb_without_a.json.template
 [{
   "file": "DIR/test.c",
   "directory": "DIR",
-  "command": "clang -fsyntax-only test.c -fmodules -fimplicit-modules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -Ibegin     -Ib -Iend"
+  "command": "clang -fsyntax-only test.c -ffreestanding -fmodules -fimplicit-modules -fmodules-cache-path=DIR/module-cache -fimplicit-module-maps -Ibegin     -Ib -Iend"
 }]
 
 // RUN: sed -e "s|DIR|%/t|g" %t/cdb_with_a.json.template    > %t/cdb_with_a.json
Index: clang/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
+++ clang/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/vfsoverlay_input.cpp -IInputs -ivfsoverlay DIR/vfsoverlay.yaml",
+  "command": "clang -E DIR/vfsoverlay_input.cpp -IInputs -ivfsoverlay DIR/vfsoverlay.yaml -ffreestanding",
   "file": "DIR/vfsoverlay_input.cpp"
 },
 {
Index: clang/test/ClangScanDeps/Inputs/target-filename-cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/target-filename-cdb.json
+++ clang/test/ClangScanDeps/Inputs/target-filename-cdb.json
@@ -1,22 +1,22 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/target-filename_input.cpp",
+  "command": "clang -E DIR/target-filename_input.cpp -ffreestanding",
   "file": "DIR/target-filename_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/target-filename_input.cpp -o a.o",
+  "command": "clang -E DIR/target-filename_input.cpp -o a.o -ffreestanding",
   "file": "DIR/target-filename_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/target-filename_input.cpp -ob.o",
+  "command": "clang -E DIR/target-filename_input.cpp -ob.o -ffreestanding",
   "file": "DIR/target-filename_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/target-filename_input.cpp -o first.o -o last.o",
+  "command": "clang -E DIR/target-filename_input.cpp -o first.o -o last.o -ffreestanding",
   "file": "DIR/target-filename_input.cpp"
 },
 {
Index: clang/test/ClangScanDeps/Inputs/symlink_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/symlink_cdb.json
+++ clang/test/ClangScanDeps/Inputs/symlink_cdb.json
@@ -1,12 +1,12 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/symlink_input.cpp -IInputs",
+  "command": "clang -E DIR/symlink_input.cpp -IInputs -ffreestanding",
   "file": "DIR/symlink_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/symlink_input2.cpp -IInputs",
+  "command": "clang -E DIR/symlink_input2.cpp -IInputs -ffreestanding",
   "file": "DIR/symlink_input2.cpp"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
+++ clang/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
@@ -1,12 +1,12 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/subframework_header_dir_symlink_input.m -D EMPTY -iframework Inputs/frameworks",
+  "command": "clang -E DIR/subframework_header_dir_symlink_input.m -D EMPTY -iframework Inputs/frameworks -ffreestanding",
   "file": "DIR/subframework_header_dir_symlink_input.m"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/subframework_header_dir_symlink_input2.m -FInputs/frameworks -iframework Inputs/frameworks_symlink/../frameworks_symlink",
+  "command": "clang -E DIR/subframework_header_dir_symlink_input2.m -FInputs/frameworks -iframework Inputs/frameworks_symlink/../frameworks_symlink -ffreestanding",
   "file": "DIR/subframework_header_dir_symlink_input2.m"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/static-analyzer-cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/static-analyzer-cdb.json
+++ clang/test/ClangScanDeps/Inputs/static-analyzer-cdb.json
@@ -1,12 +1,12 @@
 [
 {
   "directory": "DIR",
-  "command": "clang --analyze DIR/static-analyzer_clang.c",
+  "command": "clang --analyze DIR/static-analyzer_clang.c -ffreestanding",
   "file": "DIR/static-analyzer_clang.c"
 },
 {
   "directory": "DIR",
-  "command": "clang-cl --analyze -- DIR/static-analyzer_clangcl.c",
+  "command": "clang-cl --analyze -- DIR/static-analyzer_clangcl.c -ffreestanding",
   "file": "DIR/static-analyzer_clangcl.c"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/relative_directory.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/relative_directory.json
+++ clang/test/ClangScanDeps/Inputs/relative_directory.json
@@ -1,12 +1,12 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E Inputs/relative_directory_input1.cpp -IInputs",
+  "command": "clang -E Inputs/relative_directory_input1.cpp -IInputs -ffreestanding",
   "file": "DIR/Inputs/relative_directory_input1.cpp"
 },
 {
   "directory": "DIR/Inputs",
-  "command": "clang -E relative_directory_input2.cpp -I.",
+  "command": "clang -E relative_directory_input2.cpp -I. -ffreestanding",
   "file": "DIR/Inputs/relative_directory_input2.cpp"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/regular_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/regular_cdb.json
+++ clang/test/ClangScanDeps/Inputs/regular_cdb.json
@@ -1,17 +1,17 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E -fsyntax-only DIR/regular_cdb_input2.cpp -IInputs -D INCLUDE_HEADER2 -MD -MF DIR/regular_cdb2.d",
+  "command": "clang -E -ffreestanding -fsyntax-only DIR/regular_cdb_input2.cpp -IInputs -D INCLUDE_HEADER2 -MD -MF DIR/regular_cdb2.d",
   "file": "DIR/regular_cdb_input2.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/regular_cdb_input.cpp -IInputs",
+  "command": "clang -ffreestanding -E DIR/regular_cdb_input.cpp -IInputs",
   "file": "DIR/regular_cdb_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E -IInputs -o adena.o -- DIR/regular_cdb_input.cpp",
+  "command": "clang -ffreestanding -E -IInputs -o adena.o -- DIR/regular_cdb_input.cpp",
   "file": "DIR/regular_cdb_input.cpp"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/preprocess_minimized_pragmas_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/preprocess_minimized_pragmas_cdb.json
+++ clang/test/ClangScanDeps/Inputs/preprocess_minimized_pragmas_cdb.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/preprocess_minimized_pragmas_basic.cpp -IInputs -target x86_64-linux",
+  "command": "clang -E DIR/preprocess_minimized_pragmas_basic.cpp -IInputs -target x86_64-linux -ffreestanding",
   "file": "DIR/preprocess_minimized_pragmas_basic.cpp"
 },
 {
Index: clang/test/ClangScanDeps/Inputs/no-werror.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/no-werror.json
+++ clang/test/ClangScanDeps/Inputs/no-werror.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/no-werror_input.cpp -IInputs -std=c++17 -Weverything -Werror",
+  "command": "clang -E DIR/no-werror_input.cpp -IInputs -std=c++17 -Weverything -Werror -ffreestanding",
   "file": "DIR/no-werror.cpp"
 },
 {
Index: clang/test/ClangScanDeps/Inputs/modules_inferred_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules_inferred_cdb.json
+++ clang/test/ClangScanDeps/Inputs/modules_inferred_cdb.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/modules_cdb_input.cpp -FFRAMEWORKS -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -pedantic -Werror",
+  "command": "clang -E DIR/modules_cdb_input.cpp -FFRAMEWORKS -ffreestanding -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -pedantic -Werror",
   "file": "DIR/modules_cdb_input.cpp"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules_cdb.json
+++ clang/test/ClangScanDeps/Inputs/modules_cdb.json
@@ -1,22 +1,22 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/modules_cdb_input2.cpp -IInputs -D INCLUDE_HEADER2 -MD -MF DIR/modules_cdb2.d -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps",
+  "command": "clang -E DIR/modules_cdb_input2.cpp -IInputs -D INCLUDE_HEADER2 -MD -MF DIR/modules_cdb2.d -ffreestanding -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps",
   "file": "DIR/modules_cdb_input2.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/modules_cdb_input.cpp -IInputs -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps",
+  "command": "clang -E DIR/modules_cdb_input.cpp -IInputs -ffreestanding -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps",
   "file": "DIR/modules_cdb_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/modules_cdb_input.cpp -IInputs -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -o a.o",
+  "command": "clang -E DIR/modules_cdb_input.cpp -IInputs -ffreestanding -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -o a.o",
   "file": "DIR/modules_cdb_input.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/modules_cdb_input.cpp -IInputs -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -o b.o",
+  "command": "clang -E DIR/modules_cdb_input.cpp -IInputs -ffreestanding -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fimplicit-module-maps -o b.o",
   "file": "DIR/modules_cdb_input.cpp"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu_with_common.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu_with_common.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu_with_common.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -fsyntax-only DIR/tu_with_common.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu_with_common.o",
+    "command": "clang -ffreestanding -fsyntax-only DIR/tu_with_common.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu_with_common.o",
     "file": "DIR/tu_with_common.c"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o",
+    "command": "clang -ffreestanding -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o",
     "file": "DIR/tu.c"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch/cdb_pch.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch/cdb_pch.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch/cdb_pch.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -x c-header DIR/pch.h -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch",
+    "command": "clang -x c-header DIR/pch.h -ffreestanding -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch",
     "file": "DIR/pch.h"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_tu.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_tu.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_tu.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o",
+    "command": "clang -ffreestanding -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o",
     "file": "DIR/tu.c"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_pch.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_pch.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch-common-via-submodule/cdb_pch.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -x c-header DIR/pch.h -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch",
+    "command": "clang -x c-header DIR/pch.h -ffreestanding -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch",
     "file": "DIR/pch.h"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_tu.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_tu.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_tu.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o",
+    "command": "clang -ffreestanding -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o",
     "file": "DIR/tu.c"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_pch.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_pch.json
+++ clang/test/ClangScanDeps/Inputs/modules-pch-common-submodule/cdb_pch.json
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -x c-header DIR/pch.h -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch",
+    "command": "clang -x c-header DIR/pch.h -ffreestanding -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -o DIR/pch.h.gch",
     "file": "DIR/pch.h"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b.json.template
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b.json.template
+++ clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_b.json.template
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -IDIR/b -o DIR/tu_b.o",
+    "command": "clang -c DIR/tu.c -ffreestanding -fmodules -fmodules-cache-path=DIR/cache -IDIR/b -o DIR/tu_b.o",
     "file": "DIR/tu.c"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_a.json.template
===================================================================
--- clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_a.json.template
+++ clang/test/ClangScanDeps/Inputs/modules-context-hash/cdb_a.json.template
@@ -1,7 +1,7 @@
 [
   {
     "directory": "DIR",
-    "command": "clang -c DIR/tu.c -fmodules -fmodules-cache-path=DIR/cache -IDIR/a -o DIR/tu_a.o",
+    "command": "clang -c DIR/tu.c -ffreestanding -fmodules -fmodules-cache-path=DIR/cache -IDIR/a -o DIR/tu_a.o",
     "file": "DIR/tu.c"
   }
 ]
Index: clang/test/ClangScanDeps/Inputs/module_fmodule_name_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/module_fmodule_name_cdb.json
+++ clang/test/ClangScanDeps/Inputs/module_fmodule_name_cdb.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/modules-fmodule-name-no-module-built.m -IInputs -D INCLUDE_HEADER2 -MD -MF DIR/modules_cdb.d -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fmodule-name=header3 -fimplicit-module-maps",
+  "command": "clang -E DIR/modules-fmodule-name-no-module-built.m -IInputs -D INCLUDE_HEADER2 -MD -MF DIR/modules_cdb.d -ffreestanding -fmodules -fcxx-modules -fmodules-cache-path=DIR/module-cache -fimplicit-modules -fmodule-name=header3 -fimplicit-module-maps",
   "file": "DIR/modules-fmodule-name-no-module-built.m"
 }
 ]
Index: clang/test/ClangScanDeps/Inputs/headerwithdirnamefollowedbyinclude.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/headerwithdirnamefollowedbyinclude.json
+++ clang/test/ClangScanDeps/Inputs/headerwithdirnamefollowedbyinclude.json
@@ -1,7 +1,7 @@
 [
     {
       "directory": "DIR",
-      "command": "clang -c -IDIR -IInputs DIR/headerwithdirname_input.cpp",
+      "command": "clang -c -IDIR -IInputs DIR/headerwithdirname_input.cpp -ffreestanding",
       "file": "DIR/headerwithdirname_input.cpp"
     },
     {
Index: clang/test/ClangScanDeps/Inputs/headerwithdirname.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/headerwithdirname.json
+++ clang/test/ClangScanDeps/Inputs/headerwithdirname.json
@@ -1,7 +1,7 @@
 [
     {
       "directory": "DIR",
-      "command": "clang -c -IDIR -IDIR/foodir -IInputs DIR/headerwithdirname_input.cpp",
+      "command": "clang -c -IDIR -IDIR/foodir -IInputs DIR/headerwithdirname_input.cpp -ffreestanding",
       "file": "DIR/headerwithdirname_input.cpp"
     },
     {
Index: clang/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json
+++ clang/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/header_stat_before_open_input.m -iframework Inputs/frameworks",
+  "command": "clang -E DIR/header_stat_before_open_input.m -ffreestanding -iframework Inputs/frameworks",
   "file": "DIR/header_stat_before_open_input.m"
 },
 {
Index: clang/test/ClangScanDeps/Inputs/has_include_if_elif.json
===================================================================
--- clang/test/ClangScanDeps/Inputs/has_include_if_elif.json
+++ clang/test/ClangScanDeps/Inputs/has_include_if_elif.json
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/has_include_if_elif2.cpp -IInputs",
+  "command": "clang -ffreestanding -E DIR/has_include_if_elif2.cpp -IInputs",
   "file": "DIR/has_include_if_elif2.cpp"
 },
 {
Index: clang/lib/Frontend/InitPreprocessor.cpp
===================================================================
--- clang/lib/Frontend/InitPreprocessor.cpp
+++ clang/lib/Frontend/InitPreprocessor.cpp
@@ -71,6 +71,15 @@
   Builder.append(Twine("#include \"") + File + "\"");
 }
 
+/// AddImplicitSystemIncludeIfExists - Add an implicit system \#include of the
+/// specified file to the predefines buffer: precheck with __has_include.
+static void AddImplicitSystemIncludeIfExists(MacroBuilder &Builder,
+                                             StringRef File) {
+  Builder.append(Twine("#if __has_include( <") + File + ">)");
+  Builder.append(Twine("#include <") + File + ">");
+  Builder.append(Twine("#endif"));
+}
+
 static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) {
   Builder.append(Twine("#__include_macros \"") + File + "\"");
   // Marker token to stop the __include_macros fetch loop.
@@ -1374,6 +1383,15 @@
   if (!PP.getLangOpts().AsmPreprocessor)
     Builder.append("# 1 \"<built-in>\" 2");
 
+  // Process -fsystem-include-if-exists directives
+  if (!PP.getLangOpts().ObjC) {
+    for (unsigned i = 0, e = InitOpts.FSystemIncludeIfExists.size(); i != e;
+         ++i) {
+      const std::string &Path = InitOpts.FSystemIncludeIfExists[i];
+      AddImplicitSystemIncludeIfExists(Builder, Path);
+    }
+  }
+
   // If -imacros are specified, include them now.  These are processed before
   // any -include directives.
   for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i)
Index: clang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- clang/lib/Frontend/CompilerInvocation.cpp
+++ clang/lib/Frontend/CompilerInvocation.cpp
@@ -4224,6 +4224,9 @@
   for (const auto &CI : Opts.ChainedIncludes)
     GenerateArg(Args, OPT_chain_include, CI, SA);
 
+  for (const auto &FI : Opts.FSystemIncludeIfExists)
+    GenerateArg(Args, OPT_fsystem_include_if_exists, FI, SA);
+
   for (const auto &RF : Opts.RemappedFiles)
     GenerateArg(Args, OPT_remap_file, RF.first + ";" + RF.second, SA);
 
@@ -4301,6 +4304,10 @@
   for (const auto *A : Args.filtered(OPT_chain_include))
     Opts.ChainedIncludes.emplace_back(A->getValue());
 
+  // Add the ordered list of -fsystem-include-if-exists.
+  for (const Arg *A : Args.filtered(OPT_fsystem_include_if_exists))
+    Opts.FSystemIncludeIfExists.emplace_back(A->getValue());
+
   for (const auto *A : Args.filtered(OPT_remap_file)) {
     std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(';');
 
Index: clang/lib/Driver/ToolChains/Linux.h
===================================================================
--- clang/lib/Driver/ToolChains/Linux.h
+++ clang/lib/Driver/ToolChains/Linux.h
@@ -33,6 +33,8 @@
   void addLibStdCxxIncludePaths(
       const llvm::opt::ArgList &DriverArgs,
       llvm::opt::ArgStringList &CC1Args) const override;
+  void AddGnuIncludeArgs(const llvm::opt::ArgList &DriverArgs,
+                         llvm::opt::ArgStringList &CC1Args) const;
   void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                           llvm::opt::ArgStringList &CC1Args) const override;
   void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,
Index: clang/lib/Driver/ToolChains/Linux.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -632,10 +632,22 @@
 
   addExternCSystemInclude(DriverArgs, CC1Args, concat(SysRoot, "/usr/include"));
 
+  AddGnuIncludeArgs(DriverArgs, CC1Args);
+
   if (!DriverArgs.hasArg(options::OPT_nobuiltininc) && getTriple().isMusl())
     addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
 }
 
+void Linux::AddGnuIncludeArgs(const llvm::opt::ArgList &DriverArgs,
+                              llvm::opt::ArgStringList &CC1Args) const {
+  if (!DriverArgs.hasArg(options::OPT_ffreestanding)) {
+    // For gcc compatibility, clang will preinclude <stdc-predef.h>
+    // -ffreestanding suppresses this behavior.
+    CC1Args.push_back("-fsystem-include-if-exists");
+    CC1Args.push_back("stdc-predef.h");
+  }
+}
+
 void Linux::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
                                      llvm::opt::ArgStringList &CC1Args) const {
   // We need a detected GCC installation on Linux to provide libstdc++'s
Index: clang/lib/Driver/Job.cpp
===================================================================
--- clang/lib/Driver/Job.cpp
+++ clang/lib/Driver/Job.cpp
@@ -67,14 +67,16 @@
     return true;
 
   // Some include flags shouldn't be skipped if we have a crash VFS
-  IsInclude = llvm::StringSwitch<bool>(Flag)
-    .Cases("-include", "-header-include-file", true)
-    .Cases("-idirafter", "-internal-isystem", "-iwithprefix", true)
-    .Cases("-internal-externc-isystem", "-iprefix", true)
-    .Cases("-iwithprefixbefore", "-isystem", "-iquote", true)
-    .Cases("-isysroot", "-I", "-F", "-resource-dir", true)
-    .Cases("-iframework", "-include-pch", true)
-    .Default(false);
+  IsInclude =
+      llvm::StringSwitch<bool>(Flag)
+          .Cases("-include", "-header-include-file", true)
+          .Cases("-idirafter", "-internal-isystem", "-iwithprefix", true)
+          .Cases("-internal-externc-isystem", "-iprefix", true)
+          .Cases("-iwithprefixbefore", "-isystem", "-iquote", true)
+          .Cases("-isysroot", "-I", "-F", "-resource-dir", true)
+          .Cases("-iframework", "-include-pch", "-fsystem-include-if-exists",
+                 true)
+          .Default(false);
   if (IsInclude)
     return !HaveCrashVFS;
 
Index: clang/include/clang/Lex/PreprocessorOptions.h
===================================================================
--- clang/include/clang/Lex/PreprocessorOptions.h
+++ clang/include/clang/Lex/PreprocessorOptions.h
@@ -99,6 +99,9 @@
   /// Headers that will be converted to chained PCHs in memory.
   std::vector<std::string> ChainedIncludes;
 
+  /// System Headers that are pre-included if they exist.
+  std::vector<std::string> FSystemIncludeIfExists;
+
   /// Whether to disable most of the normal validation performed on
   /// precompiled headers and module files.
   DisableValidationForModuleKind DisablePCHOrModuleValidation =
@@ -254,6 +257,7 @@
     ChainedIncludes.clear();
     DumpDeserializedPCHDecls = false;
     ImplicitPCHInclude.clear();
+    FSystemIncludeIfExists.clear();
     SingleFileParseMode = false;
     LexEditorPlaceholders = true;
     RetainRemappedFileBuffers = true;
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -6315,6 +6315,8 @@
 def source_date_epoch : Separate<["-"], "source-date-epoch">,
   MetaVarName<"<time since Epoch in seconds>">,
   HelpText<"Time to be used in __DATE__, __TIME__, and __TIMESTAMP__ macros">;
+def fsystem_include_if_exists : Separate<["-"], "fsystem-include-if-exists">, MetaVarName<"<file>">,
+  HelpText<"Include system file before parsing if file exists">;
 
 } // let Flags = [CC1Option, NoDriverOption]
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to