Rewrite 1 cache + recompilation code.
diff --git a/bcc.cpp b/bcc.cpp
index 820c184..8770528 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -18,7 +18,7 @@
 //    This is an eager-compilation JIT running on Android.
 
 // Fixed BCC_CODE_ADDR here only works for 1 cached EXE.
-// At most 1 live Compiler object will have set mBccCodeAddrTaken
+// At most 1 live Compiler object will have set BccCodeAddrTaken
 #define BCC_CODE_ADDR 0x7e00000
 
 #define LOG_TAG "bcc"
@@ -299,7 +299,7 @@
   // is initialized in GlobalInitialization()
   //
   static bool GlobalInitialized;
-  //sliao  static bool BccCodeAddrTaken;
+  static bool BccCodeAddrTaken;
 
   // If given, this will be the name of the target triple to compile for.
   // If not given, the initial values defined in this file will be used.
@@ -452,7 +452,6 @@
   ptrdiff_t mCacheDiff;   // Set by loader()
   char *mCodeDataAddr;    // Set by CodeMemoryManager if mCacheNew is true.
                           // Used by genCacheFile() for dumping
-  bool mBccCodeAddrTaken;
 
   typedef std::list< std::pair<std::string, std::string> > PragmaList;
   PragmaList mPragmas;
@@ -569,45 +568,44 @@
       reset();
       std::string ErrMsg;
 
-      //      if (!Compiler::BccCodeAddrTaken) {  // Use BCC_CODE_ADDR
-      /* TODO(sliao):
-         mpCodeMem = mmap(reinterpret_cast<void*>(BCC_CODE_ADDR),
-                       MaxCodeSize + MaxGlobalVarSize,
-                       PROT_READ | PROT_EXEC | PROT_WRITE,
-                       MAP_PRIVATE | MAP_ANON | MAP_FIXED,
-                       -1,
-                       0);
+      if (!Compiler::BccCodeAddrTaken) {  // Try to use BCC_CODE_ADDR
+        mpCodeMem = mmap(reinterpret_cast<void*>(BCC_CODE_ADDR),
+                         MaxCodeSize + MaxGlobalVarSize,
+                         PROT_READ | PROT_EXEC | PROT_WRITE,
+                         MAP_PRIVATE | MAP_ANON | MAP_FIXED,
+                         -1, 0);
 
-                       if (mpCodeMem == MAP_FAILED) {*/
+        if (mpCodeMem == MAP_FAILED) {
+          LOGE("Mmap mpCodeMem at %p failed with reason: %s.\n",
+               reinterpret_cast<void *>(BCC_CODE_ADDR), strerror(errno));
+          LOGE("Retry to mmap mpCodeMem at arbitary address\n");
+        }
+      }
+
+      if (Compiler::BccCodeAddrTaken || mpCodeMem == MAP_FAILED) {
+        // If BCC_CODE_ADDR has been occuppied, or we can't allocate
+        // mpCodeMem in previous mmap, then allocate them in arbitary
+        // location.
+
         mpCodeMem = mmap(NULL,
                          MaxCodeSize + MaxGlobalVarSize,
                          PROT_READ | PROT_EXEC | PROT_WRITE,
                          MAP_PRIVATE | MAP_ANON,
-                         -1,
-                         0);
-        //      } else {
-        //        mBccCodeAddrTaken = true;
-        //}
+                         -1, 0);
 
-      if (mpCodeMem == MAP_FAILED) {
-        llvm::report_fatal_error("Failed to allocate memory for emitting "
-                                 "codes\n" + ErrMsg);
+        if (mpCodeMem == MAP_FAILED) {
+          LOGE("Unable to mmap mpCodeMem with reason: %s.\n", strerror(errno));
+          llvm::report_fatal_error("Failed to allocate memory for emitting "
+                                   "codes\n" + ErrMsg);
+        }
       }
-      mpGVMem = (void *) ((int) mpCodeMem + MaxCodeSize);
 
-      /*      mpCodeMem = mmap(NULL, MaxCodeSize, PROT_READ | PROT_EXEC,
-                         MAP_PRIVATE | MAP_ANON, -1, 0);
-      if (mpCodeMem == MAP_FAILED)
-        llvm::report_fatal_error("Failed to allocate memory for emitting "
-                                 "function codes\n" + ErrMsg);
+      // One instance of script is occupping BCC_CODE_ADDR
+      Compiler::BccCodeAddrTaken = true;
 
-      mpGVMem = mmap(mpCodeMem, MaxGlobalVarSize,
-                     PROT_READ | PROT_WRITE,
-                     MAP_PRIVATE | MAP_ANON, -1, 0);
-      if (mpGVMem == MAP_FAILED)
-        llvm::report_fatal_error("Failed to allocate memory for emitting "
-                                 "global variables\n" + ErrMsg);
-      */
+      // Set global variable pool
+      mpGVMem = (void *) ((char *)mpCodeMem + MaxCodeSize);
+
       return;
     }
 
