//===- subzero/src/IceClFlagsExtra.h - Extra Cl Flags -----------*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares command line flags primarily used for non-minimal builds.
//
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICECLFLAGSEXTRA_H
#define SUBZERO_SRC_ICECLFLAGSEXTRA_H

#include "IceDefs.h"
#include "llvm/IRReader/IRReader.h"

namespace Ice {

class ClFlagsExtra {
  ClFlagsExtra(const ClFlagsExtra &) = delete;
  ClFlagsExtra &operator=(const ClFlagsExtra &) = delete;

public:
  ClFlagsExtra() = default;

  bool getAlwaysExitSuccess() const { return AlwaysExitSuccess; }
  void setAlwaysExitSuccess(bool NewValue) { AlwaysExitSuccess = NewValue; }

  bool getBuildOnRead() const { return BuildOnRead; }
  void setBuildOnRead(bool NewValue) { BuildOnRead = NewValue; }

  bool getGenerateBuildAtts() const { return GenerateBuildAtts; }
  void setGenerateBuildAtts(bool NewValue) { GenerateBuildAtts = NewValue; }

  bool getLLVMVerboseErrors() const { return LLVMVerboseErrors; }
  void setLLVMVerboseErrors(bool NewValue) { LLVMVerboseErrors = NewValue; }

  llvm::NaClFileFormat getInputFileFormat() const { return InputFileFormat; }
  void setInputFileFormat(llvm::NaClFileFormat NewValue) {
    InputFileFormat = NewValue;
  }

  const IceString &getAppName() const { return AppName; }
  void setAppName(const IceString &NewValue) { AppName = NewValue; }

  const IceString &getIRFilename() const { return IRFilename; }
  void setIRFilename(const IceString &NewValue) { IRFilename = NewValue; }

  const IceString &getLogFilename() const { return LogFilename; }
  void setLogFilename(const IceString &NewValue) { LogFilename = NewValue; }

  const IceString &getOutputFilename() const { return OutputFilename; }
  void setOutputFilename(const IceString &NewValue) {
    OutputFilename = NewValue;
  }

private:
  bool AlwaysExitSuccess = false;
  bool BuildOnRead = false;
  bool GenerateBuildAtts = false;
  bool LLVMVerboseErrors = false;

  llvm::NaClFileFormat InputFileFormat = llvm::LLVMFormat;

  IceString AppName = "";
  IceString IRFilename = "";
  IceString LogFilename = "";
  IceString OutputFilename = "";
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICECLFLAGSEXTRA_H
