| //===-- PassByValue.cpp ---------------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// \brief This file provides the implementation of the ReplaceAutoPtrTransform |
| /// class. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "PassByValue.h" |
| #include "PassByValueActions.h" |
| #include "PassByValueMatchers.h" |
| |
| using namespace clang; |
| using namespace clang::tooling; |
| using namespace clang::ast_matchers; |
| |
| int PassByValueTransform::apply(const tooling::CompilationDatabase &Database, |
| const std::vector<std::string> &SourcePaths) { |
| ClangTool Tool(Database, SourcePaths); |
| unsigned AcceptedChanges = 0; |
| unsigned RejectedChanges = 0; |
| MatchFinder Finder; |
| ConstructorParamReplacer Replacer(AcceptedChanges, RejectedChanges, |
| /*Owner=*/ *this); |
| |
| Finder.addMatcher(makePassByValueCtorParamMatcher(), &Replacer); |
| |
| // make the replacer available to handleBeginSource() |
| this->Replacer = &Replacer; |
| |
| if (Tool.run(createActionFactory(Finder))) { |
| llvm::errs() << "Error encountered during translation.\n"; |
| return 1; |
| } |
| |
| setAcceptedChanges(AcceptedChanges); |
| setRejectedChanges(RejectedChanges); |
| return 0; |
| } |
| |
| bool PassByValueTransform::handleBeginSource(CompilerInstance &CI, |
| llvm::StringRef Filename) { |
| assert(Replacer && "Replacer not set"); |
| IncludeManager.reset(new IncludeDirectives(CI)); |
| Replacer->setIncludeDirectives(IncludeManager.get()); |
| return Transform::handleBeginSource(CI, Filename); |
| } |
| |
| struct PassByValueFactory : TransformFactory { |
| PassByValueFactory() { |
| // Based on the Replace Auto-Ptr Transform that is also using std::move(). |
| Since.Clang = Version(3, 0); |
| Since.Gcc = Version(4, 6); |
| Since.Icc = Version(13); |
| Since.Msvc = Version(11); |
| } |
| |
| Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { |
| return new PassByValueTransform(Opts); |
| } |
| }; |
| |
| // Register the factory using this statically initialized variable. |
| static TransformFactoryRegistry::Add<PassByValueFactory> |
| X("pass-by-value", "Pass parameters by value where possible"); |
| |
| // This anchor is used to force the linker to link in the generated object file |
| // and thus register the factory. |
| volatile int PassByValueTransformAnchorSource = 0; |