|  | //===- CompilerDriver.h - Compiler Driver -----------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file was developed by Reid Spencer and is distributed under the | 
|  | // University of Illinois Open Source License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file declares the CompilerDriver class which implements the bulk of the | 
|  | // LLVM Compiler Driver program (llvmc). | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_TOOLS_LLVMC_COMPILERDRIVER_H | 
|  | #define LLVM_TOOLS_LLVMC_COMPILERDRIVER_H | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  | #include "llvm/System/Program.h" | 
|  |  | 
|  | namespace llvm { | 
|  | /// This class provides the high level interface to the LLVM Compiler Driver. | 
|  | /// The driver's purpose is to make it easier for compiler writers and users | 
|  | /// of LLVM to utilize the compiler toolkits and LLVM toolset by learning only | 
|  | /// the interface of one program (llvmc). | 
|  | /// | 
|  | /// @see llvmc.cpp | 
|  | /// @brief The interface to the LLVM Compiler Driver. | 
|  | class CompilerDriver { | 
|  | /// @name Types | 
|  | /// @{ | 
|  | public: | 
|  | /// @brief A vector of strings, used for argument lists | 
|  | typedef std::vector<std::string> StringVector; | 
|  |  | 
|  | /// @brief A vector of sys::Path, used for path lists | 
|  | typedef std::vector<sys::Path> PathVector; | 
|  |  | 
|  | /// @brief A table of strings, indexed typically by Phases | 
|  | typedef std::vector<StringVector> StringTable; | 
|  |  | 
|  | /// @brief The phases of processing that llvmc understands | 
|  | enum Phases { | 
|  | PREPROCESSING, ///< Source language combining, filtering, substitution | 
|  | TRANSLATION,   ///< Translate source -> LLVM bitcode/assembly | 
|  | OPTIMIZATION,  ///< Optimize translation result | 
|  | ASSEMBLY,      ///< Convert program to executable | 
|  | LINKING,       ///< Link bitcode and native code | 
|  | NUM_PHASES     ///< Always last! | 
|  | }; | 
|  |  | 
|  | /// @brief The levels of optimization llvmc understands | 
|  | enum OptimizationLevels { | 
|  | OPT_FAST_COMPILE,         ///< Optimize to make >compile< go faster | 
|  | OPT_SIMPLE,               ///< Standard/simple optimizations | 
|  | OPT_AGGRESSIVE,           ///< Aggressive optimizations | 
|  | OPT_LINK_TIME,            ///< Aggressive + LinkTime optimizations | 
|  | OPT_AGGRESSIVE_LINK_TIME, ///< Make it go way fast! | 
|  | OPT_NONE                  ///< No optimizations. Keep this at the end! | 
|  | }; | 
|  |  | 
|  | /// @brief Action specific flags | 
|  | enum ConfigurationFlags { | 
|  | REQUIRED_FLAG        = 0x0001, ///< Should the action always be run? | 
|  | PREPROCESSES_FLAG    = 0x0002, ///< Does this action preprocess? | 
|  | TRANSLATES_FLAG      = 0x0004, ///< Does this action translate? | 
|  | OUTPUT_IS_ASM_FLAG   = 0x0008, ///< Action produces .ll files? | 
|  | FLAGS_MASK           = 0x000F  ///< Union of all flags | 
|  | }; | 
|  |  | 
|  | /// This type is the input list to the CompilerDriver. It provides | 
|  | /// a vector of pathname/filetype pairs. The filetype is used to look up | 
|  | /// the configuration of the actions to be taken by the driver. | 
|  | /// @brief The Input Data to the execute method | 
|  | typedef std::vector<std::pair<sys::Path,std::string> > InputList; | 
|  |  | 
|  | /// This type is read from configuration files or otherwise provided to | 
|  | /// the CompilerDriver through a "ConfigDataProvider". It serves as both | 
|  | /// the template of what to do and the actual Action to be executed. | 
|  | /// @brief A structure to hold the action data for a given source | 
|  | /// language. | 
|  | struct Action { | 
|  | Action() : flags(0) {} | 
|  | sys::Path program; ///< The program to execve | 
|  | StringVector args; ///< Arguments to the program | 
|  | unsigned flags;    ///< Action specific flags | 
|  | void set(unsigned fl ) { flags |= fl; } | 
|  | void clear(unsigned fl) { flags &= (FLAGS_MASK ^ fl); } | 
|  | bool isSet(unsigned fl) { return (flags&fl) != 0; } | 
|  | }; | 
|  |  | 
|  | struct ConfigData { | 
|  | ConfigData(); | 
|  | std::string version;    ///< The version number. | 
|  | std::string langName;   ///< The name of the source language | 
|  | StringTable opts;       ///< The o10n options for each level | 
|  | StringVector libpaths;  ///< The library paths | 
|  | Action PreProcessor;    ///< PreProcessor command line | 
|  | Action Translator;      ///< Translator command line | 
|  | Action Optimizer;       ///< Optimizer command line | 
|  | Action Assembler;       ///< Assembler command line | 
|  | Action Linker;          ///< Linker command line | 
|  | }; | 
|  |  | 
|  | /// This pure virtual interface class defines the interface between the | 
|  | /// CompilerDriver and other software that provides ConfigData objects to | 
|  | /// it. The CompilerDriver must be configured to use an object of this | 
|  | /// type so it can obtain the configuration data. | 
|  | /// @see setConfigDataProvider | 
|  | /// @brief Configuration Data Provider interface | 
|  | class ConfigDataProvider { | 
|  | public: | 
|  | virtual ~ConfigDataProvider(); | 
|  | virtual ConfigData* ProvideConfigData(const std::string& filetype) = 0; | 
|  | virtual void setConfigDir(const sys::Path& dirName) = 0; | 
|  | }; | 
|  |  | 
|  | /// These flags control various actions of the compiler driver. They are | 
|  | /// used by adding the needed flag values together and passing them to the | 
|  | /// compiler driver's setDriverFlags method. | 
|  | /// @see setDriverFlags | 
|  | /// @brief Driver specific flags | 
|  | enum DriverFlags { | 
|  | DRY_RUN_FLAG         = 0x0001, ///< Do everything but execute actions | 
|  | VERBOSE_FLAG         = 0x0002, ///< Print each action | 
|  | DEBUG_FLAG           = 0x0004, ///< Print debug information | 
|  | TIME_PASSES_FLAG     = 0x0008, ///< Time the passes as they execute | 
|  | TIME_ACTIONS_FLAG    = 0x0010, ///< Time the actions as they execute | 
|  | SHOW_STATS_FLAG      = 0x0020, ///< Show pass statistics | 
|  | EMIT_NATIVE_FLAG     = 0x0040, ///< Emit native code instead of bc | 
|  | EMIT_RAW_FLAG        = 0x0080, ///< Emit raw, unoptimized bitcode | 
|  | KEEP_TEMPS_FLAG      = 0x0100, ///< Don't delete temporary files | 
|  | STRIP_OUTPUT_FLAG    = 0x0200, ///< Strip symbols from linked output | 
|  | DRIVER_FLAGS_MASK    = 0x03FF  ///< Union of the above flags | 
|  | }; | 
|  |  | 
|  | /// @} | 
|  | /// @name Constructors | 
|  | /// @{ | 
|  | public: | 
|  | /// @brief Static Constructor | 
|  | static CompilerDriver* Get(ConfigDataProvider& CDP); | 
|  |  | 
|  | /// @brief Virtual destructor | 
|  | virtual ~CompilerDriver(); | 
|  |  | 
|  | /// @} | 
|  | /// @name Methods | 
|  | /// @{ | 
|  | public: | 
|  | /// @brief Execute the actions requested for the given input list. | 
|  | virtual int execute( | 
|  | const InputList& list, const sys::Path& output, std::string& ErrMsg) =0; | 
|  |  | 
|  | /// @brief Set the final phase at which compilation terminates | 
|  | virtual void setFinalPhase(Phases phase) = 0; | 
|  |  | 
|  | /// @brief Set the optimization level for the compilation | 
|  | virtual void setOptimization(OptimizationLevels level) = 0; | 
|  |  | 
|  | /// @brief Set the driver flags. | 
|  | virtual void setDriverFlags(unsigned flags) = 0; | 
|  |  | 
|  | /// @brief Set the output machine name. | 
|  | virtual void setOutputMachine(const std::string& machineName) = 0; | 
|  |  | 
|  | /// @brief Set the options for a given phase. | 
|  | virtual void setPhaseArgs(Phases phase, const StringVector& opts) = 0; | 
|  |  | 
|  | /// @brief Set Library Paths | 
|  | virtual void setIncludePaths(const StringVector& paths) = 0; | 
|  |  | 
|  | /// @brief Set Library Paths | 
|  | virtual void setSymbolDefines(const StringVector& paths) = 0; | 
|  |  | 
|  | /// @brief Set Library Paths | 
|  | virtual void setLibraryPaths(const StringVector& paths) = 0; | 
|  |  | 
|  | /// @brief Add a path to the list of library paths | 
|  | virtual void addLibraryPath( const sys::Path& libPath )  = 0; | 
|  |  | 
|  | /// @brief Add a path to the list of paths in which to find tools | 
|  | virtual void addToolPath( const sys::Path& toolPath) = 0; | 
|  |  | 
|  | /// @brief Set the list of -f options to be passed through | 
|  | virtual void setfPassThrough(const StringVector& fOpts) = 0; | 
|  |  | 
|  | /// @brief Set the list of -M options to be passed through | 
|  | virtual void setMPassThrough(const StringVector& fOpts) = 0; | 
|  |  | 
|  | /// @brief Set the list of -W options to be passed through | 
|  | virtual void setWPassThrough(const StringVector& fOpts) = 0; | 
|  |  | 
|  | /// @brief Determine where a linkage file is located in the file system | 
|  | virtual sys::Path GetPathForLinkageItem( | 
|  | const std::string& link_item, ///< Item to be sought | 
|  | bool native = false           ///< Looking for native? | 
|  | ) = 0; | 
|  |  | 
|  | /// @} | 
|  | }; | 
|  | } | 
|  |  | 
|  | // vim: sw=2 smartindent smarttab tw=80 autoindent expandtab | 
|  | #endif |