@@ -827,10 +825,8 @@
     }
 
     ~CodeMemoryManager() {
-      if (mpCodeMem != NULL)
-        ::munmap(mpCodeMem, MaxCodeSize);
-      if (mpGVMem != NULL)
-        ::munmap(mpGVMem, MaxGlobalVarSize);
+      if (mpCodeMem != NULL && mpCodeMem != MAP_FAILED)
+        munmap(mpCodeMem, MaxCodeSize + MaxGlobalVarSize);
       return;
     }
   };
@@ -2516,7 +2512,6 @@
         mCacheSize(0),
         mCacheDiff(0),
         mCodeDataAddr(NULL),
-        mBccCodeAddrTaken(false),
         mpSymbolLookupFn(NULL),
         mpSymbolLookupContext(NULL),
         mContext(NULL),
@@ -2547,12 +2542,16 @@
     GlobalInitialization();
 
     if (resName) {
-      // Turn off the default NeverCaching mode
-      mNeverCache = false;
+      if (!BccCodeAddrTaken) {
+        // Turn off the default NeverCaching mode
+        mNeverCache = false;
 
-      mCacheFd = openCacheFile(resName, true /* createIfMissing */);
-      if (mCacheFd >= 0 && !mCacheNew) {  // Just use cache file
-        return -mCacheFd;
+        mCacheFd = openCacheFile(resName, true /* createIfMissing */);
+        if (mCacheFd >= 0 && !mCacheNew) {  // Just use cache file
+          return -mCacheFd;
+        }
+      } else {
+        mNeverCache = true;
       }
     }
 
@@ -2642,7 +2641,9 @@
     {
       // Part 1. Deal with the non-codedata section first
       off_t heuristicCodeOffset = mCacheSize - MaxCodeSize - MaxGlobalVarSize;
-      LOGE("sliao@Loader: mCacheSize=%x, heuristicCodeOffset=%x", mCacheSize, heuristicCodeOffset);
+      LOGE("sliao@Loader: mCacheSize=%x, heuristicCodeOffset=%llx",
+           (unsigned int)mCacheSize,
+           (unsigned long long int)heuristicCodeOffset);
 
       mCacheMapAddr = (char *)malloc(heuristicCodeOffset);
       if (!mCacheMapAddr) {
@@ -2655,7 +2656,6 @@
                                               heuristicCodeOffset));
       if (nread != (size_t)heuristicCodeOffset) {
         LOGE("read(mCacheFd) failed\n");
-        free(mCacheMapAddr);
         goto bail;
       }
 
@@ -2727,7 +2727,7 @@
           mCodeDataAddr ==
           reinterpret_cast<char *>(mCacheHdr->cachedCodeDataAddr)) {
         // relocate is avoidable
-        mBccCodeAddrTaken = true;
+        BccCodeAddrTaken = true;
 
         flock(mCacheFd, LOCK_UN);
       } else {
@@ -2753,7 +2753,7 @@
       mCacheDiff = mCodeDataAddr -
                    reinterpret_cast<char *>(mCacheHdr->cachedCodeDataAddr);
 
-      if (!mBccCodeAddrTaken) {  // To relocate
+      if (!BccCodeAddrTaken) {  // To relocate
         if (mCacheHdr->rootAddr) {
           mCacheHdr->rootAddr += mCacheDiff;
         }
@@ -2822,7 +2822,7 @@
 
           delete TM;
         }
-      }  // End of if (!mBccCodeAddrTaken)
+      }  // End of if (!BccCodeAddrTaken)
     }
 
     return 0;
@@ -2830,15 +2830,14 @@
  bail:
     if (mCacheMapAddr) {
       free(mCacheMapAddr);
+      mCacheMapAddr = 0;
     }
-    if (mBccCodeAddrTaken) {
+
+    if (BccCodeAddrTaken) {
       if (munmap(mCodeDataAddr, MaxCodeSize + MaxGlobalVarSize) != 0) {
         LOGE("munmap failed: %s\n", strerror(errno));
       }
-    } else {
-      if (munmap(mCacheMapAddr, mCacheSize) != 0) {
-        LOGE("munmap failed: %s\n", strerror(errno));
-      }
+      mCodeDataAddr = 0;
     }
 
  giveup:
@@ -3328,7 +3327,6 @@
   }
 
   ~Compiler() {
-    // #ifdef BCC_CODE_ADDR
     if (mCodeDataAddr != 0 && mCodeDataAddr != MAP_FAILED) {
       if (munmap(mCodeDataAddr, MaxCodeSize + MaxGlobalVarSize) < 0) {
         LOGE("munmap failed while releasing mCodeDataAddr\n");
@@ -3336,12 +3334,6 @@
       if (mCacheMapAddr) {
         free(mCacheMapAddr);
       }
-    } else {
-      if (mCacheMapAddr != 0 && mCacheMapAddr != MAP_FAILED) {
-        if (munmap(mCacheMapAddr, mCacheSize) < 0) {
-          LOGE("munmap failed while releasing mCacheMapAddr\n");
-        }
-      }
     }
 
     delete mModule;
@@ -3862,6 +3854,8 @@
 
 bool Compiler::GlobalInitialized = false;
 
+bool Compiler::BccCodeAddrTaken = false;
+
 // Code generation optimization level for the compiler
 llvm::CodeGenOpt::Level Compiler::CodeGenOptLevel;