blob: 3b2813d4d918f091753f326ed36ff0cef48d30e0 [file] [log] [blame] [edit]
//===-- Driver.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 Driver class (helper for driver functionality).
//
//===----------------------------------------------------------------------===//
#ifndef GOLLVM_DRIVER_DRIVER_H
#define GOLLVM_DRIVER_DRIVER_H
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/OptTable.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetOptions.h"
#include "Action.h"
#include "Artifact.h"
#include "GollvmOptions.h"
#include <unordered_map>
namespace gollvm {
namespace driver {
class Compilation;
class InternalTool;
class ToolChain;
// Driver class. Drives the process of translating a given command
// line into a series of compilation actions, then into commands to
// carry out those actions.
class Driver {
public:
Driver(llvm::opt::InputArgList &args,
llvm::opt::OptTable *optTable,
const char *argv0,
bool using_splitstack);
~Driver();
// Set up target and select toolchain. Returns nullptr on error.
ToolChain *setup();
// Create compilation object
std::unique_ptr<Compilation> buildCompilation(ToolChain &tc);
// Build actions for compilation. Returns false if error.
bool buildActions(Compilation &compilation);
// Emit actions as string, for unit testing.
std::string dumpActions(Compilation &compilation);
// Process the action list. This means:
// - execute any non-dependent actions that don't require the
// invocation of an external tool, and
// - generate generate a list of commands for invoking external tools.
// Return is true for success, false for error;
bool processActions(Compilation &compilation);
// Locate an object file needed for linking (ex: crt0.o)
std::string getFilePath(llvm::StringRef name, ToolChain &toolchain);
// Locate an external tool (ex: "as"). Returns a full path if a hit
// is found, otherwise just returns its name argument.
std::string getProgramPath(llvm::StringRef name, ToolChain &toolchain);
// For constructing default output file with -c, -S, etc.
std::string firstFileBase();
// Getters
const llvm::Triple &triple() const { return triple_; }
llvm::opt::InputArgList &args() { return args_; }
llvm::opt::OptTable &opts() { return *opts_; }
const char *progname() const { return progname_; }
const std::string &executablePath() const { return executablePath_; }
// Name of driver (program invoked)
std::string name();
// Sysroot (or empty string if not present)
std::string sysRoot() { return sysroot_; }
// gccToolchainDir (or empty string if not present)
std::string gccToolchainDir() { return gccToolchainDir_; }
// Install directory of compiler binary.
std::string installDir() { return installDir_; }
// Installed lib dir (binary dir above plus ../lib64)
std::string installedLibDir();
// Prefix directories (supplied via -B args)
const std::vector<std::string> &prefixes() const { return prefixes_; }
// Helpers related to command line options.
llvm::PICLevel::Level getPicLevel();
llvm::PIELevel::Level getPieLevel();
bool picIsPIE();
bool isPIE();
bool useIntegratedAssembler();
bool supportedAsmOptions();
bool determineDebugCompressionType(llvm::DebugCompressionType *dct);
bool usingSplitStack() const { return usingSplitStack_; }
template<typename IT>
llvm::Optional<IT> getLastArgAsInteger(gollvm::options::ID id,
IT defaultValue);
llvm::Optional<llvm::Reloc::Model> reconcileRelocModel();
bool reconcileOptionPair(gollvm::options::ID yesOption,
gollvm::options::ID noOption,
bool defaultVal);
llvm::Optional<llvm::FPOpFusion::FPOpFusionMode> getFPOpFusionMode();
typedef llvm::SmallVector<llvm::opt::Arg *, 8> inarglist;
void appendInputActions(const inarglist &infiles,
ActionList &result,
Compilation &compilation);
static void emitVersion();
// Get/set unit testing mode. In unit testing mode we don't
// check for the existence of input files.
void setUnitTesting() { unitTesting_ = true; }
bool unitTesting() const { return unitTesting_; }
private:
llvm::Triple triple_;
llvm::opt::InputArgList &args_;
llvm::opt::OptTable *opts_;
const char *progname_;
std::string sysroot_;
std::string gccToolchainDir_;
std::string installDir_;
std::string executablePath_;
// maps target to toolchain for that target
llvm::StringMap<std::unique_ptr<ToolChain>> toolchains_;
// Maps non-input actions to output artifacts.
std::unordered_map<Action *, Artifact*> artmap_;
std::vector<std::string> prefixes_;
bool usingSplitStack_;
bool unitTesting_;
bool processAction(Action *act, Compilation &compilation, bool lastAct);
ArtifactList collectInputArtifacts(Action *act, InternalTool *it);
llvm::DebugCompressionType *gzArgToDCT(llvm::StringRef ga,
llvm::DebugCompressionType *dct,
const char *which);
};
template<typename IT>
llvm::Optional<IT>
Driver::getLastArgAsInteger(gollvm::options::ID id,
IT defaultValue)
{
IT result = defaultValue;
llvm::opt::Arg *arg = args_.getLastArg(id);
if (arg != nullptr) {
if (llvm::StringRef(arg->getValue()).getAsInteger(10, result)) {
llvm::errs() << progname_ << ": invalid argument '"
<< arg->getValue() << "' to '"
<< arg->getAsString(args_) << "' option\n";
return llvm::None;
}
}
return result;
}
} // end namespace driver
} // end namespace gollvm
#endif // GOLLVM_DRIVER_DRIVER_H