| //===-- ToolChain.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 ToolChain class (helper for driver functionality). |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef GOLLVM_DRIVER_TOOLCHAIN_H |
| #define GOLLVM_DRIVER_TOOLCHAIN_H |
| |
| #include <string> |
| #include "llvm/ADT/Triple.h" |
| #include "llvm/Option/ArgList.h" |
| |
| #include "Action.h" |
| #include "Tool.h" |
| |
| namespace gollvm { |
| namespace driver { |
| |
| class Tool; |
| class Driver; |
| |
| typedef llvm::SmallVector<std::string, 8> pathlist; |
| |
| // Abstract class for a collection of compiler tools. A given toolchain |
| // will create Tool objects for use in carrying out specific actions. |
| |
| class ToolChain { |
| public: |
| // Return compiler, assembler, linker tools |
| Tool *getCompiler(); |
| Tool *getAssembler(); |
| Tool *getLinker(); |
| |
| // Ask for correct tool based on action type |
| Tool *getTool(Action *act); |
| |
| // Locate a given file within the file search path. |
| std::string getFilePath(const char *afile); |
| |
| // Locate a program (tool) within the program search path. |
| std::string getProgramPath(const char *atool); |
| |
| // Return filepath and programpath lists. |
| pathlist &programPaths() { |
| return programPaths_; |
| } |
| pathlist &filePaths() { |
| return filePaths_; |
| } |
| |
| virtual std::string getDynamicLinker(const llvm::opt::ArgList &args) = 0; |
| |
| // Getters driver. |
| Driver &driver() const { return driver_; } |
| |
| virtual ~ToolChain(); |
| |
| protected: |
| ToolChain(Driver &driver, |
| const llvm::Triple &targetTriple); |
| llvm::Triple &triple() { return triple_; } |
| |
| // Build new tool of the appropriate type |
| virtual Tool *buildCompiler() = 0; |
| virtual Tool *buildAssembler() = 0; |
| virtual Tool *buildLinker() = 0; |
| |
| private: |
| Driver &driver_; |
| llvm::Triple triple_; |
| std::unique_ptr<Tool> compiler_; |
| std::unique_ptr<Tool> assembler_; |
| std::unique_ptr<Tool> linker_; |
| std::unique_ptr<Tool> stdinReader_; |
| |
| // List of places to look for tools (ld, as, etc) |
| pathlist programPaths_; |
| |
| // List of places to look for object files (ex: crt0.o) |
| pathlist filePaths_; |
| |
| Tool *getStdinReader(bool mustBeEmpty); |
| |
| ToolChain &thisToolChain() { |
| ToolChain *tc = const_cast<ToolChain*>(this); |
| return *tc; |
| } |
| }; |
| |
| } // end namespace driver |
| } // end namespace gollvm |
| |
| #endif // GOLLVM_DRIVER_TOOLCHAIN_H |