Author: maskray Date: Sat Mar 23 23:55:08 2019 New Revision: 356849 URL: http://llvm.org/viewvc/llvm-project?rev=356849&view=rev Log: [pp-trace] Modernize the code
Use InitLLVM and WithColor Delete PPTraceConsumer, add the callback in PPTraceAction Migrae to tooling::createExecutorFromCommandLineArgs Don't specialize empty OutputFileName Modified: clang-tools-extra/trunk/pp-trace/PPTrace.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-conditional.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-filter.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-ident.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-include.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-macro.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-modules.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-general.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-ms.cpp clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-opencl.cpp Modified: clang-tools-extra/trunk/pp-trace/PPTrace.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/pp-trace/PPTrace.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/pp-trace/PPTrace.cpp (original) +++ clang-tools-extra/trunk/pp-trace/PPTrace.cpp Sat Mar 23 23:55:08 2019 @@ -34,6 +34,7 @@ #include "clang/Frontend/FrontendActions.h" #include "clang/Lex/Preprocessor.h" #include "clang/Tooling/CompilationDatabase.h" +#include "clang/Tooling/Execution.h" #include "clang/Tooling/Tooling.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" @@ -42,6 +43,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/GlobPattern.h" +#include "llvm/Support/InitLLVM.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include "llvm/Support/ToolOutputFile.h" @@ -56,108 +58,79 @@ using namespace clang; using namespace clang::tooling; using namespace llvm; -// Options: - -// Collect the source files. -static cl::list<std::string> SourcePaths(cl::Positional, - cl::desc("<source0> [... <sourceN>]"), - cl::OneOrMore); +static cl::OptionCategory Cat("pp-trace options"); static cl::opt<std::string> Callbacks( "callbacks", cl::init("*"), cl::desc("Comma-separated list of globs describing the list of callbacks " "to output. Globs are processed in order of appearance. Globs " "with the '-' prefix remove callbacks from the set. e.g. " - "'*,-Macro*'.")); + "'*,-Macro*'."), + cl::cat(Cat)); -// Option to specify the trace output file name. static cl::opt<std::string> OutputFileName( - "output", cl::init(""), - cl::desc("Output trace to the given file name or '-' for stdout.")); - -// Collect all other arguments, which will be passed to the front end. -static cl::list<std::string> - CC1Arguments(cl::ConsumeAfter, - cl::desc("<arguments to be passed to front end>...")); - -// Frontend action stuff: + "output", cl::init("-"), + cl::desc("Output trace to the given file name or '-' for stdout."), + cl::cat(Cat)); + +LLVM_ATTRIBUTE_NORETURN static void error(Twine Message) { + WithColor::error() << Message << '\n'; + exit(1); +} namespace { -// Consumer is responsible for setting up the callbacks. -class PPTraceConsumer : public ASTConsumer { -public: - PPTraceConsumer(const FilterType &Filters, - std::vector<CallbackCall> &CallbackCalls, Preprocessor &PP) { - // PP takes ownership. - PP.addPPCallbacks( - llvm::make_unique<PPCallbacksTracker>(Filters, CallbackCalls, PP)); - } -}; -class PPTraceAction : public SyntaxOnlyAction { +class PPTraceAction : public ASTFrontendAction { public: - PPTraceAction(const FilterType &Filters, - std::vector<CallbackCall> &CallbackCalls) - : Filters(Filters), CallbackCalls(CallbackCalls) {} + PPTraceAction(const FilterType &Filters, raw_ostream &OS) + : Filters(Filters), OS(OS) {} protected: std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override { - return llvm::make_unique<PPTraceConsumer>(Filters, CallbackCalls, - CI.getPreprocessor()); + Preprocessor &PP = CI.getPreprocessor(); + PP.addPPCallbacks( + make_unique<PPCallbacksTracker>(Filters, CallbackCalls, PP)); + return make_unique<ASTConsumer>(); + } + + void EndSourceFileAction() override { + OS << "---\n"; + for (const CallbackCall &Callback : CallbackCalls) { + OS << "- Callback: " << Callback.Name << "\n"; + for (const Argument &Arg : Callback.Arguments) + OS << " " << Arg.Name << ": " << Arg.Value << "\n"; + } + OS << "...\n"; + + CallbackCalls.clear(); } private: const FilterType &Filters; - std::vector<CallbackCall> &CallbackCalls; + raw_ostream &OS; + std::vector<CallbackCall> CallbackCalls; }; class PPTraceFrontendActionFactory : public FrontendActionFactory { public: - PPTraceFrontendActionFactory(const FilterType &Filters, - std::vector<CallbackCall> &CallbackCalls) - : Filters(Filters), CallbackCalls(CallbackCalls) {} + PPTraceFrontendActionFactory(const FilterType &Filters, raw_ostream &OS) + : Filters(Filters), OS(OS) {} - PPTraceAction *create() override { - return new PPTraceAction(Filters, CallbackCalls); - } + PPTraceAction *create() override { return new PPTraceAction(Filters, OS); } private: const FilterType &Filters; - std::vector<CallbackCall> &CallbackCalls; + raw_ostream &OS; }; } // namespace -// Output the trace given its data structure and a stream. -static int outputPPTrace(std::vector<CallbackCall> &CallbackCalls, - llvm::raw_ostream &OS) { - // Mark start of document. - OS << "---\n"; - - for (std::vector<CallbackCall>::const_iterator I = CallbackCalls.begin(), - E = CallbackCalls.end(); - I != E; ++I) { - const CallbackCall &Callback = *I; - OS << "- Callback: " << Callback.Name << "\n"; - - for (auto AI = Callback.Arguments.begin(), AE = Callback.Arguments.end(); - AI != AE; ++AI) { - const Argument &Arg = *AI; - OS << " " << Arg.Name << ": " << Arg.Value << "\n"; - } - } - - // Mark end of document. - OS << "...\n"; - - return 0; -} - -// Program entry point. -int main(int Argc, const char **Argv) { +int main(int argc, const char **argv) { + InitLLVM X(argc, argv); - // Parse command line. - cl::ParseCommandLineOptions(Argc, Argv, "pp-trace.\n"); + auto Exec = tooling::createExecutorFromCommandLineArgs(argc, argv, Cat); + if (!Exec) + error(toString(Exec.takeError())); // Parse the IgnoreCallbacks list into strings. SmallVector<StringRef, 32> Patterns; @@ -169,51 +142,18 @@ int main(int Argc, const char **Argv) { bool Enabled = !Pattern.consume_front("-"); if (Expected<GlobPattern> Pat = GlobPattern::create(Pattern)) Filters.emplace_back(std::move(*Pat), Enabled); - else { - WithColor::error(llvm::errs(), "pp-trace") - << toString(Pat.takeError()) << '\n'; - return 1; - } - } - - // Create the compilation database. - SmallString<256> PathBuf; - sys::fs::current_path(PathBuf); - std::unique_ptr<CompilationDatabase> Compilations; - Compilations.reset( - new FixedCompilationDatabase(Twine(PathBuf), CC1Arguments)); - - // Store the callback trace information here. - std::vector<CallbackCall> CallbackCalls; - - // Create the tool and run the compilation. - ClangTool Tool(*Compilations, SourcePaths); - PPTraceFrontendActionFactory Factory(Filters, CallbackCalls); - int HadErrors = Tool.run(&Factory); - - // If we had errors, exit early. - if (HadErrors) - return HadErrors; - - // Do the output. - if (!OutputFileName.size()) { - HadErrors = outputPPTrace(CallbackCalls, llvm::outs()); - } else { - // Set up output file. - std::error_code EC; - llvm::ToolOutputFile Out(OutputFileName, EC, llvm::sys::fs::F_Text); - if (EC) { - llvm::errs() << "pp-trace: error creating " << OutputFileName << ":" - << EC.message() << "\n"; - return 1; - } - - HadErrors = outputPPTrace(CallbackCalls, Out.os()); - - // Tell ToolOutputFile that we want to keep the file. - if (HadErrors == 0) - Out.keep(); + else + error(toString(Pat.takeError())); } - return HadErrors; + std::error_code EC; + llvm::ToolOutputFile Out(OutputFileName, EC, llvm::sys::fs::F_Text); + if (EC) + error(EC.message()); + + if (Error Err = Exec->get()->execute( + make_unique<PPTraceFrontendActionFactory>(Filters, Out.os()))) + error(toString(std::move(Err))); + Out.keep(); + return 0; } Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-conditional.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-conditional.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-conditional.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-conditional.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace -callbacks '*,-FileChanged' %s -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged' %s -- -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s #if 1 #endif Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-filter.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-filter.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-filter.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-filter.cpp Sat Mar 23 23:55:08 2019 @@ -1,6 +1,6 @@ -// RUN: pp-trace -callbacks 'File*,Macro*,-MacroUndefined' %s | FileCheck %s -// RUN: pp-trace -callbacks ' File* , Macro* , -MacroUndefined ' %s | FileCheck %s -// RUN: not pp-trace -callbacks '[' %s 2>&1 | FileCheck --check-prefix=INVALID %s +// RUN: pp-trace -callbacks 'File*,Macro*,-MacroUndefined' %s -- | FileCheck %s +// RUN: pp-trace -callbacks ' File* , Macro* , -MacroUndefined ' %s -- | FileCheck %s +// RUN: not pp-trace -callbacks '[' %s -- 2>&1 | FileCheck --check-prefix=INVALID %s #define M 1 int i = M; Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-ident.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-ident.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-ident.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-ident.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s #ident "$Id$" Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-include.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-include.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-include.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-include.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace %s -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s +// RUN: pp-trace %s -- -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s #include "Inputs/Level1A.h" #include "Inputs/Level1B.h" Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-macro.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-macro.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-macro.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-macro.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace -callbacks '*,-FileChanged' %s -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged' %s -- -undef -target x86_64 -std=c++11 | FileCheck --strict-whitespace %s #define MACRO 1 int i = MACRO; Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-modules.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-modules.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-modules.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-modules.cpp Sat Mar 23 23:55:08 2019 @@ -1,5 +1,5 @@ // RUN: rm -rf %t -// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -x objective-c++ -undef -target x86_64 -std=c++11 -fmodules -fcxx-modules -fmodules-cache-path=%t -I%S -I%S/Input | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- -x objective-c++ -undef -target x86_64 -std=c++11 -fmodules -fcxx-modules -fmodules-cache-path=%t -I%S -I%S/Input | FileCheck --strict-whitespace %s // CHECK: --- Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-general.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-general.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-general.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-general.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck --strict-whitespace %s #pragma clang diagnostic push #pragma clang diagnostic pop Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-ms.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-ms.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-ms.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-ms.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -target x86_64-unknown-windows-msvc -fms-extensions -w | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- -target x86_64-unknown-windows-msvc -fms-extensions -w | FileCheck --strict-whitespace %s #pragma comment(compiler, "compiler comment") #pragma comment(exestr, "exestr comment") Modified: clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-opencl.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-opencl.cpp?rev=356849&r1=356848&r2=356849&view=diff ============================================================================== --- clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-opencl.cpp (original) +++ clang-tools-extra/trunk/test/pp-trace/pp-trace-pragma-opencl.cpp Sat Mar 23 23:55:08 2019 @@ -1,4 +1,4 @@ -// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -x cl | FileCheck --strict-whitespace %s +// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- -x cl | FileCheck --strict-whitespace %s #pragma OPENCL EXTENSION all : disable #pragma OPENCL EXTENSION cl_khr_int64_base_atomics : disable _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits