15e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao/* 25e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * Copyright 2010, The Android Open Source Project 35e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * 45e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 55e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * you may not use this file except in compliance with the License. 65e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * You may obtain a copy of the License at 75e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * 85e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 95e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * 105e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 115e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 125e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * See the License for the specific language governing permissions and 145e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao * limitations under the License. 155e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao */ 165e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 175e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include "MCCacheReader.h" 185e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 195e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include "DebugHelper.h" 205e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include "FileHandle.h" 215e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include "ScriptCached.h" 225e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include "Runtime.h" 235e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 245e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <bcc/bcc_mccache.h> 255e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 265e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <llvm/ADT/OwningPtr.h> 275e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 285e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <errno.h> 295e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <sys/stat.h> 305e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <sys/types.h> 315e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 325e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <utility> 335e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <vector> 345e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 355e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <new> 365e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 375e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <stdlib.h> 385e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#include <string.h> 395e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 405e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaousing namespace std; 415e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 425e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 435e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#if USE_MCJIT 445e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaonamespace bcc { 455e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 465e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei LiaoMCCacheReader::~MCCacheReader() { 475e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mpHeader) { free(mpHeader); } 485e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mpCachedDependTable) { free(mpCachedDependTable); } 495e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mpPragmaList) { free(mpPragmaList); } 50f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen if (mpVarNameList) { free(mpVarNameList); } 51f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen if (mpFuncNameList) { free(mpFuncNameList); } 525e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 535e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 546d0804b59a47c62b287f1935fc955b2a4da91ad5Shih-wei LiaoScriptCached *MCCacheReader::readCacheFile(FileHandle *objFile, 556d0804b59a47c62b287f1935fc955b2a4da91ad5Shih-wei Liao FileHandle *infoFile, 566d0804b59a47c62b287f1935fc955b2a4da91ad5Shih-wei Liao Script *S) { 5734c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen bool result = checkCacheFile(objFile, infoFile, S) 5834c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen && readPragmaList() 5934c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen && readObjectSlotList() 6034c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen && readObjFile() 6134c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen && readVarNameList() 6234c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen && readFuncNameList() 6334c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen //&& relocate() 6434c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen ; 6534c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen 6634c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen return result ? mpResult.take() : NULL; 6734c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen} 6834c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen 6934c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wenbool MCCacheReader::checkCacheFile(FileHandle *objFile, 7034c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen FileHandle *infoFile, 7134c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen Script *S) { 725e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao // Check file handle 735e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (!objFile || objFile->getFD() < 0 || !infoFile || infoFile->getFD() < 0) { 7434c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen return false; 755e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 765e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 775e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mObjFile = objFile; 785e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mInfoFile = infoFile; 795e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 805e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao // Allocate ScriptCached object 815e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpResult.reset(new (nothrow) ScriptCached(S)); 825e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 835e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (!mpResult) { 845e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to allocate ScriptCached object.\n"); 8534c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen return false; 865e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 875e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 885e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao bool result = checkFileSize() 895e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && readHeader() 905e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && checkHeader() 915e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && checkMachineIntType() 925e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && checkSectionOffsetAndSize() 935e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && readStringPool() 945e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && checkStringPool() 955e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && readDependencyTable() 965e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao && checkDependency() 975e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao ; 985e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 9934c600a77b0dd2f27fabbc4b6b3b94ed12af2a57Joseph Wen return result; 1005e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 1015e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1025e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1035e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::checkFileSize() { 1045e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao struct stat stfile; 1055e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (fstat(mInfoFile->getFD(), &stfile) < 0) { 1065e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to stat cache file.\n"); 1075e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1085e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1095e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1105e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mInfoFileSize = stfile.st_size; 1115e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1125e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mInfoFileSize < (off_t)sizeof(MCO_Header)) { 1135e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Cache file is too small to be correct.\n"); 1145e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1155e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1165e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1175e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 1185e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 1195e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1205e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1215e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readHeader() { 1225e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mInfoFile->seek(0, SEEK_SET) != 0) { 1235e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to seek to 0. (reason: %s)\n", strerror(errno)); 1245e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1255e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1265e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1275e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpHeader = (MCO_Header *)malloc(sizeof(MCO_Header)); 1285e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (!mpHeader) { 1295e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to allocate for cache header.\n"); 1305e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1315e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1325e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1335e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mInfoFile->read(reinterpret_cast<char *>(mpHeader), sizeof(MCO_Header)) != 1345e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao (ssize_t)sizeof(MCO_Header)) { 1355e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to read cache header.\n"); 1365e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1375e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1385e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1395e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao // Dirty hack for libRS. 1405e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao // TODO(all): This should be removed in the future. 1415e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mpHeader->libRS_threadable) { 1425e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpResult->mLibRSThreadable = true; 1435e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1445e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1455e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 1465e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 1475e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1485e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1495e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::checkHeader() { 1505e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (memcmp(mpHeader->magic, OBCC_MAGIC, 4) != 0) { 1515e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Bad magic word\n"); 1525e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1535e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1545e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1555e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (memcmp(mpHeader->version, OBCC_VERSION, 4) != 0) { 1565e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpHeader->version[4 - 1] = '\0'; // ensure c-style string terminated 1575e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGI("Cache file format version mismatch: now %s cached %s\n", 1585e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao OBCC_VERSION, mpHeader->version); 1595e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1605e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1615e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 1625e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 1635e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1645e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1655e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::checkMachineIntType() { 1665e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao uint32_t number = 0x00000001; 1675e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1685e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao bool isLittleEndian = (*reinterpret_cast<char *>(&number) == 1); 1695e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if ((isLittleEndian && mpHeader->endianness != 'e') || 1705e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao (!isLittleEndian && mpHeader->endianness != 'E')) { 1715e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Machine endianness mismatch.\n"); 1725e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1735e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1745e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1755e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if ((unsigned int)mpHeader->sizeof_off_t != sizeof(off_t) || 1765e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao (unsigned int)mpHeader->sizeof_size_t != sizeof(size_t) || 1775e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao (unsigned int)mpHeader->sizeof_ptr_t != sizeof(void *)) { 1785e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Machine integer size mismatch.\n"); 1795e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 1805e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 1815e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1825e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 1835e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 1845e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1855e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 1865e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::checkSectionOffsetAndSize() { 1875e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#define CHECK_SECTION_OFFSET(NAME) \ 1885e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao do { \ 1895e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao off_t offset = mpHeader-> NAME##_offset; \ 1905e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao off_t size = (off_t)mpHeader-> NAME##_size; \ 1915e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 1925e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mInfoFileSize < offset || mInfoFileSize < offset + size) { \ 1935e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE(#NAME " section overflow.\n"); \ 1945e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; \ 1955e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } \ 1965e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 1975e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (offset % sizeof(int) != 0) { \ 1985e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE(#NAME " offset must aligned to %d.\n", (int)sizeof(int)); \ 1995e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; \ 2005e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } \ 2015e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 2025e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (size < static_cast<off_t>(sizeof(size_t))) { \ 2035e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE(#NAME " size is too small to be correct.\n"); \ 2045e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; \ 2055e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } \ 2065e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } while (0) 2075e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2085e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CHECK_SECTION_OFFSET(str_pool); 2095e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CHECK_SECTION_OFFSET(depend_tab); 2105e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao //CHECK_SECTION_OFFSET(reloc_tab); 2115e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CHECK_SECTION_OFFSET(pragma_list); 2125e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2135e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#undef CHECK_SECTION_OFFSET 2145e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2155e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 2165e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 2175e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2185e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2195e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#define CACHE_READER_READ_SECTION(TYPE, AUTO_MANAGED_HOLDER, NAME) \ 2205e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao TYPE *NAME##_raw = (TYPE *)malloc(mpHeader->NAME##_size); \ 2215e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 2225e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (!NAME##_raw) { \ 2235e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to allocate for " #NAME "\n"); \ 2245e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; \ 2255e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } \ 2265e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 2275e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao /* We have to ensure that some one will deallocate NAME##_raw */ \ 2285e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao AUTO_MANAGED_HOLDER = NAME##_raw; \ 2295e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 2305e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mInfoFile->seek(mpHeader->NAME##_offset, SEEK_SET) == -1) { \ 2315e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to seek to " #NAME " section\n"); \ 2325e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; \ 2335e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } \ 2345e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao \ 2355e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mInfoFile->read(reinterpret_cast<char *>(NAME##_raw), \ 2365e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpHeader->NAME##_size) != (ssize_t)mpHeader->NAME##_size) \ 2375e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao { \ 2385e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to read " #NAME ".\n"); \ 2395e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; \ 2405e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 2415e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2425e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2435e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readStringPool() { 2445e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CACHE_READER_READ_SECTION(OBCC_StringPool, 2455e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpResult->mpStringPoolRaw, str_pool); 2465e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2475e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao char *str_base = reinterpret_cast<char *>(str_pool_raw); 2485e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2495e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao vector<char const *> &pool = mpResult->mStringPool; 2505e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao for (size_t i = 0; i < str_pool_raw->count; ++i) { 2515e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao char *str = str_base + str_pool_raw->list[i].offset; 2525e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao pool.push_back(str); 2535e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 2545e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2555e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 2565e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 2575e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2585e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2595e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::checkStringPool() { 2605e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao OBCC_StringPool *poolR = mpResult->mpStringPoolRaw; 2615e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao vector<char const *> &pool = mpResult->mStringPool; 2625e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2635e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao // Ensure that every c-style string is ended with '\0' 2645e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao for (size_t i = 0; i < poolR->count; ++i) { 2655e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (pool[i][poolR->list[i].length] != '\0') { 2665e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("The %lu-th string does not end with '\\0'.\n", (unsigned long)i); 2675e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 2685e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 2695e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 2705e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2715e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 2725e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 2735e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2745e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2755e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readDependencyTable() { 2765e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CACHE_READER_READ_SECTION(OBCC_DependencyTable, mpCachedDependTable, 2775e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao depend_tab); 2785e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 2795e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 2805e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2815e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2825e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::checkDependency() { 2835e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (mDependencies.size() != mpCachedDependTable->count) { 2845e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Dependencies count mismatch. (%lu vs %lu)\n", 2855e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao (unsigned long)mDependencies.size(), 2865e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao (unsigned long)mpCachedDependTable->count); 2875e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 2885e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 2895e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2905e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao vector<char const *> &strPool = mpResult->mStringPool; 2915e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao map<string, pair<uint32_t, unsigned char const *> >::iterator dep; 2925e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2935e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao dep = mDependencies.begin(); 2945e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao for (size_t i = 0; i < mpCachedDependTable->count; ++i, ++dep) { 2955e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao string const &depName = dep->first; 2965e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao uint32_t depType = dep->second.first; 2975e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao unsigned char const *depSHA1 = dep->second.second; 2985e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 2995e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao OBCC_Dependency *depCached =&mpCachedDependTable->table[i]; 3005e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao char const *depCachedName = strPool[depCached->res_name_strp_index]; 3015e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao uint32_t depCachedType = depCached->res_type; 3025e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao unsigned char const *depCachedSHA1 = depCached->sha1; 3035e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3045e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (depName != depCachedName) { 3055e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Cache dependency name mismatch:\n"); 3065e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE(" given: %s\n", depName.c_str()); 3075e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE(" cached: %s\n", depCachedName); 3085e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3095e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 3105e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 3115e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3125e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (memcmp(depSHA1, depCachedSHA1, 20) != 0) { 3135e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Cache dependency %s sha1 mismatch:\n", depCachedName); 3145e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3155e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#define PRINT_SHA1(PREFIX, X, POSTFIX) \ 3165e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE(PREFIX "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" \ 3175e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" POSTFIX, \ 3185e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao X[0], X[1], X[2], X[3], X[4], X[5], X[6], X[7], X[8], X[9], \ 3195e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao X[10],X[11],X[12],X[13],X[14],X[15],X[16],X[17],X[18],X[19]); 3205e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3215e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao PRINT_SHA1(" given: ", depSHA1, "\n"); 3225e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao PRINT_SHA1(" cached: ", depCachedSHA1, "\n"); 3235e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3245e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#undef PRINT_SHA1 3255e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3265e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 3275e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 3285e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3295e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (depType != depCachedType) { 3305e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Cache dependency %s resource type mismatch.\n", depCachedName); 3315e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 3325e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 3335e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 3345e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3355e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 3365e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 3375e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 338f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wenbool MCCacheReader::readVarNameList() { 339f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen CACHE_READER_READ_SECTION(OBCC_String_Ptr, mpVarNameList, export_var_name_list); 340f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen vector<char const *> const &strPool = mpResult->mStringPool; 341f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 3428eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen mpResult->mpExportVars = (OBCC_ExportVarList*) 3438eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen malloc(sizeof(size_t) + 3448eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen sizeof(void*) * export_var_name_list_raw->count); 3458eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen if (!mpResult->mpExportVars) { 3468eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen LOGE("Unable to allocate for mpExportVars\n"); 3478eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen return false; 3488eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen } 3498eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen mpResult->mpExportVars->count = export_var_name_list_raw->count; 3508eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen 351f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen for (size_t i = 0; i < export_var_name_list_raw->count; ++i) { 352f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen mpResult->mpExportVars->cached_addr_list[i] = 353f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen rsloaderGetSymbolAddress(mpResult->mRSExecutable, strPool[export_var_name_list_raw->strp_indexs[i]]); 354f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen#if DEBUG_MCJIT_REFLECT 355f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen LOGD("Get symbol address: %s -> %p", 356f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen strPool[export_var_name_list_raw->strp_indexs[i]], mpResult->mpExportVars->cached_addr_list[i]); 357f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen#endif 358f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen } 359f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen return true; 360f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen} 3615e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 362f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wenbool MCCacheReader::readFuncNameList() { 363f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen CACHE_READER_READ_SECTION(OBCC_String_Ptr, mpFuncNameList, export_func_name_list); 364f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen vector<char const *> const &strPool = mpResult->mStringPool; 365f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 3668eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen mpResult->mpExportFuncs = (OBCC_ExportFuncList*) 3678eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen malloc(sizeof(size_t) + 3688eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen sizeof(void*) * export_func_name_list_raw->count); 3698eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen if (!mpResult->mpExportFuncs) { 3708eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen LOGE("Unable to allocate for mpExportFuncs\n"); 3718eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen return false; 3728eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen } 3738eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen mpResult->mpExportFuncs->count = export_func_name_list_raw->count; 3748eabcbf188f6e58217ad316271ea5e984d6eacceJoseph Wen 375f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen for (size_t i = 0; i < export_func_name_list_raw->count; ++i) { 376f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen mpResult->mpExportFuncs->cached_addr_list[i] = 377f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen rsloaderGetSymbolAddress(mpResult->mRSExecutable, strPool[export_func_name_list_raw->strp_indexs[i]]); 378f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen#if DEBUG_MCJIT_REFLECT 379f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen LOGD("Get function address: %s -> %p", 380f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen strPool[export_func_name_list_raw->strp_indexs[i]], mpResult->mpExportFuncs->cached_addr_list[i]); 381f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen#endif 382f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen } 383f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen return true; 384f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen} 385f36637f60d8fd35c43ad52bd06d3372c9bc8fb19Joseph Wen 3865e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readPragmaList() { 3875e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CACHE_READER_READ_SECTION(OBCC_PragmaList, mpPragmaList, pragma_list); 3885e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3895e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao vector<char const *> const &strPool = mpResult->mStringPool; 3905e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao ScriptCached::PragmaList &pragmas = mpResult->mPragmas; 3915e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3925e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao for (size_t i = 0; i < pragma_list_raw->count; ++i) { 3935e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao OBCC_Pragma *pragma = &pragma_list_raw->list[i]; 3945e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao pragmas.push_back(make_pair(strPool[pragma->key_strp_index], 3955e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao strPool[pragma->value_strp_index])); 3965e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 3975e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 3985e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 3995e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 4005e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4015e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4025e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readObjectSlotList() { 4035e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao CACHE_READER_READ_SECTION(OBCC_ObjectSlotList, 4045e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpResult->mpObjectSlotList, object_slot_list); 4055e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 4065e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 4075e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4085e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaovoid *MCCacheReader::resolveSymbolAdapter(void *context, char const *name) { 4095e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao MCCacheReader *self = reinterpret_cast<MCCacheReader *>(context); 4105e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4115e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (void *Addr = FindRuntimeFunction(name)) { 4125e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return Addr; 4135e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 4145e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4155e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (self->mpSymbolLookupFn) { 4166d0804b59a47c62b287f1935fc955b2a4da91ad5Shih-wei Liao if (void *Addr = 4176d0804b59a47c62b287f1935fc955b2a4da91ad5Shih-wei Liao self->mpSymbolLookupFn(self->mpSymbolLookupContext, name)) { 4185e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return Addr; 4195e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 4205e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 4215e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4225e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Unable to resolve symbol: %s\n", name); 4235e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return NULL; 4245e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 4255e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4265e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readObjFile() { 4275e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao llvm::SmallVector<char, 1024> mEmittedELFExecutable; 4285e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao char readBuffer[1024]; 4295e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao int readSize; 4305e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao while ((readSize = mObjFile->read(readBuffer, 1024)) > 0) { 4315e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mEmittedELFExecutable.append(readBuffer, readBuffer + readSize); 4325e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 4335e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao if (readSize != 0) { 4345e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao LOGE("Read file Error"); 4355e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return false; 4365e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao } 437a61d501206d5bee1ff331caa29bd556dd20551acYing Wang LOGD("Read object file size %d", (int)mEmittedELFExecutable.size()); 4385e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mpResult->mRSExecutable = 4395e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao rsloaderCreateExec((unsigned char *)&*mEmittedELFExecutable.begin(), 4405e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao mEmittedELFExecutable.size(), 4415e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao &resolveSymbolAdapter, this); 4425e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 4435e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 4445e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4455e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#undef CACHE_READER_READ_SECTION 4465e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4475e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::readRelocationTable() { 4485e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao // TODO(logan): Not finished. 4495e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 4505e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 4515e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4525e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4535e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liaobool MCCacheReader::relocate() { 4545e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao return true; 4555e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} 4565e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao 4575e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao} // namespace bcc 4585e3e0ce19d80c9a42b89ca95f22d98fbbe6ffb14Shih-wei Liao#endif 459