| //===-- Compilation.h -----------------------------------------------------===// |
| // |
| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Defines the Compilation class (helper for driver functionality). |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef GOLLVM_DRIVER_COMPILATION_H |
| #define GOLLVM_DRIVER_COMPILATION_H |
| |
| #include <string> |
| #include "Action.h" |
| #include "Command.h" |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/Option/OptTable.h" |
| #include "llvm/Option/ArgList.h" |
| |
| namespace gollvm { |
| namespace driver { |
| |
| class Command; |
| class Driver; |
| class Tool; |
| class ToolChain; |
| |
| // Compilation class: this is primarily a container for state |
| // related to the compilation: driver, toolchain, list of actions, |
| // list of commands, temporary files, etc. |
| |
| class Compilation { |
| public: |
| Compilation(Driver &driver, |
| ToolChain &toolChain); |
| ~Compilation(); |
| |
| // Execute queued commands to invoke external tools. |
| // Return is true for success, false for error; |
| bool executeCommands(); |
| |
| // Generate a new temp file and return an artifact for it. Here |
| // llvm::Optional is used in case the temp file creation fails for |
| // some reason. |
| llvm::Optional<Artifact*> createTemporaryFileArtifact(Action *act); |
| |
| // Create new artifact based on file name. If 'isTempfile' is set, |
| // the file should be scheduled for deletion after compilation finishes. |
| Artifact *newFileArtifact(const char *path, bool isTempFile); |
| |
| // Return an artifact corresponding to the proper output file (depends |
| // on action plus command line flags). |
| Artifact* createOutputFileArtifact(Action *act); |
| |
| // Create a dummy artifact to hold the output of the specified |
| // action. For unit testing. |
| Artifact* createFakeFileArtifact(Action *act); |
| |
| // Toolchain, driver |
| ToolChain &toolchain() { return toolchain_; } |
| Driver &driver() { return driver_; } |
| |
| // Table of options |
| llvm::opt::OptTable &opts(); |
| |
| // Command line arguments |
| llvm::opt::InputArgList &args(); |
| |
| // First input file basename. |
| std::string firstFileBase(); |
| |
| // Compilation actions (built up by driver) |
| ActionList &actions() { return actions_; } |
| |
| // Commands to carry out compilation |
| CommandList &commands(); |
| |
| // Create new input artifact based on arg. |
| Artifact *newArgArtifact(llvm::opt::Arg *arg); |
| |
| // Push this action onto the owned actions list. |
| template <typename T> void recordAction(T *act) { |
| assert(act != nullptr); |
| ownedActions_.push_back(std::unique_ptr<Action>(act)); |
| } |
| |
| // Schedule this action as part of the compilation. |
| void addAction(Action *act) { |
| actions_.push_back(act); |
| } |
| |
| // Create a new command and add to the commands list. |
| void addCommand(const Action &srcAction, |
| const Tool &creatingTool, |
| const char *executable, |
| llvm::opt::ArgStringList &args); |
| |
| private: |
| Driver &driver_; |
| ToolChain &toolchain_; |
| ActionList actions_; |
| CommandList commands_; |
| std::string outFileName_; |
| llvm::SmallVector<std::unique_ptr<Action>, 8> ownedActions_; |
| llvm::SmallVector<std::unique_ptr<Artifact>, 8> ownedArtifacts_; |
| llvm::SmallVector<std::unique_ptr<Command>, 8> ownedCommands_; |
| llvm::SmallVector<const char *, 8> tempFileNames_; |
| llvm::SmallVector<std::string, 8> paths_; |
| }; |
| |
| } // end namespace driver |
| } // end namespace gollvm |
| |
| #endif // GOLLVM_DRIVER_COMPILATION_H |