Fixbug 4995931

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

Change-Id: I63184d3fc519270dfe4fc86e90efbf8552e0f584
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 9d13039..f2f5f63 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -677,6 +677,7 @@
 
   if (ExportVarMetadata) {
     ScriptCompiled::ExportVarList &varList = mpResult->mExportVars;
+    std::vector<std::string> &varNameList = mpResult->mExportVarsName;
 
     for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
       llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
@@ -689,6 +690,7 @@
           varList.push_back(
             rsloaderGetSymbolAddress(mRSExecutable,
                                      ExportVarName.str().c_str()));
+          varNameList.push_back(ExportVarName.str());
 #if DEBUG_MCJIT_REFLECT
           LOGD("runMCCodeGen(): Exported Var: %s @ %p\n", ExportVarName.str().c_str(),
                varList.back());
@@ -703,6 +705,7 @@
 
   if (ExportFuncMetadata) {
     ScriptCompiled::ExportFuncList &funcList = mpResult->mExportFuncs;
+    std::vector<std::string> &funcNameList = mpResult->mExportFuncsName;
 
     for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
       llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
@@ -715,6 +718,7 @@
           funcList.push_back(
             rsloaderGetSymbolAddress(mRSExecutable,
                                      ExportFuncName.str().c_str()));
+          funcNameList.push_back(ExportFuncName.str());
 #if DEBUG_MCJIT_RELECT
           LOGD("runMCCodeGen(): Exported Func: %s @ %p\n", ExportFuncName.str().c_str(),
                funcList.back());
diff --git a/lib/ExecutionEngine/MCCacheReader.cpp b/lib/ExecutionEngine/MCCacheReader.cpp
index b017ffd..8c70e39 100644
--- a/lib/ExecutionEngine/MCCacheReader.cpp
+++ b/lib/ExecutionEngine/MCCacheReader.cpp
@@ -48,6 +48,8 @@
   if (mpHeader) { free(mpHeader); }
   if (mpCachedDependTable) { free(mpCachedDependTable); }
   if (mpPragmaList) { free(mpPragmaList); }
+  if (mpVarNameList) { free(mpVarNameList); }
+  if (mpFuncNameList) { free(mpFuncNameList); }
 }
 
 ScriptCached *MCCacheReader::readCacheFile(FileHandle *objFile,
@@ -83,7 +85,9 @@
              && readPragmaList()
              && readObjectSlotList()
              && readObjFile()
-             && relocate()
+             && readVarNameList()
+             && readFuncNameList()
+             //&& relocate()
              ;
 
   return result ? mpResult.take() : NULL;
@@ -333,6 +337,20 @@
   return true;
 }
 
+bool MCCacheReader::readVarNameList() {
+  CACHE_READER_READ_SECTION(OBCC_String_Ptr, mpVarNameList, export_var_name_list);
+  vector<char const *> const &strPool = mpResult->mStringPool;
+
+  for (size_t i = 0; i < export_var_name_list_raw->count; ++i) {
+    mpResult->mpExportVars->cached_addr_list[i] =
+      rsloaderGetSymbolAddress(mpResult->mRSExecutable, strPool[export_var_name_list_raw->strp_indexs[i]]);
+#if DEBUG_MCJIT_REFLECT
+    LOGD("Get symbol address: %s -> %p",
+      strPool[export_var_name_list_raw->strp_indexs[i]], mpResult->mpExportVars->cached_addr_list[i]);
+#endif
+  }
+  return true;
+}
 
 bool MCCacheReader::readExportFuncList() {
   CACHE_READER_READ_SECTION(OBCC_ExportFuncList,
@@ -341,6 +359,21 @@
 }
 
 
+bool MCCacheReader::readFuncNameList() {
+  CACHE_READER_READ_SECTION(OBCC_String_Ptr, mpFuncNameList, export_func_name_list);
+  vector<char const *> const &strPool = mpResult->mStringPool;
+
+  for (size_t i = 0; i < export_func_name_list_raw->count; ++i) {
+    mpResult->mpExportFuncs->cached_addr_list[i] =
+      rsloaderGetSymbolAddress(mpResult->mRSExecutable, strPool[export_func_name_list_raw->strp_indexs[i]]);
+#if DEBUG_MCJIT_REFLECT
+    LOGD("Get function address: %s -> %p",
+      strPool[export_func_name_list_raw->strp_indexs[i]], mpResult->mpExportFuncs->cached_addr_list[i]);
+#endif
+  }
+  return true;
+}
+
 bool MCCacheReader::readPragmaList() {
   CACHE_READER_READ_SECTION(OBCC_PragmaList, mpPragmaList, pragma_list);
 
@@ -409,24 +442,6 @@
 
 
 bool MCCacheReader::relocate() {
-  void *rootPtr = rsloaderGetSymbolAddress(mpResult->mRSExecutable, "root");
-  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])
-        + mRootOffset);
-  }
-  for (size_t i = 0; i < mpResult->getExportFuncCount(); ++i) {
-    mpResult->mpExportFuncs->cached_addr_list[i] =
-    reinterpret_cast<void *>(
-        reinterpret_cast<char *>(mpResult->mpExportFuncs->cached_addr_list[i])
-        + mRootOffset);
-  }
   return true;
 }
 
diff --git a/lib/ExecutionEngine/MCCacheReader.h b/lib/ExecutionEngine/MCCacheReader.h
index e826b36..5077289 100644
--- a/lib/ExecutionEngine/MCCacheReader.h
+++ b/lib/ExecutionEngine/MCCacheReader.h
@@ -44,6 +44,9 @@
     OBCC_PragmaList *mpPragmaList;
     OBCC_FuncTable *mpFuncTable;
 
+    OBCC_String_Ptr *mpVarNameList;
+    OBCC_String_Ptr *mpFuncNameList;
+
     llvm::OwningPtr<ScriptCached> mpResult;
 
     std::map<std::string,
@@ -58,6 +61,7 @@
     MCCacheReader()
       : mObjFile(NULL), mInfoFile(NULL), mInfoFileSize(0), mpHeader(NULL),
         mpCachedDependTable(NULL), mpPragmaList(NULL),
+        mpVarNameList(NULL), mpFuncNameList(NULL),
         mIsContextSlotNotAvail(false) {
     }
 
@@ -92,6 +96,9 @@
     bool readObjFile();
     bool readRelocationTable();
 
+    bool readVarNameList();
+    bool readFuncNameList();
+
     bool checkFileSize();
     bool checkHeader();
     bool checkMachineIntType();
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
 
diff --git a/lib/ExecutionEngine/MCCacheWriter.h b/lib/ExecutionEngine/MCCacheWriter.h
index 962ef06..eb134cf 100644
--- a/lib/ExecutionEngine/MCCacheWriter.h
+++ b/lib/ExecutionEngine/MCCacheWriter.h
@@ -48,6 +48,12 @@
     OBCC_PragmaList *mpPragmaListSection;
     OBCC_ObjectSlotList *mpObjectSlotSection;
 
+    OBCC_String_Ptr *mpExportVarNameListSection;
+    OBCC_String_Ptr *mpExportFuncNameListSection;
+
+    std::vector<std::string> varNameList;
+    std::vector<std::string> funcNameList;
+
   public:
     MCCacheWriter()
       : mpHeaderSection(NULL), mpStringPoolSection(NULL),
@@ -78,6 +84,9 @@
     bool preparePragmaList();
     bool prepareObjectSlotList();
 
+    bool prepareExportVarNameList();
+    bool prepareExportFuncNameList();
+
     bool writeAll();
 
     bool calcSectionOffset();
diff --git a/lib/ExecutionEngine/Script.cpp b/lib/ExecutionEngine/Script.cpp
index a2039e5..290cede 100644
--- a/lib/ExecutionEngine/Script.cpp
+++ b/lib/ExecutionEngine/Script.cpp
@@ -603,6 +603,18 @@
   }
 }
 
+void Script::getExportVarNameList(std::vector<std::string> &varList) {
+  switch (mStatus) {
+    case ScriptStatus::Compiled: {
+      return mCompiled->getExportVarNameList(varList);
+    }
+
+    default: {
+      mErrorCode = BCC_INVALID_OPERATION;
+    }
+  }
+}
+
 
 void Script::getExportFuncList(size_t funcListSize, void **funcList) {
   switch (mStatus) {
@@ -624,6 +636,18 @@
   }
 }
 
+void Script::getExportFuncNameList(std::vector<std::string> &funcList) {
+  switch (mStatus) {
+    case ScriptStatus::Compiled: {
+      return mCompiled->getExportFuncNameList(funcList);
+    }
+
+    default: {
+      mErrorCode = BCC_INVALID_OPERATION;
+    }
+  }
+}
+
 
 void Script::getPragmaList(size_t pragmaListSize,
                            char const **keyList,
diff --git a/lib/ExecutionEngine/Script.h b/lib/ExecutionEngine/Script.h
index 97747b9..12cfd85 100644
--- a/lib/ExecutionEngine/Script.h
+++ b/lib/ExecutionEngine/Script.h
@@ -117,6 +117,10 @@
 
     void getExportFuncList(size_t size, void **list);
 
+    void getExportVarNameList(std::vector<std::string> &list);
+
+    void getExportFuncNameList(std::vector<std::string> &list);
+
     void getPragmaList(size_t size,
                        char const **keyList,
                        char const **valueList);
diff --git a/lib/ExecutionEngine/ScriptCompiled.cpp b/lib/ExecutionEngine/ScriptCompiled.cpp
index 189f94a..f5ea2e0 100644
--- a/lib/ExecutionEngine/ScriptCompiled.cpp
+++ b/lib/ExecutionEngine/ScriptCompiled.cpp
@@ -53,6 +53,15 @@
   }
 }
 
+void ScriptCompiled::getExportVarNameList(std::vector<std::string> &varList) {
+  varList = mExportVarsName;
+}
+
+
+void ScriptCompiled::getExportFuncNameList(std::vector<std::string> &funcList) {
+  funcList = mExportFuncsName;
+}
+
 
 void ScriptCompiled::getExportFuncList(size_t funcListSize, void **funcList) {
   if (funcList) {
diff --git a/lib/ExecutionEngine/ScriptCompiled.h b/lib/ExecutionEngine/ScriptCompiled.h
index 66efe3a..21b4056 100644
--- a/lib/ExecutionEngine/ScriptCompiled.h
+++ b/lib/ExecutionEngine/ScriptCompiled.h
@@ -51,6 +51,10 @@
     Compiler mCompiler;
 
     ExportVarList mExportVars;
+
+    std::vector<std::string> mExportVarsName;
+    std::vector<std::string> mExportFuncsName;
+
     ExportFuncList mExportFuncs;
     PragmaList mPragmas;
     ObjectSlotList mObjectSlots;
@@ -118,6 +122,10 @@
 
     void getExportFuncList(size_t funcListSize, void **funcList);
 
+    void getExportVarNameList(std::vector<std::string> &varList);
+
+    void getExportFuncNameList(std::vector<std::string> &funcList);
+
     void getPragmaList(size_t pragmaListSize,
                        char const **keyList,
                        char const **valueList);