| //===-- Tool.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 Tool class (helper for driver functionality). |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef GOLLVM_DRIVER_TOOL_H |
| #define GOLLVM_DRIVER_TOOL_H |
| |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/ADT/Triple.h" |
| #include "Artifact.h" |
| |
| namespace gollvm { |
| namespace driver { |
| |
| class Action; |
| class Compilation; |
| class ExternalTool; |
| class InternalTool; |
| class ToolChain; |
| |
| // Abstract class representing a compilation helper "tool", such as an |
| // assembler or linker. A tool reads a set of file inputs and produces |
| // an output file. Tool objects are either "external" or "internal"; for |
| // the latter the tool itself is capable or performing an action, |
| // for the former the tool works by constructing a command line for some |
| // external program to carry out the action. |
| |
| class Tool { |
| public: |
| enum ToolClass { External, Internal }; |
| Tool(const char *name, ToolChain &tc, ToolClass klass); |
| virtual ~Tool(); |
| |
| ToolChain &toolchain() { return toolchain_; } |
| const char *name() const { return name_; } |
| |
| inline InternalTool *castToInternalTool(); |
| inline const InternalTool *castToInternalTool() const; |
| inline ExternalTool *castToExternalTool(); |
| inline const ExternalTool *castToExternalTool() const; |
| |
| private: |
| const char *name_; |
| ToolChain &toolchain_; |
| ToolClass klass_; |
| }; |
| |
| // An "internal" tool -- carries out the steps needs to perform some |
| // action (such as compilation or assembly) within the driver itself |
| // (as opposed to via invocation of an external program). |
| |
| class InternalTool : public Tool { |
| public: |
| InternalTool(const char *name, |
| ToolChain &tc, |
| const std::string &executablePath); |
| virtual ~InternalTool(); |
| |
| // Given a specific action, perform the action now (as opposed to |
| // invoking an external program to perform the action). Return value |
| // is true for success, false otherwise. |
| virtual bool performAction(Compilation &compilation, |
| const Action &jobAction, |
| const ArtifactList &inputArtifacts, |
| const Artifact &output) = 0; |
| |
| // Helper to emit output for "-v" or "-###" command line option when supplied |
| // to an internal tool. Return value is TRUE if if the compilation should be |
| // stubbed out (-###) or FALSE otherwise. |
| bool emitMinusVOrHashHashHash(const llvm::Triple &triple, |
| const Artifact &output, |
| const Action &jobAction); |
| |
| // Executable path, if applicable. |
| std::string executablePath() const { |
| return executablePath_; |
| } |
| |
| private: |
| ToolChain &tc_; |
| std::string executablePath_; |
| }; |
| |
| // An "external" tool -- carries out the steps needs to perform |
| // an action via invocation of a program external to the driver. |
| |
| class ExternalTool : public Tool { |
| public: |
| ExternalTool(const char *name, ToolChain &tc); |
| virtual ~ExternalTool(); |
| |
| // Given a specific action, add a new Command to 'compilation' to |
| // carry out that action via the invocation of an external program |
| // (such as a linker or assembler). Return value is true for |
| // success, false otherwise. |
| virtual bool constructCommand(Compilation &compilation, |
| const Action &jobAction, |
| const ArtifactList &inputArtifacts, |
| const Artifact &output) = 0; |
| |
| private: |
| }; |
| |
| inline InternalTool *Tool::castToInternalTool() { |
| return klass_ == Internal ? static_cast<InternalTool*>(this) : nullptr; |
| } |
| |
| inline const InternalTool *Tool::castToInternalTool() const { |
| return klass_ == Internal ? static_cast<const InternalTool*>(this) : nullptr; |
| } |
| |
| inline ExternalTool *Tool::castToExternalTool() { |
| return klass_ == External ? static_cast<ExternalTool*>(this) : nullptr; |
| } |
| |
| inline const ExternalTool *Tool::castToExternalTool() const { |
| return klass_ == External ? static_cast<const ExternalTool*>(this) : nullptr; |
| } |
| |
| } // end namespace driver |
| } // end namespace gollvm |
| |
| #endif // GOLLVM_DRIVER_TOOL_H |