Fixbug libbcc cache variable relocation.

Change-Id: I18f98e366dfc57b5e81dfdcfadcf5d99fbf9ffd2
diff --git a/lib/ExecutionEngine/MCCacheReader.cpp b/lib/ExecutionEngine/MCCacheReader.cpp
index aac7be7..2034317 100644
--- a/lib/ExecutionEngine/MCCacheReader.cpp
+++ b/lib/ExecutionEngine/MCCacheReader.cpp
@@ -48,7 +48,6 @@
   if (mpHeader) { free(mpHeader); }
   if (mpCachedDependTable) { free(mpCachedDependTable); }
   if (mpPragmaList) { free(mpPragmaList); }
-  if (mpFuncTable) { free(mpFuncTable); }
 }
 
 ScriptCached *MCCacheReader::readCacheFile(FileHandle *objFile,
@@ -82,7 +81,6 @@
              && readExportVarList()
              && readExportFuncList()
              && readPragmaList()
-             && readFuncTable()
              && readObjectSlotList()
              && readObjFile()
              && relocate()
@@ -410,20 +408,6 @@
   return true;
 }
 
-bool MCCacheReader::readFuncTable() {
-  CACHE_READER_READ_SECTION(OBCC_FuncTable, mpFuncTable, func_table);
-
-  vector<char const *> &strPool = mpResult->mStringPool;
-  ScriptCached::FuncTable &table = mpResult->mFunctions;
-  for (size_t i = 0; i < func_table_raw->count; ++i) {
-    OBCC_FuncInfo *func = &func_table_raw->table[i];
-    table.insert(make_pair(strPool[func->name_strp_index],
-                           make_pair(func->cached_addr, func->size)));
-  }
-
-  return true;
-}
-
 #undef CACHE_READER_READ_SECTION
 
 bool MCCacheReader::readRelocationTable() {
@@ -437,6 +421,9 @@
   int mRootOffset = reinterpret_cast<char *>(rootPtr) -
                     reinterpret_cast<char *>(mpHeader->root_base_addr);
   for (size_t i = 0; i < mpResult->getExportVarCount(); ++i) {
+    // Variable is optimized out by libbcc. Don't relocate.
+    if (mpResult->mpExportVars->cached_addr_list[i] == 0x00) continue;
+
     mpResult->mpExportVars->cached_addr_list[i] =
     reinterpret_cast<void *>(
         reinterpret_cast<char *>(mpResult->mpExportVars->cached_addr_list[i])
diff --git a/lib/ExecutionEngine/MCCacheReader.h b/lib/ExecutionEngine/MCCacheReader.h
index d1f230e..e826b36 100644
--- a/lib/ExecutionEngine/MCCacheReader.h
+++ b/lib/ExecutionEngine/MCCacheReader.h
@@ -57,7 +57,7 @@
   public:
     MCCacheReader()
       : mObjFile(NULL), mInfoFile(NULL), mInfoFileSize(0), mpHeader(NULL),
-        mpCachedDependTable(NULL), mpPragmaList(NULL), mpFuncTable(NULL),
+        mpCachedDependTable(NULL), mpPragmaList(NULL),
         mIsContextSlotNotAvail(false) {
     }
 
@@ -88,7 +88,6 @@
     bool readExportVarList();
     bool readExportFuncList();
     bool readPragmaList();
-    bool readFuncTable();
     bool readObjectSlotList();
     bool readObjFile();
     bool readRelocationTable();
diff --git a/lib/ExecutionEngine/MCCacheWriter.cpp b/lib/ExecutionEngine/MCCacheWriter.cpp
index 499a82b..c2d0d04 100644
--- a/lib/ExecutionEngine/MCCacheWriter.cpp
+++ b/lib/ExecutionEngine/MCCacheWriter.cpp
@@ -44,7 +44,6 @@
   CHECK_AND_FREE(mpExportVarListSection);
   CHECK_AND_FREE(mpExportFuncListSection);
   CHECK_AND_FREE(mpPragmaListSection);
-  CHECK_AND_FREE(mpFuncTableSection);
   CHECK_AND_FREE(mpObjectSlotSection);
 
 #undef CHECK_AND_FREE
@@ -62,7 +61,6 @@
 
   bool result = prepareHeader(libRS_threadable)
              && prepareDependencyTable()
-             && prepareFuncTable()
              && preparePragmaList()
              && prepareStringPool()
              && prepareExportVarList()
@@ -142,42 +140,6 @@
   return true;
 }
 
-
-bool MCCacheWriter::prepareFuncTable() {
-  size_t funcCount = mpOwner->getFuncCount();
-
-  size_t tableSize = sizeof(OBCC_FuncTable) +
-                     sizeof(OBCC_FuncInfo) * funcCount;
-
-  OBCC_FuncTable *tab = (OBCC_FuncTable *)malloc(tableSize);
-
-  if (!tab) {
-    LOGE("Unable to allocate for function table section.\n");
-    return false;
-  }
-
-  mpFuncTableSection = tab;
-  mpHeaderSection->func_table_size = tableSize;
-
-  tab->count = static_cast<size_t>(funcCount);
-
-  // Get the function informations
-  vector<FuncInfo> funcInfoList(funcCount);
-  mpOwner->getFuncInfoList(funcCount, &*funcInfoList.begin());
-
-  for (size_t i = 0; i < funcCount; ++i) {
-    FuncInfo *info = &funcInfoList[i];
-    OBCC_FuncInfo *outputInfo = &tab->table[i];
-
-    outputInfo->name_strp_index = addString(info->name, strlen(info->name));
-    outputInfo->cached_addr = info->addr;
-    outputInfo->size = info->size;
-  }
-
-  return true;
-}
-
-
 bool MCCacheWriter::preparePragmaList() {
   size_t pragmaCount = mpOwner->getPragmaCount();
 
@@ -381,7 +343,6 @@
   WRITE_SECTION_SIMPLE(export_var_list, mpExportVarListSection);
   WRITE_SECTION_SIMPLE(export_func_list, mpExportFuncListSection);
   WRITE_SECTION_SIMPLE(pragma_list, mpPragmaListSection);
-  WRITE_SECTION_SIMPLE(func_table, mpFuncTableSection);
   WRITE_SECTION_SIMPLE(object_slot_list, mpObjectSlotSection);
 
 #undef WRITE_SECTION_SIMPLE
diff --git a/lib/ExecutionEngine/MCCacheWriter.h b/lib/ExecutionEngine/MCCacheWriter.h
index 9970dfb..962ef06 100644
--- a/lib/ExecutionEngine/MCCacheWriter.h
+++ b/lib/ExecutionEngine/MCCacheWriter.h
@@ -46,7 +46,6 @@
     OBCC_ExportVarList *mpExportVarListSection;
     OBCC_ExportFuncList *mpExportFuncListSection;
     OBCC_PragmaList *mpPragmaListSection;
-    OBCC_FuncTable *mpFuncTableSection;
     OBCC_ObjectSlotList *mpObjectSlotSection;
 
   public:
@@ -54,7 +53,7 @@
       : mpHeaderSection(NULL), mpStringPoolSection(NULL),
         mpDependencyTableSection(NULL), mpExportVarListSection(NULL),
         mpExportFuncListSection(NULL), mpPragmaListSection(NULL),
-        mpFuncTableSection(NULL), mpObjectSlotSection(NULL) {
+        mpObjectSlotSection(NULL) {
     }
 
     ~MCCacheWriter();
@@ -77,7 +76,6 @@
     bool prepareExportVarList();
     bool prepareExportFuncList();
     bool preparePragmaList();
-    bool prepareFuncTable();
     bool prepareObjectSlotList();
 
     bool writeAll();