r335081 - Recommit r335063: [Darwin] Add a warning for missing include path for libstdc++
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 7 05:40:57 PDT 2018
On Wed, Sep 5, 2018 at 9:25 PM Alex L <arphaman at gmail.com> wrote:
> Sorry for the late response,
>
> On Sat, 18 Aug 2018 at 20:10, Nico Weber <thakis at chromium.org> wrote:
>
>> Also, the diag text should probably say "pass '-stdlib=libc++' " not
>> "pass '-std=libc++' "?
>>
>
> Good catch, thanks! I'll commit a fixup for it.
>
>
>>
>> On Sat, Aug 18, 2018 at 11:06 PM Nico Weber <thakis at chromium.org> wrote:
>>
>>> Should this maybe not be emitted when compiling e.g. .ii files
>>> (preprocessed output)? I just got this when I built a standalone .ii file
>>> with some bug repro after I deleted all -I and -isysroot flags and whatnot,
>>> since they aren't needed for preprocessed files.
>>>
>>
> That would make sense, but I'm not sure how easy it is to determine if a
> file is already preprocessed. I'll try to create a patch for this fixup.
>
Probably you'd want something like
http://llvm-cs.pcc.me.uk/tools/clang/lib/Driver/Types.cpp#123 that returns
true for all (or most) of the TY_PP_ types, and then just rely
on lookupTypeForExtension.
>
>
>
>>
>>> On Tue, Jun 19, 2018 at 6:52 PM Alex Lorenz via cfe-commits <
>>> cfe-commits at lists.llvm.org> wrote:
>>>
>>>> Author: arphaman
>>>> Date: Tue Jun 19 15:47:53 2018
>>>> New Revision: 335081
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=335081&view=rev
>>>> Log:
>>>> Recommit r335063: [Darwin] Add a warning for missing include path for
>>>> libstdc++
>>>>
>>>> The recommit ensures that the tests that failed on bots don't trigger
>>>> the warning.
>>>>
>>>> Xcode 10 removes support for libstdc++, but the users just get a
>>>> confusing
>>>> include not file warning when including an STL header (when building
>>>> for iOS6
>>>> which uses libstdc++ by default for example).
>>>> This patch adds a new warning that lets the user know that the
>>>> libstdc++ include
>>>> path was not found to ensure that the user is more aware of why the
>>>> error occurs.
>>>>
>>>> rdar://40830462
>>>>
>>>> Differential Revision: https://reviews.llvm.org/D48297
>>>>
>>>> Added:
>>>> cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp
>>>> Modified:
>>>> cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>>>> cfe/trunk/include/clang/Lex/HeaderSearch.h
>>>> cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
>>>> cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp
>>>> cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp
>>>>
>>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=335081&r1=335080&r2=335081&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
>>>> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Tue Jun 19
>>>> 15:47:53 2018
>>>> @@ -236,4 +236,9 @@ def err_invalid_vfs_overlay : Error<
>>>>
>>>> def warn_option_invalid_ocl_version : Warning<
>>>> "OpenCL version %0 does not support the option '%1'">,
>>>> InGroup<Deprecated>;
>>>> +
>>>> +def warn_stdlibcxx_not_found : Warning<
>>>> + "include path for stdlibc++ headers not found; pass '-std=libc++' on
>>>> the "
>>>> + "command line to use the libc++ standard library instead">,
>>>> + InGroup<DiagGroup<"stdlibcxx-not-found">>;
>>>> }
>>>>
>>>> Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=335081&r1=335080&r2=335081&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
>>>> +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Tue Jun 19 15:47:53 2018
>>>> @@ -272,6 +272,8 @@ public:
>>>>
>>>> FileManager &getFileMgr() const { return FileMgr; }
>>>>
>>>> + DiagnosticsEngine &getDiags() const { return Diags; }
>>>> +
>>>> /// Interface for setting the file search paths.
>>>> void SetSearchPaths(const std::vector<DirectoryLookup> &dirs,
>>>> unsigned angledDirIdx, unsigned systemDirIdx,
>>>>
>>>> Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=335081&r1=335080&r2=335081&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original)
>>>> +++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Tue Jun 19 15:47:53 2018
>>>> @@ -14,6 +14,7 @@
>>>> #include "clang/Basic/FileManager.h"
>>>> #include "clang/Basic/LangOptions.h"
>>>> #include "clang/Config/config.h" // C_INCLUDE_DIRS
>>>> +#include "clang/Frontend/FrontendDiagnostic.h"
>>>> #include "clang/Frontend/Utils.h"
>>>> #include "clang/Lex/HeaderMap.h"
>>>> #include "clang/Lex/HeaderSearch.h"
>>>> @@ -55,11 +56,13 @@ public:
>>>>
>>>> /// AddPath - Add the specified path to the specified group list,
>>>> prefixing
>>>> /// the sysroot if used.
>>>> - void AddPath(const Twine &Path, IncludeDirGroup Group, bool
>>>> isFramework);
>>>> + /// Returns true if the path exists, false if it was ignored.
>>>> + bool AddPath(const Twine &Path, IncludeDirGroup Group, bool
>>>> isFramework);
>>>>
>>>> /// AddUnmappedPath - Add the specified path to the specified group
>>>> list,
>>>> /// without performing any sysroot remapping.
>>>> - void AddUnmappedPath(const Twine &Path, IncludeDirGroup Group,
>>>> + /// Returns true if the path exists, false if it was ignored.
>>>> + bool AddUnmappedPath(const Twine &Path, IncludeDirGroup Group,
>>>> bool isFramework);
>>>>
>>>> /// AddSystemHeaderPrefix - Add the specified prefix to the system
>>>> header
>>>> @@ -70,10 +73,9 @@ public:
>>>>
>>>> /// AddGnuCPlusPlusIncludePaths - Add the necessary paths to support
>>>> a gnu
>>>> /// libstdc++.
>>>> - void AddGnuCPlusPlusIncludePaths(StringRef Base,
>>>> - StringRef ArchDir,
>>>> - StringRef Dir32,
>>>> - StringRef Dir64,
>>>> + /// Returns true if the \p Base path was found, false if it does not
>>>> exist.
>>>> + bool AddGnuCPlusPlusIncludePaths(StringRef Base, StringRef ArchDir,
>>>> + StringRef Dir32, StringRef Dir64,
>>>> const llvm::Triple &triple);
>>>>
>>>> /// AddMinGWCPlusPlusIncludePaths - Add the necessary paths to
>>>> support a MinGW
>>>> @@ -88,7 +90,8 @@ public:
>>>>
>>>> // AddDefaultCPlusPlusIncludePaths - Add paths that should be
>>>> searched when
>>>> // compiling c++.
>>>> - void AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple,
>>>> + void AddDefaultCPlusPlusIncludePaths(const LangOptions &LangOpts,
>>>> + const llvm::Triple &triple,
>>>> const HeaderSearchOptions
>>>> &HSOpts);
>>>>
>>>> /// AddDefaultSystemIncludePaths - Adds the default system include
>>>> paths so
>>>> @@ -112,7 +115,7 @@ static bool CanPrefixSysroot(StringRef P
>>>> #endif
>>>> }
>>>>
>>>> -void InitHeaderSearch::AddPath(const Twine &Path, IncludeDirGroup
>>>> Group,
>>>> +bool InitHeaderSearch::AddPath(const Twine &Path, IncludeDirGroup
>>>> Group,
>>>> bool isFramework) {
>>>> // Add the path with sysroot prepended, if desired and this is a
>>>> system header
>>>> // group.
>>>> @@ -120,15 +123,14 @@ void InitHeaderSearch::AddPath(const Twi
>>>> SmallString<256> MappedPathStorage;
>>>> StringRef MappedPathStr = Path.toStringRef(MappedPathStorage);
>>>> if (CanPrefixSysroot(MappedPathStr)) {
>>>> - AddUnmappedPath(IncludeSysroot + Path, Group, isFramework);
>>>> - return;
>>>> + return AddUnmappedPath(IncludeSysroot + Path, Group,
>>>> isFramework);
>>>> }
>>>> }
>>>>
>>>> - AddUnmappedPath(Path, Group, isFramework);
>>>> + return AddUnmappedPath(Path, Group, isFramework);
>>>> }
>>>>
>>>> -void InitHeaderSearch::AddUnmappedPath(const Twine &Path,
>>>> IncludeDirGroup Group,
>>>> +bool InitHeaderSearch::AddUnmappedPath(const Twine &Path,
>>>> IncludeDirGroup Group,
>>>> bool isFramework) {
>>>> assert(!Path.isTriviallyEmpty() && "can't handle empty path here");
>>>>
>>>> @@ -150,7 +152,7 @@ void InitHeaderSearch::AddUnmappedPath(c
>>>> if (const DirectoryEntry *DE = FM.getDirectory(MappedPathStr)) {
>>>> IncludePath.push_back(
>>>> std::make_pair(Group, DirectoryLookup(DE, Type, isFramework)));
>>>> - return;
>>>> + return true;
>>>> }
>>>>
>>>> // Check to see if this is an apple-style headermap (which are not
>>>> allowed to
>>>> @@ -162,7 +164,7 @@ void InitHeaderSearch::AddUnmappedPath(c
>>>> IncludePath.push_back(
>>>> std::make_pair(Group,
>>>> DirectoryLookup(HM, Type, Group ==
>>>> IndexHeaderMap)));
>>>> - return;
>>>> + return true;
>>>> }
>>>> }
>>>> }
>>>> @@ -170,15 +172,16 @@ void InitHeaderSearch::AddUnmappedPath(c
>>>> if (Verbose)
>>>> llvm::errs() << "ignoring nonexistent directory \""
>>>> << MappedPathStr << "\"\n";
>>>> + return false;
>>>> }
>>>>
>>>> -void InitHeaderSearch::AddGnuCPlusPlusIncludePaths(StringRef Base,
>>>> +bool InitHeaderSearch::AddGnuCPlusPlusIncludePaths(StringRef Base,
>>>> StringRef ArchDir,
>>>> StringRef Dir32,
>>>> StringRef Dir64,
>>>> const llvm::Triple
>>>> &triple) {
>>>> // Add the base dir
>>>> - AddPath(Base, CXXSystem, false);
>>>> + bool IsBaseFound = AddPath(Base, CXXSystem, false);
>>>>
>>>> // Add the multilib dirs
>>>> llvm::Triple::ArchType arch = triple.getArch();
>>>> @@ -190,6 +193,7 @@ void InitHeaderSearch::AddGnuCPlusPlusIn
>>>>
>>>> // Add the backward dir
>>>> AddPath(Base + "/backward", CXXSystem, false);
>>>> + return IsBaseFound;
>>>> }
>>>>
>>>> void InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(StringRef Base,
>>>> @@ -354,46 +358,55 @@ void InitHeaderSearch::AddDefaultCInclud
>>>> }
>>>> }
>>>>
>>>> -void InitHeaderSearch::
>>>> -AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const
>>>> HeaderSearchOptions &HSOpts) {
>>>> +void InitHeaderSearch::AddDefaultCPlusPlusIncludePaths(
>>>> + const LangOptions &LangOpts, const llvm::Triple &triple,
>>>> + const HeaderSearchOptions &HSOpts) {
>>>> llvm::Triple::OSType os = triple.getOS();
>>>> // FIXME: temporary hack: hard-coded paths.
>>>>
>>>> if (triple.isOSDarwin()) {
>>>> + bool IsBaseFound = true;
>>>> switch (triple.getArch()) {
>>>> default: break;
>>>>
>>>> case llvm::Triple::ppc:
>>>> case llvm::Triple::ppc64:
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> - "powerpc-apple-darwin10", "",
>>>> "ppc64",
>>>> - triple);
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
>>>> - "powerpc-apple-darwin10", "",
>>>> "ppc64",
>>>> - triple);
>>>> + IsBaseFound =
>>>> AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> +
>>>> "powerpc-apple-darwin10", "",
>>>> + "ppc64", triple);
>>>> + IsBaseFound |=
>>>> AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
>>>> +
>>>> "powerpc-apple-darwin10", "",
>>>> + "ppc64", triple);
>>>> break;
>>>>
>>>> case llvm::Triple::x86:
>>>> case llvm::Triple::x86_64:
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> - "i686-apple-darwin10", "", "x86_64",
>>>> triple);
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
>>>> - "i686-apple-darwin8", "", "",
>>>> triple);
>>>> + IsBaseFound =
>>>> AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> + "i686-apple-darwin10",
>>>> "",
>>>> + "x86_64", triple);
>>>> + IsBaseFound |= AddGnuCPlusPlusIncludePaths(
>>>> + "/usr/include/c++/4.0.0", "i686-apple-darwin8", "", "",
>>>> triple);
>>>> break;
>>>>
>>>> case llvm::Triple::arm:
>>>> case llvm::Triple::thumb:
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> - "arm-apple-darwin10", "v7", "",
>>>> triple);
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> - "arm-apple-darwin10", "v6", "",
>>>> triple);
>>>> + IsBaseFound = AddGnuCPlusPlusIncludePaths(
>>>> + "/usr/include/c++/4.2.1", "arm-apple-darwin10", "v7", "",
>>>> triple);
>>>> + IsBaseFound |= AddGnuCPlusPlusIncludePaths(
>>>> + "/usr/include/c++/4.2.1", "arm-apple-darwin10", "v6", "",
>>>> triple);
>>>> break;
>>>>
>>>> case llvm::Triple::aarch64:
>>>> - AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
>>>> - "arm64-apple-darwin10", "", "",
>>>> triple);
>>>> + IsBaseFound = AddGnuCPlusPlusIncludePaths(
>>>> + "/usr/include/c++/4.2.1", "arm64-apple-darwin10", "", "",
>>>> triple);
>>>> break;
>>>> }
>>>> + // Warn when compiling pure C++ / Objective-C++ only.
>>>> + if (!IsBaseFound &&
>>>> + !(LangOpts.CUDA || LangOpts.OpenCL || LangOpts.RenderScript)) {
>>>> + Headers.getDiags().Report(SourceLocation(),
>>>> + diag::warn_stdlibcxx_not_found);
>>>> + }
>>>> return;
>>>> }
>>>>
>>>> @@ -478,7 +491,7 @@ void InitHeaderSearch::AddDefaultInclude
>>>> }
>>>> AddPath("/usr/include/c++/v1", CXXSystem, false);
>>>> } else {
>>>> - AddDefaultCPlusPlusIncludePaths(triple, HSOpts);
>>>> + AddDefaultCPlusPlusIncludePaths(Lang, triple, HSOpts);
>>>> }
>>>> }
>>>>
>>>>
>>>> Modified: cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp?rev=335081&r1=335080&r2=335081&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp (original)
>>>> +++ cfe/trunk/test/CodeGenCXX/apple-kext-guard-variable.cpp Tue Jun 19
>>>> 15:47:53 2018
>>>> @@ -1,4 +1,4 @@
>>>> -// RUN: %clang -target x86_64-apple-darwin10 -S -o %t.s -mkernel
>>>> -Xclang -verify %s
>>>> +// RUN: %clang -target x86_64-apple-darwin10 -S -o %t.s
>>>> -Wno-stdlibcxx-not-found -mkernel -Xclang -verify %s
>>>>
>>>> // rdar://problem/9143356
>>>>
>>>>
>>>> Added: cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp?rev=335081&view=auto
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp (added)
>>>> +++ cfe/trunk/test/Frontend/warning-stdlibcxx-darwin.cpp Tue Jun 19
>>>> 15:47:53 2018
>>>> @@ -0,0 +1,5 @@
>>>> +// RUN: %clang -cc1 -triple arm64-apple-ios6.0.0 -isysroot
>>>> %S/doesnotexist %s 2>&1 | FileCheck %s
>>>> +// RUN: %clang -cc1 -triple arm64-apple-ios6.0.0 -isysroot
>>>> %S/doesnotexist -stdlib=libc++ %s -verify
>>>> +// CHECK: include path for stdlibc++ headers not found; pass
>>>> '-std=libc++' on the command line to use the libc++ standard library instead
>>>> +
>>>> +// expected-no-diagnostics
>>>>
>>>> Modified: cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp?rev=335081&r1=335080&r2=335081&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp (original)
>>>> +++ cfe/trunk/test/Misc/backend-stack-frame-diagnostics.cpp Tue Jun 19
>>>> 15:47:53 2018
>>>> @@ -1,6 +1,6 @@
>>>> // REQUIRES: x86-registered-target
>>>> -// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks
>>>> -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s
>>>> -// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks
>>>> -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s -DIS_SYSHEADER
>>>> +// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks
>>>> -Wframe-larger-than=70 -Wno-stdlibcxx-not-found -Xclang -verify -o
>>>> /dev/null -c %s
>>>> +// RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks
>>>> -Wframe-larger-than=70 -Wno-stdlibcxx-not-found -Xclang -verify -o
>>>> /dev/null -c %s -DIS_SYSHEADER
>>>>
>>>> // Test that:
>>>> // * The driver passes the option through to the backend.
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180907/fe0d3dae/attachment-0001.html>
More information about the cfe-commits
mailing list