aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/CompilerInstance.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-12-02 08:08:39 +0000
committerDouglas Gregor <dgregor@apple.com>2009-12-02 08:08:39 +0000
commit716f0b3e2e36f362b64a2ce0a40a9ad915103255 (patch)
tree2991e194250a39dd3a6016af8a91dce1afa92f96 /lib/Frontend/CompilerInstance.cpp
parent0bd6feb9e9d40fc889fd47e899985125a43dfed8 (diff)
Introduce a new clang-cc option
-remap-file=from;to which takes the file "from" and transparently replaces its contents with the contents of the file "to" from the source manager's perspective. This is the moral equivalent of cp from saved cp to from <call clang> cp saved from rm saved without all of the pesky file copying. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90307 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/CompilerInstance.cpp')
-rw-r--r--lib/Frontend/CompilerInstance.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp
index 2d58beead8..02b24b4976 100644
--- a/lib/Frontend/CompilerInstance.cpp
+++ b/lib/Frontend/CompilerInstance.cpp
@@ -190,6 +190,45 @@ CompilerInstance::createPreprocessor(Diagnostic &Diags,
PP->setPTHManager(PTHMgr);
}
+ // Remap files in the source manager.
+ for (PreprocessorOptions::remapped_file_iterator
+ Remap = PPOpts.remapped_file_begin(),
+ RemapEnd = PPOpts.remapped_file_end();
+ Remap != RemapEnd;
+ ++Remap) {
+ // Find the file that we're mapping to.
+ const FileEntry *ToFile = FileMgr.getFile(Remap->second);
+ if (!ToFile) {
+ Diags.Report(diag::err_fe_remap_missing_to_file)
+ << Remap->first << Remap->second;
+ continue;
+ }
+
+ // Find the file that we're mapping from.
+ const FileEntry *FromFile = FileMgr.getFile(Remap->first);
+ if (!FromFile) {
+ // FIXME: We could actually recover from this, by faking a
+ // FileEntry based on the "ToFile".
+ Diags.Report(diag::err_fe_remap_missing_from_file)
+ << Remap->first;
+ continue;
+ }
+
+ // Load the contents of the file we're mapping to.
+ std::string ErrorStr;
+ const llvm::MemoryBuffer *Buffer
+ = llvm::MemoryBuffer::getFile(ToFile->getName(), &ErrorStr);
+ if (!Buffer) {
+ Diags.Report(diag::err_fe_error_opening)
+ << Remap->second << ErrorStr;
+ continue;
+ }
+
+ // Override the contents of the "from" file with the contents of
+ // the "to" file.
+ SourceMgr.overrideFileContents(FromFile, Buffer);
+ }
+
InitializePreprocessor(*PP, PPOpts, HSOpts);
// Handle generating dependencies, if requested.