diff options
Diffstat (limited to 'tools/llvmc/CompilerDriver.h')
-rw-r--r-- | tools/llvmc/CompilerDriver.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/tools/llvmc/CompilerDriver.h b/tools/llvmc/CompilerDriver.h new file mode 100644 index 0000000..f2be5cc --- /dev/null +++ b/tools/llvmc/CompilerDriver.h @@ -0,0 +1,206 @@ +//===- 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 |