From 5c086c7626fab2617c0178a3951378bcbce2271c Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Mon, 20 Nov 2017 17:57:42 +0000 Subject: For Linux/gnu compatibility, preinclude if the file is available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As reported in llvm bugzilla 32377. Here’s a patch to add preinclude of stdc-predef.h. The gcc documentation says “On GNU/Linux, is pre-included.” See https://gcc.gnu.org/gcc-4.8/porting_to.html; The preinclude is inhibited with –ffreestanding. Basically I fixed the failing test cases by adding –ffreestanding which inhibits this behavior. I fixed all the failing tests, including some in extra/test, there's a separate patch for that which is linked here Patch By: mibintc Differential Revision: https://reviews.llvm.org/D34158 llvm-svn: 318669 --- clang/lib/Frontend/InitPreprocessor.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'clang/lib/Frontend/InitPreprocessor.cpp') diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 1dfbf18..6980706a 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -70,6 +70,15 @@ static void AddImplicitInclude(MacroBuilder &Builder, StringRef File) { 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. @@ -1110,6 +1119,13 @@ void clang::InitializePreprocessor( // Exit the command line and go back to (2 is LC_LEAVE). if (!PP.getLangOpts().AsmPreprocessor) Builder.append("# 1 \"\" 2"); + + // Process -fsystem-include-if-exists directives. + 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. -- cgit v1.1