aboutsummaryrefslogtreecommitdiff
path: root/tools/clang-cc/DependencyFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/clang-cc/DependencyFile.cpp')
-rw-r--r--tools/clang-cc/DependencyFile.cpp171
1 files changed, 0 insertions, 171 deletions
diff --git a/tools/clang-cc/DependencyFile.cpp b/tools/clang-cc/DependencyFile.cpp
deleted file mode 100644
index 3306f82aea..0000000000
--- a/tools/clang-cc/DependencyFile.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-//===--- DependencyFile.cpp - Generate dependency file --------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This code generates dependency files.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang-cc.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Lex/Preprocessor.h"
-#include "clang/Lex/PPCallbacks.h"
-#include "clang/Lex/DirectoryLookup.h"
-#include "clang/Basic/SourceLocation.h"
-#include "llvm/ADT/StringSet.h"
-#include "llvm/System/Path.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Compiler.h"
-#include "llvm/Support/raw_ostream.h"
-#include <string>
-
-using namespace clang;
-
-namespace {
-class VISIBILITY_HIDDEN DependencyFileCallback : public PPCallbacks {
- std::vector<std::string> Files;
- llvm::StringSet<> FilesSet;
- const Preprocessor *PP;
- std::vector<std::string> Targets;
- llvm::raw_ostream *OS;
- bool IncludeSystemHeaders;
- bool PhonyTarget;
-private:
- bool FileMatchesDepCriteria(const char *Filename,
- SrcMgr::CharacteristicKind FileType);
- void OutputDependencyFile();
-
-public:
- DependencyFileCallback(const Preprocessor *_PP,
- llvm::raw_ostream *_OS,
- const std::vector<std::string> &_Targets,
- bool _IncludeSystemHeaders,
- bool _PhonyTarget)
- : PP(_PP), Targets(_Targets), OS(_OS),
- IncludeSystemHeaders(_IncludeSystemHeaders), PhonyTarget(_PhonyTarget) {}
-
- ~DependencyFileCallback() {
- OutputDependencyFile();
- OS->flush();
- delete OS;
- }
-
- virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
- SrcMgr::CharacteristicKind FileType);
-};
-}
-
-
-
-void clang::AttachDependencyFileGen(Preprocessor *PP, llvm::raw_ostream *OS,
- std::vector<std::string> &Targets,
- bool IncludeSystemHeaders,
- bool PhonyTarget) {
- assert(!Targets.empty() && "Target required for dependency generation");
-
- DependencyFileCallback *PPDep =
- new DependencyFileCallback(PP, OS, Targets, IncludeSystemHeaders,
- PhonyTarget);
- PP->setPPCallbacks(PPDep);
-}
-
-/// FileMatchesDepCriteria - Determine whether the given Filename should be
-/// considered as a dependency.
-bool DependencyFileCallback::FileMatchesDepCriteria(const char *Filename,
- SrcMgr::CharacteristicKind FileType) {
- if (strcmp("<built-in>", Filename) == 0)
- return false;
-
- if (IncludeSystemHeaders)
- return true;
-
- return FileType == SrcMgr::C_User;
-}
-
-void DependencyFileCallback::FileChanged(SourceLocation Loc,
- FileChangeReason Reason,
- SrcMgr::CharacteristicKind FileType) {
- if (Reason != PPCallbacks::EnterFile)
- return;
-
- // Dependency generation really does want to go all the way to the
- // file entry for a source location to find out what is depended on.
- // We do not want #line markers to affect dependency generation!
- SourceManager &SM = PP->getSourceManager();
-
- const FileEntry *FE =
- SM.getFileEntryForID(SM.getFileID(SM.getInstantiationLoc(Loc)));
- if (FE == 0) return;
-
- const char *Filename = FE->getName();
- if (!FileMatchesDepCriteria(Filename, FileType))
- return;
-
- // Remove leading "./"
- if (Filename[0] == '.' && Filename[1] == '/')
- Filename = &Filename[2];
-
- if (FilesSet.insert(Filename))
- Files.push_back(Filename);
-}
-
-void DependencyFileCallback::OutputDependencyFile() {
- // Write out the dependency targets, trying to avoid overly long
- // lines when possible. We try our best to emit exactly the same
- // dependency file as GCC (4.2), assuming the included files are the
- // same.
- const unsigned MaxColumns = 75;
- unsigned Columns = 0;
-
- for (std::vector<std::string>::iterator
- I = Targets.begin(), E = Targets.end(); I != E; ++I) {
- unsigned N = I->length();
- if (Columns == 0) {
- Columns += N;
- *OS << *I;
- } else if (Columns + N + 2 > MaxColumns) {
- Columns = N + 2;
- *OS << " \\\n " << *I;
- } else {
- Columns += N + 1;
- *OS << ' ' << *I;
- }
- }
-
- *OS << ':';
- Columns += 1;
-
- // Now add each dependency in the order it was seen, but avoiding
- // duplicates.
- for (std::vector<std::string>::iterator I = Files.begin(),
- E = Files.end(); I != E; ++I) {
- // Start a new line if this would exceed the column limit. Make
- // sure to leave space for a trailing " \" in case we need to
- // break the line on the next iteration.
- unsigned N = I->length();
- if (Columns + (N + 1) + 2 > MaxColumns) {
- *OS << " \\\n ";
- Columns = 2;
- }
- *OS << ' ' << *I;
- Columns += N + 1;
- }
- *OS << '\n';
-
- // Create phony targets if requested.
- if (PhonyTarget) {
- // Skip the first entry, this is always the input file itself.
- for (std::vector<std::string>::iterator I = Files.begin() + 1,
- E = Files.end(); I != E; ++I) {
- *OS << '\n';
- *OS << *I << ":\n";
- }
- }
-}
-