瀏覽代碼

Fix emission of phony dependency targets when adding extra deps

Summary:
This commit fixes a bug where passing extra dependency entries
(using -fdepfile-entry) would result in -MP incorrectly emitting
a phony target for the input file, and no phony target for the
first extra dependency.

The extra dependencies are added first to the filename vector in
DFGImpl. That clashed with the emission of the phony targets, as
the code assumed that the first index always correspond to the
input file.

Reviewers: rsmith, pcc, krasin, bruno, vsapsai

Reviewed By: vsapsai

Subscribers: vsapsai, bruno, cfe-commits

Differential Revision: https://reviews.llvm.org/D44568

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333413 91177308-0d34-0410-b5e6-96231b3b80d8
David Stenberg 7 年之前
父節點
當前提交
c01eff1a9b
共有 2 個文件被更改,包括 25 次插入7 次删除
  1. 15 7
      lib/Frontend/DependencyFile.cpp
  2. 10 0
      test/Frontend/dependency-gen-extradeps-phony.c

+ 15 - 7
lib/Frontend/DependencyFile.cpp

@@ -163,6 +163,7 @@ class DFGImpl : public PPCallbacks {
   bool SeenMissingHeader;
   bool SeenMissingHeader;
   bool IncludeModuleFiles;
   bool IncludeModuleFiles;
   DependencyOutputFormat OutputFormat;
   DependencyOutputFormat OutputFormat;
+  unsigned InputFileIndex;
 
 
 private:
 private:
   bool FileMatchesDepCriteria(const char *Filename,
   bool FileMatchesDepCriteria(const char *Filename,
@@ -177,9 +178,11 @@ public:
       AddMissingHeaderDeps(Opts.AddMissingHeaderDeps),
       AddMissingHeaderDeps(Opts.AddMissingHeaderDeps),
       SeenMissingHeader(false),
       SeenMissingHeader(false),
       IncludeModuleFiles(Opts.IncludeModuleFiles),
       IncludeModuleFiles(Opts.IncludeModuleFiles),
-      OutputFormat(Opts.OutputFormat) {
+      OutputFormat(Opts.OutputFormat),
+      InputFileIndex(0) {
     for (const auto &ExtraDep : Opts.ExtraDeps) {
     for (const auto &ExtraDep : Opts.ExtraDeps) {
-      AddFilename(ExtraDep);
+      if (AddFilename(ExtraDep))
+        ++InputFileIndex;
     }
     }
   }
   }
 
 
@@ -201,7 +204,7 @@ public:
     OutputDependencyFile();
     OutputDependencyFile();
   }
   }
 
 
-  void AddFilename(StringRef Filename);
+  bool AddFilename(StringRef Filename);
   bool includeSystemHeaders() const { return IncludeSystemHeaders; }
   bool includeSystemHeaders() const { return IncludeSystemHeaders; }
   bool includeModuleFiles() const { return IncludeModuleFiles; }
   bool includeModuleFiles() const { return IncludeModuleFiles; }
 };
 };
@@ -325,9 +328,12 @@ void DFGImpl::InclusionDirective(SourceLocation HashLoc,
   }
   }
 }
 }
 
 
-void DFGImpl::AddFilename(StringRef Filename) {
-  if (FilesSet.insert(Filename).second)
+bool DFGImpl::AddFilename(StringRef Filename) {
+  if (FilesSet.insert(Filename).second) {
     Files.push_back(Filename);
     Files.push_back(Filename);
+    return true;
+  }
+  return false;
 }
 }
 
 
 /// Print the filename, with escaping or quoting that accommodates the three
 /// Print the filename, with escaping or quoting that accommodates the three
@@ -463,8 +469,10 @@ void DFGImpl::OutputDependencyFile() {
 
 
   // Create phony targets if requested.
   // Create phony targets if requested.
   if (PhonyTarget && !Files.empty()) {
   if (PhonyTarget && !Files.empty()) {
-    // Skip the first entry, this is always the input file itself.
-    for (auto I = Files.begin() + 1, E = Files.end(); I != E; ++I) {
+    unsigned Index = 0;
+    for (auto I = Files.begin(), E = Files.end(); I != E; ++I) {
+      if (Index++ == InputFileIndex)
+        continue;
       OS << '\n';
       OS << '\n';
       PrintFilename(OS, *I, OutputFormat);
       PrintFilename(OS, *I, OutputFormat);
       OS << ":\n";
       OS << ":\n";

+ 10 - 0
test/Frontend/dependency-gen-extradeps-phony.c

@@ -0,0 +1,10 @@
+// RUN: %clang -MM -MP -Xclang -fdepfile-entry=1.extra -Xclang -fdepfile-entry=2.extra -Xclang -fdepfile-entry=2.extra %s | \
+// RUN: FileCheck %s --implicit-check-not=.c:
+//
+// Verify that phony targets are only created for the extra dependency files,
+// and not the input file.
+
+// CHECK: dependency-gen-extradeps-phony.o: 1.extra 2.extra \
+// CHECK-NEXT: dependency-gen-extradeps-phony.c
+// CHECK: 1.extra:
+// CHECK: 2.extra: