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