Commit Graph

142 Commits

Author SHA1 Message Date
Richard Smith 6e03dd94ce [modules] Simplify -cc1 interface for enabling implicit module maps.
We used to have a flag to enable module maps, and two more flags to enable
implicit module maps. This is all redundant; we don't need any flag for
enabling module maps in the abstract, and we don't usually have -fno- flags for
-cc1. We now have just a single flag, -fimplicit-module-maps, that enables
implicitly searching the file system for module map files and loading them.

The driver interface is unchanged for now. We should probably rename
-fmodule-maps to -fimplicit-module-maps at some point.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239789 91177308-0d34-0410-b5e6-96231b3b80d8
2015-06-16 00:08:24 +00:00
Richard Smith 96c71a1fdd [modules] If we see a #include that maps to a module, but use of precompiled modules is disabled, track submodule visibility anyway if -fmodules-local-submodule-visibility is enabled. This, in effect, gives modules semantics but without precompilation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237550 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-18 03:52:30 +00:00
Nikola Smiljanic 37e409ef6a Revert "Fix path separator issue on Windows."
This reverts commit 9242ff16b0460b488691fd70b42a2bf81a531e3a.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236806 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-08 06:02:37 +00:00
Nikola Smiljanic 825c12b01a Fix path separator issue on Windows.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236804 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-08 03:26:15 +00:00
Richard Smith 1f468121f5 [modules] Stop trying to fake up a linear MacroDirective history.
Modules builds fundamentally have a non-linear macro history. In the interest
of better source fidelity, represent the macro definition information
faithfully: we have a linear macro directive history within each module, and at
any point we have a unique "latest" local macro directive and a collection of
visible imported directives. This also removes the attendent complexity of
attempting to create a correct MacroDirective history (which we got wrong
in the general case).

No functionality change intended.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236176 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-29 23:20:19 +00:00
Yaron Keren 9bd91b686a Remove many superfluous SmallString::str() calls.
Now that SmallString is a first-class citizen, most SmallString::str()
calls are not required. This patch removes a whole bunch of them, yet
there are lots more.

There are two use cases where str() is really needed:
1) To use one of StringRef member functions which is not available in
SmallString.
2) To convert to std::string, as StringRef implicitly converts while 
SmallString do not. We may wish to change this, but it may introduce
ambiguity.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232622 91177308-0d34-0410-b5e6-96231b3b80d8
2015-03-18 10:17:07 +00:00
Ben Langmuir aa052b8ebc Don't load Framework module.map files when searching subdirectories
This would cause frameworks to have spurious "redefinition" errors if
they had both a (legacy) "module.map" and a (new) "module.modulemap" file and we
happened to do a sub-directory search in that directory using a
non-framework include path (e.g. -Ifoo/ -Ffoo/).  For migration
purposes it's very handy that the compiler will prefer the new spelling
of the filename and not look at the old one if it doesn't need to.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230308 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-24 04:58:15 +00:00
Ben Langmuir 21c08f6c6b Revert "Mangle the IsSystem bit into the .pcm file name"
While I investigate some possible problems with this patch.

This reverts commit r228966

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229910 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-19 20:23:22 +00:00
Ben Langmuir 7c5a52e7a2 Mangle the IsSystem bit into the .pcm file name
When mangling the module map path into a .pcm file name, also mangle the
IsSystem bit, which can also depend on the header search paths. For
example, the user may change from -I to -isystem.  This can affect
diagnostics in the importing TU.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228966 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-12 21:51:31 +00:00
Richard Smith 0748a20829 [modules] When constructing paths relative to a module, strip out /./ directory
components. These sometimes get synthetically added, and we don't want -Ifoo
and -I./foo to be treated fundamentally differently here.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224055 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-11 20:50:24 +00:00
Richard Smith b247819d20 Reinstate r223753, reverted in r223759 due to breakage of clang-tools-extra.
Original commit message:

[modules] Add experimental -fmodule-map-file-home-is-cwd flag to -cc1.

For files named by -fmodule-map-file=, and files found by 'extern module'
directives, this flag specifies that we should resolve filenames relative to
the current working directory rather than relative to the directory in which
the module map file resides. This is aimed at fixing path handling, in
particular for relative -I paths, when building modules that represent
components of the current project (rather than libraries installed on the
current system, which the current project has as dependencies, where we'd
typically expect the module map files to be looked up implicitly).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223913 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-10 03:09:48 +00:00
Duncan P. N. Exon Smith 7195290020 Revert "[modules] Add experimental -fmodule-map-file-home-is-cwd flag to -cc1."
This reverts commit r223753.  It broke the Green Dragon build for a few
hours:

  http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/2259/
  http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/2259/consoleFull#43901905849ba4694-19c4-4d7e-bec5-911270d8a58c

