Testing on the Books,  Youtube, and other RenderScript apps pass. Add mCacheSize and add munmap when Compile destructs
from logn.

Change-Id: Ie6dc37db1dafa2b83f4ee8b93ca41293c5e079d9
diff --git a/bcc.cpp b/bcc.cpp
index 9f708e4..7ed7c68 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -433,6 +433,7 @@
   int mCacheFd;           // Set by readBC()
   char *mCacheMapAddr;    // Set by loader() if mCacheNew is false
   oBCCHeader *mCacheHdr;  // Set by loader()
+  size_t mCacheSize;      // Set by loader()
   ptrdiff_t mCacheDiff;   // Set by loader()
   char *mCodeDataAddr;    // Set by CodeMemoryManager if mCacheNew is true.
                           // Used by genCacheFile() for dumping
@@ -2467,6 +2468,7 @@
         mCacheFd(-1),
         mCacheMapAddr(NULL),
         mCacheHdr(NULL),
+        mCacheSize(0),
         mCacheDiff(0),
         mCodeDataAddr(NULL),
         mpSymbolLookupFn(NULL),
@@ -2505,7 +2507,6 @@
       // TODO(sliao):
       mNeverCache = true;
 #if 0
-
       mCacheFd = openCacheFile(resName, true /* createIfMissing */);
       if (mCacheFd >= 0 && !mCacheNew) {  // Just use cache file
         return -mCacheFd;
@@ -2583,8 +2584,10 @@
       goto giveup;
     }
 
-    if (statCacheFd.st_size < sizeof(oBCCHeader) ||
-        statCacheFd.st_size <= MaxCodeSize + MaxGlobalVarSize) {
+    mCacheSize = statCacheFd.st_size;
+
+    if (mCacheSize < sizeof(oBCCHeader) ||
+        mCacheSize <= MaxCodeSize + MaxGlobalVarSize) {
       LOGE("mCacheFd %d is too small to be correct\n", (int)mCacheFd);
       goto giveup;
     }
@@ -2593,8 +2596,7 @@
     // Read File Content
     {
 #ifdef BCC_CODE_ADDR
-      off_t heuristicCodeOffset =
-                    statCacheFd.st_size - MaxCodeSize - MaxGlobalVarSize;
+      off_t heuristicCodeOffset = mCacheSize - MaxCodeSize - MaxGlobalVarSize;
 
       mCodeDataAddr = (char *) mmap(reinterpret_cast<void*>(BCC_CODE_ADDR),
                                     MaxCodeSize + MaxGlobalVarSize,
@@ -2635,7 +2637,7 @@
         goto bail;
       }
 #else
-      mCacheMapAddr = (char *) mmap(0, statCacheFd.st_size,
+      mCacheMapAddr = (char *) mmap(0, mCacheSize,
                                     PROT_READ | PROT_EXEC | PROT_WRITE,
                                     MAP_PRIVATE, mCacheFd, 0);
 
@@ -2666,37 +2668,36 @@
       goto bail;
     }
 
-    if (statCacheFd.st_size < mCacheHdr->relocOffset +
-                              mCacheHdr->relocCount * sizeof(uint32_t) * 2) {
+    if (mCacheSize < mCacheHdr->relocOffset +
+                     mCacheHdr->relocCount * sizeof(uint32_t) * 2) {
       LOGE("relocate table overflow\n");
       goto bail;
     }
 
-    if (statCacheFd.st_size < mCacheHdr->exportVarsOffset +
-                              mCacheHdr->exportVarsCount * sizeof(uint32_t)) {
+    if (mCacheSize < mCacheHdr->exportVarsOffset +
+                     mCacheHdr->exportVarsCount * sizeof(uint32_t)) {
       LOGE("export variables table overflow\n");
       goto bail;
     }
 
-    if (statCacheFd.st_size < mCacheHdr->exportFuncsOffset +
-                              mCacheHdr->exportFuncsCount * sizeof(uint32_t)) {
+    if (mCacheSize < mCacheHdr->exportFuncsOffset +
+                     mCacheHdr->exportFuncsCount * sizeof(uint32_t)) {
       LOGE("export functions table overflow\n");
       goto bail;
     }
 
-    if (statCacheFd.st_size <
-                    mCacheHdr->exportPragmasOffset +
-                    mCacheHdr->exportPragmasCount * sizeof(uint32_t)) {
+    if (mCacheSize < mCacheHdr->exportPragmasOffset +
+                     mCacheHdr->exportPragmasCount * sizeof(uint32_t)) {
       LOGE("export pragmas table overflow\n");
       goto bail;
     }
 
-    if (statCacheFd.st_size < mCacheHdr->codeOffset + mCacheHdr->codeSize) {
+    if (mCacheSize < mCacheHdr->codeOffset + mCacheHdr->codeSize) {
       LOGE("code cache overflow\n");
       goto bail;
     }
 
-    if (statCacheFd.st_size < mCacheHdr->dataOffset + mCacheHdr->dataSize) {
+    if (mCacheSize < mCacheHdr->dataOffset + mCacheHdr->dataSize) {
       LOGE("data (global variable) cache overflow\n");
       goto bail;
     }
@@ -2743,7 +2744,7 @@
       free(mCacheMapAddr);
     }
 #else
-    if (munmap(mCacheMapAddr, statCacheFd.st_size) != 0) {
+    if (munmap(mCacheMapAddr, mCacheSize) != 0) {
       LOGE("munmap failed: %s\n", strerror(errno));
     }
 #endif
@@ -3235,6 +3236,24 @@
   }
 
   ~Compiler() {
+#ifdef BCC_CODE_ADDR
+    if (mCodeDataAddr != 0 && mCodeDataAddr != MAP_FAILED) {
+      if (munmap(mCodeDataAddr, MaxCodeSize + MaxGlobalVarSize) < 0) {
+        LOGE("munmap failed while releasing mCodeDataAddr\n");
+      }
+    }
+
+    if (mCacheMapAddr) {
+      free(mCacheMapAddr);
+    }
+#else
+    if (mCacheMapAddr != 0 && mCacheMapAddr != MAP_FAILED) {
+      if (munmap(mCacheMapAddr, mCacheSize) < 0) {
+        LOGE("munmap failed while releasing mCacheMapAddr\n");
+      }
+    }
+#endif
+
     delete mModule;
     // llvm::llvm_shutdown();
     delete mContext;