//===--- Plugin.h - The LLVM Compiler Driver --------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open
// Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Plugin support for llvmc.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_INCLUDE_COMPILER_DRIVER_PLUGIN_H
#define LLVM_INCLUDE_COMPILER_DRIVER_PLUGIN_H

#include "llvm/Support/Registry.h"

namespace llvmc {

  class LanguageMap;
  class CompilationGraph;

  /// BasePlugin - An abstract base class for all LLVMC plugins.
  struct BasePlugin {

    /// Priority - Plugin priority, useful for handling dependencies
    /// between plugins. Plugins with lower priorities are loaded
    /// first.
    virtual int Priority() const { return 0; }

    /// PreprocessOptions - The auto-generated function that performs various
    /// consistency checks on options (like ensuring that -O2 and -O3 are not
    /// used together).
    virtual int PreprocessOptions() const = 0;

    /// PopulateLanguageMap - The auto-generated function that fills in
    /// the language map (map from file extensions to language names).
    virtual int PopulateLanguageMap(LanguageMap&) const = 0;

    /// PopulateCompilationGraph - The auto-generated function that
    /// populates the compilation graph with nodes and edges.
    virtual int PopulateCompilationGraph(CompilationGraph&) const = 0;

    /// Needed to avoid a compiler warning.
    virtual ~BasePlugin() {}
  };

  typedef llvm::Registry<BasePlugin> PluginRegistry;

  template <class P>
  struct RegisterPlugin
    : public PluginRegistry::Add<P> {
    typedef PluginRegistry::Add<P> Base;

    RegisterPlugin(const char* Name = "Nameless",
                   const char* Desc = "Auto-generated plugin")
      : Base(Name, Desc) {}
  };


  /// PluginLoader - Helper class used by the main program for
  /// lifetime management.
  struct PluginLoader {
    PluginLoader();
    ~PluginLoader();

    /// RunInitialization - Calls PreprocessOptions, PopulateLanguageMap and
    /// PopulateCompilationGraph methods of all plugins. This populates the
    /// global language map and the compilation graph.
    int RunInitialization(LanguageMap& langMap, CompilationGraph& graph) const;

  private:
    // noncopyable
    PluginLoader(const PluginLoader& other);
    const PluginLoader& operator=(const PluginLoader& other);
  };

}

#endif // LLVM_INCLUDE_COMPILER_DRIVER_PLUGIN_H