I suspect `clang-tools-extra` just needs a follow-up for an API change,
but I'm not the right one to look into it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223759 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-09 06:35:37 +00:00
Richard Smith 59d05423ef [modules] Add experimental -fmodule-map-file-home-is-cwd flag to -cc1.
For files named by -fmodule-map-file=, and files found by 'extern module'
directives, this flag specifies that we should resolve filenames relative to
the current working directory rather than relative to the directory in which
the module map file resides. This is aimed at fixing path handling, in
particular for relative -I paths, when building modules that represent
components of the current project (rather than libraries installed on the
current system, which the current project has as dependencies, where we'd
typically expect the module map files to be looked up implicitly).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223753 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-09 03:20:04 +00:00
Richard Smith f41e52c880 PR21217: Slightly more eagerly load -fmodule-map-file= files and provide
diagnostics if they don't exist. Based on a patch by John Thompson!


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223561 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-06 01:13:41 +00:00
Richard Smith 426032f8a1 Additional safety for the root cause of regression in r223443; make the module
map path more canonical before hashing it. No functionality change.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223547 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-06 00:09:19 +00:00
Richard Smith b911ec1605 [modules] Track how 'header' directives were written in module map files,
rather than trying to extract this information from the FileEntry after the
fact.

This has a number of beneficial effects. For instance, diagnostic messages for
failed module builds give a path relative to the "module root" rather than an
absolute file path, and the contents of the module includes file is no longer
dependent on what files the including TU happened to inspect prior to
triggering the module build.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223095 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-02 00:08:08 +00:00
Daniel Jasper 4acb6a7747 Add flag -f(no-)modules-implicit-maps.
This suppresses the implicit search for files called 'module.modulemap' and
similar.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222745 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-25 09:45:48 +00:00
David Blaikie 8945a69913 clang-format a recent commit I made
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222317 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-19 05:48:40 +00:00
David Blaikie 8ee697fb1b Standardize on StringMap::insert, removing uses of StringMap::GetOrCreateValue.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222306 91177308-0d34-0410-b5e6-96231b3b80d8
2014-11-19 03:06:06 +00:00
Richard Smith 84a0f84ed5 PR21215: Support -fmodule-map-file being specified multiple times. Support
loading multiple module map files from the same directory.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220020 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-17 01:42:53 +00:00
Richard Smith fbdfa91fa9 Switch to range-based for loop. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220014 91177308-0d34-0410-b5e6-96231b3b80d8
2014-10-17 01:26:52 +00:00
Manuel Klimek 0e5c52d478 Correctly implement -include search logic.
According to the gcc docs, -include uses the current working directory
for the lookup instead of the main source file.

This patch gets rid of NormalizeIncludePath (which relied on an
implementation detail of FileManager / FileEntry for the include path
logic to work), and instead hands the correct lookup information down to
LookupFile.

This will allow us to change the FileEntry's behavior regarding its Name
caching.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215433 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-12 08:25:57 +00:00
Ben Langmuir 243f2d734e Refactor the module map file used for uniquing a module name out of
class Module. It's almost always going to be the same as
getContainingModule() for top-level modules, so just add a map to cover
the remaining cases.  This lets us do less bookkeeping to keep the
ModuleMap fields up to date.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215268 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-09 00:57:23 +00:00
Alp Toker 7225802bf9 Hide the concept of diagnostic levels from lex, parse and sema
The compilation pipeline doesn't actually need to know about the high-level
concept of diagnostic mappings, and hiding the final computed level presents
several simplifications and other potential benefits.

The only exceptions are opportunistic checks to see whether expensive code
paths can be avoided for diagnostics that are guaranteed to be ignored at a
certain SourceLocation.

This commit formalizes that invariant by introducing and using
DiagnosticsEngine::isIgnored() in place of individual level checks throughout
lex, parse and sema.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211005 91177308-0d34-0410-b5e6-96231b3b80d8
2014-06-15 23:30:39 +00:00
Rafael Espindola 9986295b4f Replace llvm::error_code with std::error_code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210780 91177308-0d34-0410-b5e6-96231b3b80d8
2014-06-12 14:02:15 +00:00
Craig Topper da176c6d6a [C++11] Use 'nullptr'. Lex edition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209083 91177308-0d34-0410-b5e6-96231b3b80d8
2014-05-17 23:10:59 +00:00
Ben Langmuir d23fd9aa52 Use the virtual name of headers when searching for a module
When using the VFS, we want the virtual header location when searching
for a framework module, since that will be the one in the correct
directory structure for the module.

