/*
 * 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_RS_SCRIPT_H
#define BCC_RS_SCRIPT_H

#include "bcc/Script.h"
#include "bcc/Support/Sha1Util.h"

namespace llvm {
  class Module;
}

namespace bcc {

class RSScript;
class Source;
class CompilerConfig;

typedef llvm::Module* (*RSLinkRuntimeCallback) (bcc::RSScript *, llvm::Module *, llvm::Module *);


class RSScript : public Script {
public:
  // This is one-one mapping with the llvm::CodeGenOpt::Level in
  // llvm/Support/CodeGen.h. Therefore, value of this type can safely cast
  // to llvm::CodeGenOpt::Level. This makes RSScript LLVM-free.
  enum OptimizationLevel {
    kOptLvl0, // -O0
    kOptLvl1, // -O1
    kOptLvl2, // -O2, -Os
    kOptLvl3  // -O3
  };

private:
  unsigned mCompilerVersion;

  OptimizationLevel mOptimizationLevel;

  RSLinkRuntimeCallback mLinkRuntimeCallback;

  bool mEmbedInfo;

  // Specifies whether we should embed global variable information in the
  // code via special RS variables that can be examined later by the driver.
  bool mEmbedGlobalInfo;

  // Specifies whether we should skip constant (immutable) global variables
  // when potentially embedding information about globals.
  bool mEmbedGlobalInfoSkipConstant;

private:
  // This will be invoked when the containing source has been reset.
  virtual bool doReset();

public:
  static bool LinkRuntime(RSScript &pScript, const char *rt_path = nullptr);

  explicit RSScript(Source &pSource);

  // Passing in the CompilerConfig allows the optimization level to
  // be derived rather than defaulted to aggressive (-O3)
  RSScript(Source &pSource, const CompilerConfig * pCompilerConfig);

  virtual ~RSScript() { }

  void setCompilerVersion(unsigned pCompilerVersion) {
    mCompilerVersion = pCompilerVersion;
  }

  unsigned getCompilerVersion() const {
    return mCompilerVersion;
  }

  void setOptimizationLevel(OptimizationLevel pOptimizationLevel) {
    mOptimizationLevel = pOptimizationLevel;
  }

  OptimizationLevel getOptimizationLevel() const {
    return mOptimizationLevel;
  }

  void setLinkRuntimeCallback(RSLinkRuntimeCallback fn){
    mLinkRuntimeCallback = fn;
  }

  void setEmbedInfo(bool pEnable) {
    mEmbedInfo = pEnable;
  }

  bool getEmbedInfo() const {
    return mEmbedInfo;
  }

  // Set to true if we should embed global variable information in the code.
  void setEmbedGlobalInfo(bool pEnable) {
    mEmbedGlobalInfo = pEnable;
  }

  // Returns true if we should embed global variable information in the code.
  bool getEmbedGlobalInfo() const {
    return mEmbedGlobalInfo;
  }

  // Set to true if we should skip constant (immutable) global variables when
  // potentially embedding information about globals.
  void setEmbedGlobalInfoSkipConstant(bool pEnable) {
    mEmbedGlobalInfoSkipConstant = pEnable;
  }

  // Returns true if we should skip constant (immutable) global variables when
  // potentially embedding information about globals.
  bool getEmbedGlobalInfoSkipConstant() const {
    return mEmbedGlobalInfoSkipConstant;
  }
};

} // end namespace bcc

#endif // BCC_RS_SCRIPT_H
