//===-- Core/Transforms.cpp - class Transforms Impl -----------------------===//
//
//                     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 for class Transforms.
///
//===----------------------------------------------------------------------===//

#include "Core/Transforms.h"
#include "Core/Transform.h"

namespace cl = llvm::cl;

cl::OptionCategory TransformCategory("Transforms");

Transforms::~Transforms() {
  for (std::vector<Transform *>::iterator I = ChosenTransforms.begin(),
                                          E = ChosenTransforms.end();
       I != E; ++I)
    delete *I;

  for (OptionMap::iterator I = Options.begin(), E = Options.end(); I != E; ++I)
    delete I->getValue();
}

void Transforms::registerTransforms() {
  for (TransformFactoryRegistry::iterator I = TransformFactoryRegistry::begin(),
                                          E = TransformFactoryRegistry::end();
       I != E; ++I)
    Options[I->getName()] = new cl::opt<bool>(
        I->getName(), cl::desc(I->getDesc()), cl::cat(TransformCategory));
}

bool Transforms::hasAnyExplicitOption() const {
  for (OptionMap::const_iterator I = Options.begin(), E = Options.end(); I != E;
       ++I)
    if (*I->second)
      return true;
  return false;
}

void
Transforms::createSelectedTransforms(const TransformOptions &GlobalOptions,
                                     const CompilerVersions &RequiredVersions) {
  // if at least one transform is set explicitly on the command line, do not
  // enable non-explicit ones
  bool EnableAllTransformsByDefault = !hasAnyExplicitOption();

  for (TransformFactoryRegistry::iterator I = TransformFactoryRegistry::begin(),
                                          E = TransformFactoryRegistry::end();
       I != E; ++I) {
    bool ExplicitlyEnabled = *Options[I->getName()];
    bool OptionEnabled = EnableAllTransformsByDefault || ExplicitlyEnabled;

    if (!OptionEnabled)
      continue;

    llvm::OwningPtr<TransformFactory> Factory(I->instantiate());
    if (Factory->supportsCompilers(RequiredVersions))
      ChosenTransforms.push_back(Factory->createTransform(GlobalOptions));
    else if (ExplicitlyEnabled)
      llvm::errs() << "note: " << '-' << I->getName()
                   << ": transform not available for specified compilers\n";
  }
}