I'll add a regression test once I finish reducing the larger one I have.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208901 91177308-0d34-0410-b5e6-96231b3b80d8
2014-05-15 16:20:33 +00:00
Ben Langmuir ef1b5dcd49 Allow multiple modules with the same name to coexist in the module cache
To differentiate between two modules with the same name, we will
consider the path the module map file that they are defined by* part of
the ‘key’ for looking up the precompiled module (pcm file).
Specifically, this patch renames the precompiled module (pcm) files from
  cache-path/<module hash>/Foo.pcm
to
  cache-path/<module hash>/Foo-<hash of module map path>.pcm

In addition, I’ve taught the ASTReader to re-resolve the names of
imported modules during module loading so that if the header search
context changes between when a module was originally built and when it
is loaded we can rebuild it if necessary.  For example, if module A
imports module B

first time:
clang -I /path/to/A -I /path/to/B ...

second time:
clang -I /path/to/A -I /different/path/to/B ...

will now rebuild A as expected.

* in the case of inferred modules, we use the module map file that
allowed the inference, not the __inferred_module.map file, since the
inferred file path is the same for every inferred module.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206201 91177308-0d34-0410-b5e6-96231b3b80d8
2014-04-14 18:00:01 +00:00
Argyrios Kyrtzidis c5e0194d63 [HeaderSearch] Make sure we clear the mapped name from the LookupFileCacheInfo when we reset the start point.
rdar://16462455

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205071 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-29 03:22:54 +00:00
Ben Langmuir 8ce754cfcf Prevent lookup of subframework modules by name without parent framework
We were 'allowing' the following import
@import Sub;

where Sub is a subframework of Foo and we had a -F path inside
Foo.framework/Frameworks and no module map file for Sub. This would
later hit assertion failures in debug builds.

Now we should correctly diagnose this as a module not found error.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204368 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-20 18:27:26 +00:00
Aaron Ballman 5cf6322963 Silencing an MSVC warning about not all control paths returning a value. No functional change intended.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204345 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-20 14:22:33 +00:00
Ben Langmuir ae028ef797 Add a new spelling for module map files 'module.modulemap'
This name, while more verbose, plays more nicely with tools that use
file extensions to determine file types. The existing spelling
'module.map' will continue to work, but the new spelling will take
precedence.

In frameworks, this new filename will only go in a new 'Modules'
sub-directory.

Similarly, add a module.private.modulemap corresponding to
module_private.map.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204261 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-19 20:23:34 +00:00
Ben Langmuir 201cbad62d Prevent outputting HeaderFileInfos for files not used as headers
When building an AST file, we don't want to output HeaderFileInfo
structures for files that are not actually used as headers in the
current context.  This can lead to assuming that unrelated files have
include counts of 0, defeating multiple-include prevention.

This is accomplished by adding an IsValid bit to the HFI.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203813 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-13 16:46:36 +00:00
Argyrios Kyrtzidis b5d8fba05e [HeaderSearch] Fix issue where if a headermap entry maps the filename to a framework import (non-absolute path)
then we fail to find it if it is re-included later on.

rdar://16285490

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203542 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-11 06:21:28 +00:00
Richard Smith b5ceb30994 Fix use-after-free detected by ASan bootstrap.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203140 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-06 18:08:08 +00:00
Richard Smith a889b8ad62 If a #include finds a file relative to the current file, don't forget to check
whether it's part of a module.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203005 91177308-0d34-0410-b5e6-96231b3b80d8
2014-03-05 20:51:45 +00:00
Reid Kleckner a20e7b2608 Fix false positives in -Wmsvc-include by continuing header search
This makes Clang and LLVM -Wmsvc-include clean.

I believe the correct behavior here is to avoid updating the cache when
we find the header via MSVC's search rules.

Differential Revision: http://llvm-reviews.chandlerc.com/D2733

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201615 91177308-0d34-0410-b5e6-96231b3b80d8
2014-02-18 23:49:24 +00:00
Argyrios Kyrtzidis 27203f6279 If the headermap maps the filename to a framework include ("Foo.h" -> "Foo/Foo.h"),
continue header lookup using the framework include as filename.

This allows us to conveniently treat
  #import "Foo.h"
as an implicit module import if we can resolve "Foo/Foo.h" as such.

