Fixbug 4995931
Do symbol look up every time the object file is loaded from cache.
Change-Id: I63184d3fc519270dfe4fc86e90efbf8552e0f584
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;
}