diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:06:01 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:06:01 +0000 |
commit | 486754660bb926339aefcf012a3f848592babb8b (patch) | |
tree | ecdbc446c9876f4f120f701c243373cd3cb43db3 /lib/Tooling/CompilationDatabase.cpp | |
parent | 55e6d896ad333f07bb3b1ba487df214fc268a4ab (diff) |
Notes
Diffstat (limited to 'lib/Tooling/CompilationDatabase.cpp')
-rw-r--r-- | lib/Tooling/CompilationDatabase.cpp | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/lib/Tooling/CompilationDatabase.cpp b/lib/Tooling/CompilationDatabase.cpp index 92b76b157dcb0..31a769fa21e56 100644 --- a/lib/Tooling/CompilationDatabase.cpp +++ b/lib/Tooling/CompilationDatabase.cpp @@ -1,4 +1,4 @@ -//===--- CompilationDatabase.cpp - ----------------------------------------===// +//===- CompilationDatabase.cpp --------------------------------------------===// // // The LLVM Compiler Infrastructure // @@ -17,7 +17,9 @@ #include "clang/Tooling/CompilationDatabase.h" #include "clang/Basic/Diagnostic.h" +#include "clang/Basic/DiagnosticIDs.h" #include "clang/Basic/DiagnosticOptions.h" +#include "clang/Basic/LLVM.h" #include "clang/Driver/Action.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" @@ -26,20 +28,38 @@ #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Tooling/CompilationDatabasePluginRegistry.h" #include "clang/Tooling/Tooling.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Option/Arg.h" +#include "llvm/Support/Casting.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/ErrorOr.h" #include "llvm/Support/Host.h" #include "llvm/Support/LineIterator.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" +#include <algorithm> +#include <cassert> +#include <cstring> +#include <iterator> +#include <memory> #include <sstream> +#include <string> #include <system_error> +#include <utility> +#include <vector> + using namespace clang; using namespace tooling; LLVM_INSTANTIATE_REGISTRY(CompilationDatabasePluginRegistry) -CompilationDatabase::~CompilationDatabase() {} +CompilationDatabase::~CompilationDatabase() = default; std::unique_ptr<CompilationDatabase> CompilationDatabase::loadFromDirectory(StringRef BuildDirectory, @@ -121,20 +141,20 @@ std::vector<CompileCommand> CompilationDatabase::getAllCompileCommands() const { return Result; } -CompilationDatabasePlugin::~CompilationDatabasePlugin() {} +CompilationDatabasePlugin::~CompilationDatabasePlugin() = default; namespace { + // Helper for recursively searching through a chain of actions and collecting // all inputs, direct and indirect, of compile jobs. struct CompileJobAnalyzer { + SmallVector<std::string, 2> Inputs; + void run(const driver::Action *A) { runImpl(A, false); } - SmallVector<std::string, 2> Inputs; - private: - void runImpl(const driver::Action *A, bool Collect) { bool CollectChildren = Collect; switch (A->getKind()) { @@ -142,16 +162,16 @@ private: CollectChildren = true; break; - case driver::Action::InputClass: { + case driver::Action::InputClass: if (Collect) { - const driver::InputAction *IA = cast<driver::InputAction>(A); + const auto *IA = cast<driver::InputAction>(A); Inputs.push_back(IA->getInputArg().getSpelling()); } - } break; + break; default: // Don't care about others - ; + break; } for (const driver::Action *AI : A->inputs()) @@ -168,7 +188,7 @@ public: void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) override { - if (Info.getID() == clang::diag::warn_drv_input_file_unused) { + if (Info.getID() == diag::warn_drv_input_file_unused) { // Arg 1 for this diagnostic is the option that didn't get used. UnusedInputs.push_back(Info.getArgStdStr(0)); } else if (DiagLevel >= DiagnosticsEngine::Error) { @@ -186,18 +206,21 @@ public: // S2 in Arr where S1 == S2?" struct MatchesAny { MatchesAny(ArrayRef<std::string> Arr) : Arr(Arr) {} + bool operator() (StringRef S) { for (const std::string *I = Arr.begin(), *E = Arr.end(); I != E; ++I) if (*I == S) return true; return false; } + private: ArrayRef<std::string> Arr; }; + } // namespace -/// \brief Strips any positional args and possible argv[0] from a command-line +/// Strips any positional args and possible argv[0] from a command-line /// provided by the user to construct a FixedCompilationDatabase. /// /// FixedCompilationDatabase requires a command line to be in this format as it @@ -224,7 +247,7 @@ static bool stripPositionalArgs(std::vector<const char *> Args, TextDiagnosticPrinter DiagnosticPrinter(Output, &*DiagOpts); UnusedInputDiagConsumer DiagClient(DiagnosticPrinter); DiagnosticsEngine Diagnostics( - IntrusiveRefCntPtr<clang::DiagnosticIDs>(new DiagnosticIDs()), + IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts, &DiagClient, false); // The clang executable path isn't required since the jobs the driver builds @@ -362,11 +385,11 @@ class FixedCompilationDatabasePlugin : public CompilationDatabasePlugin { } }; +} // namespace + static CompilationDatabasePluginRegistry::Add<FixedCompilationDatabasePlugin> X("fixed-compilation-database", "Reads plain-text flags file"); -} // namespace - namespace clang { namespace tooling { @@ -375,5 +398,5 @@ namespace tooling { extern volatile int JSONAnchorSource; static int LLVM_ATTRIBUTE_UNUSED JSONAnchorDest = JSONAnchorSource; -} // end namespace tooling -} // end namespace clang +} // namespace tooling +} // namespace clang |