204 lines
7.5 KiB
C++
204 lines
7.5 KiB
C++
//===- subzero/src/IceClFlags.h - Cl Flags for translation ------*- C++ -*-===//
|
|
//
|
|
// The Subzero Code Generator
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// \brief Declares Ice::ClFlags which implements command line processing.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SUBZERO_SRC_ICECLFLAGS_H
|
|
#define SUBZERO_SRC_ICECLFLAGS_H
|
|
|
|
#include "IceBuildDefs.h"
|
|
#include "IceClFlags.def"
|
|
#include "IceDefs.h"
|
|
#include "IceRangeSpec.h"
|
|
#include "IceTypes.h"
|
|
|
|
#ifdef __clang__
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wunused-parameter"
|
|
#endif // __clang__
|
|
|
|
#include "llvm/IRReader/IRReader.h"
|
|
|
|
#ifdef __clang__
|
|
#pragma clang diagnostic pop
|
|
#endif // __clang__
|
|
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#ifndef PNACL_LLVM
|
|
namespace llvm {
|
|
// \brief Define the expected format of the file.
|
|
enum NaClFileFormat {
|
|
// LLVM IR source or bitcode file (as appropriate).
|
|
LLVMFormat,
|
|
// PNaCl bitcode file.
|
|
PNaClFormat,
|
|
// Autodetect if PNaCl or LLVM format.
|
|
AutodetectFileFormat
|
|
};
|
|
} // end of namespace llvm
|
|
#endif // !PNACL_LLVM
|
|
|
|
namespace Ice {
|
|
// detail defines the type cl_type_traits, which is used to define the
|
|
// getters/setters for the ClFlags class. It converts the cl_detail::*_flag
|
|
// types to appropriate types for the several getters and setters created.
|
|
namespace detail {
|
|
// Base cl_type_traits.
|
|
template <typename B, typename CL> struct cl_type_traits {};
|
|
|
|
// cl_type_traits specialized cl::list<std::string>, non-MINIMAL build.
|
|
template <> struct cl_type_traits<std::string, cl_detail::dev_list_flag> {
|
|
using storage_type = std::vector<std::string>;
|
|
};
|
|
|
|
// cl_type_traits specialized cl::list<Ice::VerboseItem>, non-MINIMAL build.
|
|
template <> struct cl_type_traits<Ice::VerboseItem, cl_detail::dev_list_flag> {
|
|
using storage_type = Ice::VerboseMask;
|
|
};
|
|
|
|
// cl_type_traits specialized cl::opt<T>, non-MINIMAL build.
|
|
template <typename T> struct cl_type_traits<T, cl_detail::dev_opt_flag> {
|
|
using storage_type = T;
|
|
};
|
|
|
|
// cl_type_traits specialized cl::opt<T>, MINIMAL build.
|
|
template <typename T> struct cl_type_traits<T, cl_detail::release_opt_flag> {
|
|
using storage_type = T;
|
|
};
|
|
|
|
} // end of namespace detail
|
|
|
|
/// Define variables which configure translation and related support functions.
|
|
class ClFlags {
|
|
ClFlags(const ClFlags &) = delete;
|
|
ClFlags &operator=(const ClFlags &) = delete;
|
|
|
|
public:
|
|
/// User defined constructor.
|
|
ClFlags() { resetClFlags(); }
|
|
|
|
/// The command line flags.
|
|
static ClFlags Flags;
|
|
|
|
/// \brief Parse commmand line options for Subzero.
|
|
///
|
|
/// This is done use cl::ParseCommandLineOptions() and the static variables of
|
|
/// type cl::opt defined in IceClFlags.cpp
|
|
static void parseFlags(int argc, const char *const *argv);
|
|
|
|
/// Reset all configuration options to their nominal values.
|
|
void resetClFlags();
|
|
|
|
/// \brief Retrieve the configuration option state
|
|
///
|
|
/// This is defined by static variables
|
|
/// anonymous_namespace{IceClFlags.cpp}::AllowErrorRecoveryObj,
|
|
/// anonymous_namespace{IceClFlags.cpp}::AllowIacaMarksObj,
|
|
/// ...
|
|
static void getParsedClFlags(ClFlags &OutFlags);
|
|
|
|
#define X(Name, Type, ClType, ...) \
|
|
private: \
|
|
using Name##StorageType = \
|
|
detail::cl_type_traits<Type, cl_detail::ClType>::storage_type; \
|
|
\
|
|
Name##StorageType Name; \
|
|
\
|
|
template <bool E> \
|
|
typename std::enable_if<E, void>::type set##Name##Impl( \
|
|
Name##StorageType Value) { \
|
|
Name = std::move(Value); \
|
|
} \
|
|
\
|
|
template <bool E> \
|
|
typename std::enable_if<!E, void>::type set##Name##Impl(Name##StorageType) { \
|
|
} \
|
|
\
|
|
public: \
|
|
Name##StorageType get##Name() const { return Name; } \
|
|
void set##Name(Name##StorageType Value) { \
|
|
/* TODO(jpp): figure out which optional flags are used in minimal, and \
|
|
what are the defaults for them. */ \
|
|
static constexpr bool Enable = \
|
|
std::is_same<cl_detail::ClType, cl_detail::release_opt_flag>::value || \
|
|
!BuildDefs::minimal() || true; \
|
|
set##Name##Impl<Enable>(std::move(Value)); \
|
|
} \
|
|
\
|
|
private:
|
|
COMMAND_LINE_FLAGS
|
|
#undef X
|
|
|
|
public:
|
|
bool isSequential() const { return NumTranslationThreads == 0; }
|
|
bool isParseParallel() const {
|
|
return getParseParallel() && !isSequential() && getBuildOnRead();
|
|
}
|
|
std::string getAppName() const { return AppName; }
|
|
void setAppName(const std::string &Value) { AppName = Value; }
|
|
|
|
/// \brief Get the value of ClFlags::GenerateUnitTestMessages
|
|
///
|
|
/// Note: If dump routines have been turned off, the error messages
|
|
/// will not be readable. Hence, turn off.
|
|
bool getGenerateUnitTestMessages() const {
|
|
return !BuildDefs::dump() || GenerateUnitTestMessages;
|
|
}
|
|
/// Set ClFlags::GenerateUnitTestMessages to a new value
|
|
void setGenerateUnitTestMessages(bool NewValue) {
|
|
GenerateUnitTestMessages = NewValue;
|
|
}
|
|
bool matchForceO2(GlobalString Name, uint32_t Number) const {
|
|
return ForceO2.match(Name, Number);
|
|
}
|
|
bool matchSplitInsts(const std::string &Name, uint32_t Number) const {
|
|
return SplitInsts.match(Name, Number);
|
|
}
|
|
bool matchTestStatus(GlobalString Name, uint32_t Number) const {
|
|
return TestStatus.match(Name, Number);
|
|
}
|
|
bool matchTimingFocus(GlobalString Name, uint32_t Number) const {
|
|
return TimingFocus.match(Name, Number);
|
|
}
|
|
bool matchTranslateOnly(GlobalString Name, uint32_t Number) const {
|
|
return TranslateOnly.match(Name, Number);
|
|
}
|
|
bool matchVerboseFocusOn(GlobalString Name, uint32_t Number) const {
|
|
return VerboseFocus.match(Name, Number);
|
|
}
|
|
bool matchVerboseFocusOn(const std::string &Name, uint32_t Number) const {
|
|
return VerboseFocus.match(Name, Number);
|
|
}
|
|
|
|
private:
|
|
std::string AppName;
|
|
|
|
/// Initialized to false; not set by the command line.
|
|
bool GenerateUnitTestMessages;
|
|
|
|
RangeSpec ForceO2;
|
|
RangeSpec SplitInsts;
|
|
RangeSpec TestStatus;
|
|
RangeSpec TimingFocus;
|
|
RangeSpec TranslateOnly;
|
|
RangeSpec VerboseFocus;
|
|
};
|
|
|
|
inline const ClFlags &getFlags() { return ClFlags::Flags; }
|
|
|
|
} // end of namespace Ice
|
|
|
|
#endif // SUBZERO_SRC_ICECLFLAGS_H
|