//===- 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 #include #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 StringVector; /// @brief A vector of sys::Path, used for path lists typedef std::vector PathVector; /// @brief A table of strings, indexed typically by Phases typedef std::vector StringTable; /// @brief The phases of processing that llvmc understands enum Phases { PREPROCESSING, ///< Source language combining, filtering, substitution TRANSLATION, ///< Translate source -> LLVM bytecode/assembly OPTIMIZATION, ///< Optimize translation result ASSEMBLY, ///< Convert program to executable LINKING, ///< Link bytecode 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 > 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 bytecode 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) = 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