/*
 * Copyright 2012, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef BCC_SUPPORT_COMPILER_CONFIG_H
#define BCC_SUPPORT_COMPILER_CONFIG_H

#include <string>
#include <vector>

#include <llvm/ADT/Optional.h>
#include <llvm/ADT/Triple.h>
#include <llvm/Support/CodeGen.h>
#include <llvm/Target/TargetOptions.h>

namespace llvm {

class Target;

} // end namespace llvm

namespace bcc {

class CompilerConfig {
private:
  //===--------------------------------------------------------------------===//
  // Available Configurations
  //===--------------------------------------------------------------------===//
  std::string mTriple;

  // Optional. If given, the name of the target CPU to generate code for.
  std::string mCPU;

  llvm::TargetOptions mTargetOpts;

  llvm::CodeModel::Model mCodeModel;

  llvm::CodeGenOpt::Level mOptLevel;

  llvm::Optional<llvm::Reloc::Model> mRelocModel;

  // Are we set up to compile for full precision or something reduced?
  bool mFullPrecision;

  // The list of target specific features to enable or disable -- this should
  // be a list of strings starting with '+' (enable) or '-' (disable).
  std::string mFeatureString;

  //===--------------------------------------------------------------------===//
  // These are generated by CompilerConfig during initialize().
  //===--------------------------------------------------------------------===//
  const llvm::Target *mTarget;
  bool initializeTarget();

  llvm::Triple::ArchType mArchType;
  bool initializeArch();

public:
  //===--------------------------------------------------------------------===//
  // Getters
  //===--------------------------------------------------------------------===//
  inline const std::string &getTriple() const
  { return mTriple; }

  inline const std::string &getCPU() const
  { return mCPU; }
  inline void setCPU(const std::string &pCPU)
  { mCPU = pCPU; }

  inline const llvm::TargetOptions &getTargetOptions() const
  { return mTargetOpts; }
  inline llvm::TargetOptions &getTargetOptions()
  { return mTargetOpts; }

  inline llvm::CodeModel::Model getCodeModel() const
  { return mCodeModel; }
  inline void setCodeModel(llvm::CodeModel::Model pCodeMode)
  { mCodeModel = pCodeMode; }

  inline llvm::CodeGenOpt::Level getOptimizationLevel() const
  { return mOptLevel; }
  inline void setOptimizationLevel(llvm::CodeGenOpt::Level pOptLvl)
  { mOptLevel = pOptLvl; }

  inline llvm::Optional<llvm::Reloc::Model> getRelocationModel() const
  { return mRelocModel; }
  inline void setRelocationModel(llvm::Reloc::Model pRelocModel)
  { mRelocModel = pRelocModel; }

  inline const llvm::Target *getTarget() const
  { return mTarget; }

  inline llvm::Triple::ArchType getArchType() const
  { return mArchType; }

  inline bool getFullPrecision() const
  { return mFullPrecision; }
  inline void setFullPrecision(bool pFullPrecision) {
    mFullPrecision = pFullPrecision;
    // Note that we have to reinitialize here to ensure that mFeatureString
    // is up to date.
    initializeArch();
  }

  inline const std::string &getFeatureString() const
  { return mFeatureString; }
  void setFeatureString(const std::vector<std::string> &pAttrs);

  explicit CompilerConfig(const std::string &pTriple);

  virtual ~CompilerConfig() { }
};

} // end namespace bcc

#endif  // BCC_SUPPORT_COMPILER_CONFIG_H
