blob: c20e14b2b8f6ba8adb7b723483389c2836cd29b9 [file] [log] [blame] [edit]
//===-- 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