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);