Switch to use RSCompilerDriver.

This commit is large. It does:

1. Clean-up RSScript. ScriptCached and ScriptCompiled are removed.
2. Switch to use CompilerConfig.
3. Switch to use RSInfo. MCCacheReader and MCCacheWriter are removed.
4. Update C API implementation of libbcc (i.e., bcc.cpp). Note that
   it'll be completely removed once there's no clients relying on it.
diff --git a/lib/ExecutionEngine/RSScript.h b/lib/ExecutionEngine/RSScript.h
index 4fc1f90..1ae9c9d 100644
--- a/lib/ExecutionEngine/RSScript.h
+++ b/lib/ExecutionEngine/RSScript.h
@@ -17,237 +17,94 @@
 #ifndef BCC_EXECUTION_ENGINE_RS_SCRIPT_H
 #define BCC_EXECUTION_ENGINE_RS_SCRIPT_H
 
-#include <vector>
 #include <string>
 
-#include <stdint.h>
-#include <stddef.h>
-
 #include <llvm/ADT/SmallVector.h>
 #include <llvm/Support/CodeGen.h>
 
-#include <bcc/bcc.h>
-#include <bcc/bcc_mccache.h>
-#include "bcc_internal.h"
-
 #include "Script.h"
 
-namespace llvm {
-  class Module;
-  class GDBJITRegistrar;
-}
-
 namespace bcc {
-  class RSInfo;
-  class ScriptCompiled;
-  class ScriptCached;
-  class Source;
-  struct CompilerOption;
 
-  namespace ScriptStatus {
-    enum StatusType {
-      Unknown,
-      Compiled,
-      Cached
-    };
-  }
+class RSInfo;
+class Source;
 
-  namespace ScriptObject {
-    enum ObjectType {
-      Unknown,
-      Relocatable,
-      SharedObject,
-      Executable,
-    };
-  }
-
-  class RSScript : public Script {
-  public:
-    class SourceDependency {
-    private:
-      std::string mSourceName;
-      uint8_t mSHA1[20];
-
-    public:
-      SourceDependency(const std::string &pSourceName,
-                       const uint8_t *pSHA1);
-
-      inline const std::string &getSourceName() const
-      { return mSourceName; }
-
-      inline const uint8_t *getSHA1Checksum() const
-      { return mSHA1; }
-    };
-    typedef llvm::SmallVectorImpl<SourceDependency *> SourceDependencyListTy;
-
+class RSScript : public Script {
+public:
+  class SourceDependency {
   private:
-    int mErrorCode;
-
-    ScriptStatus::StatusType mStatus;
-    // The type of the object behind this script after compilation. For
-    // example, after returning from a successful call to prepareRelocatable(),
-    // the value of mObjectType will be ScriptObject::Relocatable.
-    ScriptObject::ObjectType mObjectType;
-
-    union {
-      ScriptCompiled *mCompiled;
-      ScriptCached *mCached;
-    };
-
-    std::string mCacheDir;
-    std::string mCacheName;
-
-    inline std::string getCachedObjectPath() const {
-      return std::string(mCacheDir + mCacheName + ".o");
-    }
-
-    inline std::string getCacheInfoPath() const {
-      return getCachedObjectPath().append(".info");
-    }
-
-    bool mIsContextSlotNotAvail;
-
-    llvm::SmallVector<SourceDependency *, 4> mSourceDependencies;
-
-    const RSInfo *mInfo;
-
-    // External Function List
-    std::vector<char const *> mUserDefinedExternalSymbols;
-
-    // Register Symbol Lookup Function
-    BCCSymbolLookupFn mpExtSymbolLookupFn;
-    void *mpExtSymbolLookupFnContext;
-
-    // This will be invoked when the containing source has been reset.
-    virtual bool doReset();
-
-    // Reset the state of this script object
-    void resetState();
+    std::string mSourceName;
+    uint8_t mSHA1[20];
 
   public:
-    RSScript(Source &pSource);
+    SourceDependency(const std::string &pSourceName,
+                     const uint8_t *pSHA1);
 
-    ~RSScript();
+    inline const std::string &getSourceName() const
+    { return mSourceName; }
 
-    // Add dependency information for this script given the source named
-    // pSourceName. pSHA1 is the SHA-1 checksum of the given source. Return
-    // false on error.
-    bool addSourceDependency(const std::string &pSourceName,
-                             const uint8_t *pSHA1);
+    inline const uint8_t *getSHA1Checksum() const
+    { return mSHA1; }
+  };
+  typedef llvm::SmallVectorImpl<SourceDependency *> SourceDependencyListTy;
 
-    const SourceDependencyListTy &getSourceDependencies() const
-    { return mSourceDependencies; }
-
-    // Set the associated RSInfo of the script.
-    void setInfo(const RSInfo *pInfo)
-    { mInfo = pInfo; }
-
-    const RSInfo *getInfo() const
-    { return mInfo; }
-
-    void markExternalSymbol(char const *name) {
-      mUserDefinedExternalSymbols.push_back(name);
-    }
-
-    std::vector<char const *> const &getUserDefinedExternalSymbols() const {
-      return mUserDefinedExternalSymbols;
-    }
-
-    int prepareExecutable(char const *cacheDir,
-                          char const *cacheName,
-                          unsigned long flags);
-    int writeCache();
-
-    /*
-     * Link the given bitcodes in mSource to shared object (.so).
-     *
-     * Currently, it requires one to provide the relocatable object files with
-     * given bitcodes to output a shared object.
-     *
-     * The usage of this function is flexible. You can have a relocatable object
-     * compiled before and pass it in objPath to generate shared object. If the
-     * objPath is NULL, we'll invoke prepareRelocatable() to get .o first (if
-     * you haven't done that yet) and then link the output relocatable object
-     * file to .so in dsoPath.
-     *
-     * TODO: Currently, we only support to link a bitcode (i.e., mSource.)
-     *
-     */
-    int prepareSharedObject(char const *objPath,
-                            char const *dsoPath,
-                            unsigned long flags);
-
-    int prepareRelocatable(char const *objPath,
-                           llvm::Reloc::Model RelocModel,
-                           unsigned long flags);
-
-    char const *getCompilerErrorMessage();
-
-    void *lookup(const char *name);
-
-    size_t getExportVarCount() const;
-
-    size_t getExportFuncCount() const;
-
-    size_t getExportForEachCount() const;
-
-    size_t getPragmaCount() const;
-
-    size_t getFuncCount() const;
-
-    size_t getObjectSlotCount() const;
-
-    void getExportVarList(size_t size, void **list);
-
-    void getExportFuncList(size_t size, void **list);
-
-    void getExportForEachList(size_t size, void **list);
-
-    void getExportVarNameList(std::vector<std::string> &list);
-
-    void getExportFuncNameList(std::vector<std::string> &list);
-
-    void getExportForEachNameList(std::vector<std::string> &list);
-
-    void getPragmaList(size_t size,
-                       char const **keyList,
-                       char const **valueList);
-
-    void getFuncInfoList(size_t size, FuncInfo *list);
-
-    void getObjectSlotList(size_t size, uint32_t *list);
-
-    size_t getELFSize() const;
-
-    const char *getELF() const;
-
-    int registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext);
-
-    bool isCacheable() const;
-
-    void setError(int error) {
-      if (mErrorCode == BCC_NO_ERROR && error != BCC_NO_ERROR) {
-        mErrorCode = error;
-      }
-    }
-
-    int getError() {
-      int result = mErrorCode;
-      mErrorCode = BCC_NO_ERROR;
-      return result;
-    }
-
-  private:
-    //
-    // It returns 0 if there's a cache hit.
-    //
-    // Side effect: it will set mCacheDir, mCacheName.
-    int internalLoadCache(char const *cacheDir, char const *cacheName,
-                          bool checkOnly);
-
-    int internalCompile(const CompilerOption&);
+  // 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
   };
 
-} // namespace bcc
+private:
+  llvm::SmallVector<SourceDependency *, 4> mSourceDependencies;
+
+  const RSInfo *mInfo;
+
+  unsigned mCompilerVersion;
+
+  OptimizationLevel mOptimizationLevel;
+
+private:
+  // This will be invoked when the containing source has been reset.
+  virtual bool doReset();
+
+public:
+  RSScript(Source &pSource);
+
+  // Add dependency information for this script given the source named
+  // pSourceName. pSHA1 is the SHA-1 checksum of the given source. Return
+  // false on error.
+  bool addSourceDependency(const std::string &pSourceName,
+                           const uint8_t *pSHA1);
+
+  const SourceDependencyListTy &getSourceDependencies() const
+  { return mSourceDependencies; }
+
+  // Set the associated RSInfo of the script.
+  void setInfo(const RSInfo *pInfo)
+  { mInfo = pInfo; }
+
+  const RSInfo *getInfo() const
+  { return mInfo; }
+
+  void setCompilerVersion(unsigned pCompilerVersion)
+  {  mCompilerVersion = pCompilerVersion; }
+
+  unsigned getCompilerVersion() const
+  {  return mCompilerVersion; }
+
+  void setOptimizationLevel(OptimizationLevel pOptimizationLevel)
+  {  mOptimizationLevel = pOptimizationLevel; }
+
+  OptimizationLevel getOptimizationLevel() const
+  {  return mOptimizationLevel; }
+
+  ~RSScript();
+};
+
+} // end namespace bcc
 
 #endif // BCC_EXECUTION_ENGINE_RS_SCRIPT_H