rdar://16042979

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201419 91177308-0d34-0410-b5e6-96231b3b80d8
2014-02-14 14:58:28 +00:00
Chandler Carruth 4b9be6e25f Sort all the #include lines with LLVM's utils/sort_includes.py which
encodes the canonical rules for LLVM's style. I noticed this had drifted
quite a bit when cleaning up LLVM, so wanted to clean up Clang as well.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198686 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-07 11:51:46 +00:00
Will Wilson 4f1d76ffbc Silence compile warning by removing unused SourceMgr member
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198083 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-27 20:02:27 +00:00
Will Wilson 75d7d8f2b2 Implement MSVC header search algorithm in MicrosoftMode.
Follows algorithm described here: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198082 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-27 19:46:16 +00:00
Will Wilson 009c155b74 Fix comment typo.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197695 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-19 16:24:17 +00:00
Daniel Jasper 71b119ca18 Modules: Don't warn upon missing headers while reading the module map.
Instead, mark the module as unavailable so that clang errors as soon as
someone tries to build this module.

This works towards the long-term goal of not stat'ing the header files at all
while reading the module map and instead read them only when the module is
being built (there is a corresponding FIXME in parseHeaderDecl()).  However, it
seems non-trivial to get there and this unblock us and moves us into the right
direction.

Also changed the implementation to reuse the same DiagnosticsEngine.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197485 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-17 10:31:37 +00:00
Daniel Jasper 7807f00835 Revert "Modules: Make missing headers in a module.map a warning not an error."
This was committed accidentally.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197389 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-16 14:57:22 +00:00
Daniel Jasper 013d811a7b Modules: Make missing headers in a module.map a warning not an error.
Instead, mark the module as unavailable so that clang errors as soon as
someone tries to build this module.

A better long-term strategy might be to not stat the header files at all
while reading the module map and instead read them only when the module
is being built (there is a corresponding FIXME in parseHeaderDecl()).
However, it seems non-trivial to get there and this would be a temporary
solution to unblock us.

Also changed the implementation to reuse the same DiagnosticsEngine as
otherwise warnings can't be enabled or disabled with command-line flags.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197388 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-16 14:53:57 +00:00
Argyrios Kyrtzidis 1858ef5cda [Modules] Don't parse any module map if modules are disabled.
Fixes rdar://15644663.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@197165 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-12 16:08:33 +00:00
NAKAMURA Takumi 8356608d43 Revert r196859, "Use llvm::sys::path::append to concatenate paths", to appease FileManager.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196865 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-10 02:36:28 +00:00
Dmitri Gribenko abce6b7c69 Use llvm::sys::path::append to concatenate paths
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196859 91177308-0d34-0410-b5e6-96231b3b80d8
2013-12-10 01:36:10 +00:00
Douglas Gregor 701bc8ceb1 Preload module maps in normal user directories, too.
... in case someone decides to -I/usr/include <rdar://problem/15235948>.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193893 91177308-0d34-0410-b5e6-96231b3b80d8
2013-11-01 23:08:38 +00:00
Manuel Klimek ee0cd37fe4 Use the same SourceManager for ModuleMaps and compilations.
This allows using virtual file mappings on the original SourceManager to
map in virtual module.map files. Without this patch, the ModuleMap
search will find a module.map file (as the FileEntry exists in the
FileManager), but will be unable to get the content from the
SourceManager (as ModuleMap previously created its own SourceManager).

Two problems needed to be fixed which this patch exposed:

1. Storing the inferred module map
When writing out a module, the ASTWriter stores the names of the files
in the main source manager; when loading the AST again, the ASTReader
errs out if such a file is found missing, unless it is overridden.
Previously CompilerInstance's compileModule method would store the
inferred module map to a temporary file; the problem with this approach
is that now that the module map is handled by the main source manager,
the ASTWriter stores the name of the temporary module map as source to
the compilation; later, when the module is loaded, the temporary file
has already been deleted, which leads to a compilation error. This patch
changes the inferred module map to instead inject a virtual file into
the source manager. This both saves some disk IO, and works with how the
ASTWriter/ASTReader handle overridden source files.

2. Changing test input in test/Modules/Inputs/*
Now that the module map file is handled by the main source manager, the
VerifyDiagnosticConsumer will not ignore diagnostics created while
parsing the module map file. The module test test/Modules/renamed.m uses
-I test/Modules/Inputs and triggers recursive loading of all module maps
in test/Modules/Inputs, some of which had conflicting names, thus
leading errors while parsing the module maps. Those diagnostics already
occur on trunk, but before this patch they would not break the test, as
they were ignored by the VerifyDiagnosticConsumer. This patch thus
changes the module maps that have been recently introduced which broke
the invariant of compatible modules maps in test/Modules/Inputs.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193314 91177308-0d34-0410-b5e6-96231b3b80d8
2013-10-24 07:51:24 +00:00