Fixbug 4995931

Do symbol look up every time the object file is loaded from cache.

Change-Id: I63184d3fc519270dfe4fc86e90efbf8552e0f584
diff --git a/lib/ExecutionEngine/MCCacheWriter.cpp b/lib/ExecutionEngine/MCCacheWriter.cpp
index 1250ab7..10f8237 100644
--- a/lib/ExecutionEngine/MCCacheWriter.cpp
+++ b/lib/ExecutionEngine/MCCacheWriter.cpp
@@ -45,6 +45,8 @@
   CHECK_AND_FREE(mpExportFuncListSection);
   CHECK_AND_FREE(mpPragmaListSection);
   CHECK_AND_FREE(mpObjectSlotSection);
+  CHECK_AND_FREE(mpExportVarNameListSection);
+  CHECK_AND_FREE(mpExportFuncNameListSection);
 
 #undef CHECK_AND_FREE
 }
@@ -62,6 +64,8 @@
   bool result = prepareHeader(libRS_threadable)
              && prepareDependencyTable()
              && preparePragmaList()
+             && prepareExportVarNameList()
+             && prepareExportFuncNameList()
              && prepareStringPool()
              && prepareExportVarList()
              && prepareExportFuncList()
@@ -240,6 +244,30 @@
 }
 
 
+bool MCCacheWriter::prepareExportVarNameList() {
+  size_t varCount = mpOwner->getExportVarCount();
+  size_t listSize = sizeof(OBCC_String_Ptr) + sizeof(size_t) * varCount;
+
+  OBCC_String_Ptr *list = (OBCC_String_Ptr*)malloc(listSize);
+
+  if (!list) {
+    LOGE("Unable to allocate for export variable name list\n");
+    return false;
+  }
+
+  mpExportVarNameListSection = list;
+  mpHeaderSection->export_var_name_list_size = listSize;
+
+  list->count = static_cast<size_t>(varCount);
+
+  mpOwner->getExportVarNameList(varNameList);
+  for (size_t i = 0; i < varCount; ++i) {
+    list->strp_indexs[i] = addString(varNameList[i].c_str(), varNameList[i].length());
+  }
+  return true;
+}
+
+
 bool MCCacheWriter::prepareExportFuncList() {
   size_t funcCount = mpOwner->getExportFuncCount();
   size_t listSize = sizeof(OBCC_ExportFuncList) + sizeof(void *) * funcCount;
@@ -261,6 +289,30 @@
 }
 
 
+bool MCCacheWriter::prepareExportFuncNameList() {
+  size_t funcCount = mpOwner->getExportFuncCount();
+  size_t listSize = sizeof(OBCC_String_Ptr) + sizeof(size_t) * funcCount;
+
+  OBCC_String_Ptr *list = (OBCC_String_Ptr*)malloc(listSize);
+
+  if (!list) {
+    LOGE("Unable to allocate for export function name list\n");
+    return false;
+  }
+
+  mpExportFuncNameListSection = list;
+  mpHeaderSection->export_func_name_list_size = listSize;
+
+  list->count = static_cast<size_t>(funcCount);
+
+  mpOwner->getExportFuncNameList(funcNameList);
+  for (size_t i = 0; i < funcCount; ++i) {
+    list->strp_indexs[i] = addString(funcNameList[i].c_str(), funcNameList[i].length());
+  }
+  return true;
+}
+
+
 bool MCCacheWriter::prepareObjectSlotList() {
   size_t objectSlotCount = mpOwner->getObjectSlotCount();
 
@@ -307,6 +359,8 @@
   OFFSET_INCREASE(pragma_list);
   OFFSET_INCREASE(func_table);
   OFFSET_INCREASE(object_slot_list);
+  OFFSET_INCREASE(export_var_name_list);
+  OFFSET_INCREASE(export_func_name_list);
 
 #undef OFFSET_INCREASE
 
@@ -344,6 +398,9 @@
   WRITE_SECTION_SIMPLE(pragma_list, mpPragmaListSection);
   WRITE_SECTION_SIMPLE(object_slot_list, mpObjectSlotSection);
 
+  WRITE_SECTION_SIMPLE(export_var_name_list, mpExportVarNameListSection);
+  WRITE_SECTION_SIMPLE(export_func_name_list, mpExportFuncNameListSection);
+
 #undef WRITE_SECTION_SIMPLE
 #undef WRITE_SECTION