11e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/*
21e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Copyright 2012, The Android Open Source Project
31e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang *
41e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
51e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * you may not use this file except in compliance with the License.
61e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * You may obtain a copy of the License at
71e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang *
81e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
91e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang *
101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Unless required by applicable law or agreed to in writing, software
111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * See the License for the specific language governing permissions and
141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * limitations under the License.
151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang */
161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang//===----------------------------------------------------------------------===//
181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// This file implements RSInfo::write()
191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang//===----------------------------------------------------------------------===//
201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
21e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines#include "bcc/Renderscript/RSInfo.h"
221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
23ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
24c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/OutputFile.h"
251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changusing namespace bcc;
271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace {
291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename ItemType, typename ItemContainer> inline bool
311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item(ItemType &pResult, const RSInfo &pInfo,
321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                       const typename ItemContainer::const_iterator &pItem);
331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool
351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::DependencyTableItem, RSInfo::DependencyTableTy>(
361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    rsinfo::DependencyTableItem &pResult,
371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo &pInfo,
381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo::DependencyTableTy::const_iterator &pItem) {
391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.id = pInfo.getStringIdxInPool(pItem->first);
401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.sha1 =
411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang      pInfo.getStringIdxInPool(reinterpret_cast<const char *>(pItem->second));
421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.id == rsinfo::gInvalidStringIndex) {
441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS dependency table contains invalid source id string '%s'.",
451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          pItem->first);
461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.sha1 == rsinfo::gInvalidStringIndex) {
501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS dependency table contains invalid SHA-1 checksum string in '%s'.",
511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          pItem->first);
521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool
591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::PragmaItem, RSInfo::PragmaListTy>(
601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    rsinfo::PragmaItem &pResult,
611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo &pInfo,
621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo::PragmaListTy::const_iterator &pItem) {
631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.key = pInfo.getStringIdxInPool(pItem->first);
641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.value = pInfo.getStringIdxInPool(pItem->second);
651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.key == rsinfo::gInvalidStringIndex) {
671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS pragma list contains invalid string '%s' for key.", pItem->first);
681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.value == rsinfo::gInvalidStringIndex) {
721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS pragma list contains invalid string '%s' for value.",
731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          pItem->second);
741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool
811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ObjectSlotItem, RSInfo::ObjectSlotListTy>(
821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    rsinfo::ObjectSlotItem &pResult,
831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo &pInfo,
841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo::ObjectSlotListTy::const_iterator &pItem) {
851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.slot = *pItem;
861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool
901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ExportVarNameItem, RSInfo::ExportVarNameListTy>(
911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    rsinfo::ExportVarNameItem &pResult,
921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo &pInfo,
931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo::ExportVarNameListTy::const_iterator &pItem) {
941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.name = pInfo.getStringIdxInPool(*pItem);
951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.name == rsinfo::gInvalidStringIndex) {
971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS export vars contains invalid string '%s' for name.", *pItem);
981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
1021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
1031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool
1051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ExportFuncNameItem,
1061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                       RSInfo::ExportFuncNameListTy>(
1071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    rsinfo::ExportFuncNameItem &pResult,
1081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo &pInfo,
1091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo::ExportFuncNameListTy::const_iterator &pItem) {
1101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.name = pInfo.getStringIdxInPool(*pItem);
1111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.name == rsinfo::gInvalidStringIndex) {
1131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS export funcs contains invalid string '%s' for name.", *pItem);
1141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
1151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
1181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
1191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool
1211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_adapt_list_item<rsinfo::ExportForeachFuncItem,
1221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                       RSInfo::ExportForeachFuncListTy>(
1231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    rsinfo::ExportForeachFuncItem &pResult,
1241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo &pInfo,
1251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    const RSInfo::ExportForeachFuncListTy::const_iterator &pItem) {
1261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.name = pInfo.getStringIdxInPool(pItem->first);
1271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  pResult.signature = pItem->second;
1281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pResult.name == rsinfo::gInvalidStringIndex) {
1301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("RS export foreach contains invalid string '%s' for name.",
1311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          pItem->first);
1321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
1331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
1361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
1371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename ItemType, typename ItemContainer>
1391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline bool helper_write_list(OutputFile &pOutput,
1401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                              const RSInfo &pInfo,
1411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                              const rsinfo::ListHeader &pHeader,
1421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                              ItemContainer &pList) {
1431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ItemType item;
1441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  for (typename ItemContainer::const_iterator item_iter = pList.begin(),
1461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          item_end = pList.end(); item_iter != item_end; item_iter++) {
1471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    // Convert each entry in the pList to ItemType.
1481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    if (!helper_adapt_list_item<ItemType, ItemContainer>(item,
1491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                                                         pInfo,
1501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                                                         item_iter)) {
1511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang      return false;
1521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    }
1531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    // And write out an item.
1541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    if (pOutput.write(&item, sizeof(item)) != sizeof(item)) {
1551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang      ALOGE("Cannot write out item of %s for RSInfo file %s! (%s)",
1561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang            rsinfo::GetItemTypeName<ItemType>(), pOutput.getName().c_str(),
1571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang            pOutput.getErrorMessage().c_str());
1581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang      return false;
1591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    }
1601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
1631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
1641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end anonymous namespace
1661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changbool RSInfo::write(OutputFile &pOutput) {
1681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  off_t initial_offset = pOutput.tell();
1691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  const char *output_filename = pOutput.getName().c_str();
1701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pOutput.hasError()) {
1721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("Invalid RS info file %s for output! (%s)",
1731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          output_filename, pOutput.getErrorMessage().c_str());
1741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
1751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Layout.
1781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!layout(initial_offset)) {
1791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
1801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write header.
1831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (pOutput.write(&mHeader, sizeof(mHeader)) != sizeof(mHeader)) {
1841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("Cannot write out the header for RSInfo file %s! (%s)",
1851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          output_filename, pOutput.getErrorMessage().c_str());
1861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
1871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write string pool.
1901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (static_cast<size_t>(pOutput.write(mStringPool, mHeader.strPoolSize))
1911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          != mHeader.strPoolSize) {
1921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    ALOGE("Cannot write out the string pool for RSInfo file %s! (%s)",
1931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang          output_filename, pOutput.getErrorMessage().c_str());
1941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
1951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
1961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write dependencyTable.
1981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!helper_write_list<rsinfo::DependencyTableItem, DependencyTableTy>
1991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang        (pOutput, *this, mHeader.dependencyTable, mDependencyTable)) {
2001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
2011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
2021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write pragmaList.
2041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!helper_write_list<rsinfo::PragmaItem, PragmaListTy>
2051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang        (pOutput, *this, mHeader.pragmaList, mPragmas)) {
2061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
2071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
2081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write objectSlotList.
2101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!helper_write_list<rsinfo::ObjectSlotItem, ObjectSlotListTy>
2111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang        (pOutput, *this, mHeader.objectSlotList, mObjectSlots)) {
2121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
2131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
2141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write exportVarNameList.
2161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!helper_write_list<rsinfo::ExportVarNameItem, ExportVarNameListTy>
2171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang        (pOutput, *this, mHeader.exportVarNameList, mExportVarNames)) {
2181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
2191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
2201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write exportFuncNameList.
2221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!helper_write_list<rsinfo::ExportFuncNameItem, ExportFuncNameListTy>
2231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang        (pOutput, *this, mHeader.exportFuncNameList, mExportFuncNames)) {
2241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
2251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
2261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Write exportForeachFuncList.
2281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  if (!helper_write_list<rsinfo::ExportForeachFuncItem, ExportForeachFuncListTy>
2291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang        (pOutput, *this, mHeader.exportForeachFuncList, mExportForeachFuncs)) {
2301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang    return false;
2311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  }
2321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  return true;
2341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang}
235