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
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#ifndef BCC_RS_INFO_H
18c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#define BCC_RS_INFO_H
191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <stdint.h>
211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utility>
231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
24ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
25f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include "bcc/Support/Sha1Util.h"
261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utils/String8.h>
281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utils/Vector.h>
291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
3001f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinesnamespace llvm {
3101f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinesclass Module;
3201f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines}
3301f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines
341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace bcc {
351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Forward declarations
371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass FileBase;
381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass InputFile;
391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass OutputFile;
401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass Source;
4101f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinesclass RSScript;
4201f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines
4301f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinestypedef llvm::Module* (*RSLinkRuntimeCallback) (bcc::RSScript *, llvm::Module *, llvm::Module *);
441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace rsinfo {
461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* RS info file magic */
481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#define RSINFO_MAGIC      "\0rsinfo\n"
491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* RS info file version, encoded in 4 bytes of ASCII */
517233dcad720ea7e4f6b40b0448244bd4f0c5307eShih-wei Liao#define RSINFO_VERSION    "004\0"
521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ListHeader {
541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // The offset from the beginning of the file of data
551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t offset;
561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Number of item in the list
571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t count;
581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Size of each item
591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t itemSize;
601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* RS info file header */
631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) Header {
641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Magic versus version
651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t magic[8];
661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t version[4];
671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t isThreadable;
691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t hasDebugInformation;
701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint16_t headerSize;
721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t strPoolSize;
741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader dependencyTable;
761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader pragmaList;
771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader objectSlotList;
781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader exportVarNameList;
791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader exportFuncNameList;
801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader exportForeachFuncList;
811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtypedef uint32_t StringIndexTy;
841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Use value -1 as an invalid string index marker. No need to declare with
851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// 'static' modifier since 'const' variable has internal linkage by default.
861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changconst StringIndexTy gInvalidStringIndex = static_cast<StringIndexTy>(-1);
871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) DependencyTableItem {
891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy id;
901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // SHA-1 checksum is stored as a string in string pool (and has fixed-length
91f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  // SHA1_DIGEST_LENGTH (=20) bytes)
921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy sha1;
931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) PragmaItem {
961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Pragma is a key-value pair.
971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy key;
981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy value;
991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ObjectSlotItem {
1021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t slot;
1031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ExportVarNameItem {
1061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy name;
1071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ExportFuncNameItem {
1101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy name;
1111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ExportForeachFuncItem {
1141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy name;
1151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t signature;
1161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Return the human-readable name of the given rsinfo::*Item in the template
1191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// parameter. This is for debugging and error message.
1201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename Item>
1211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName();
1221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<DependencyTableItem>()
1251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ return "rs dependency info"; }
1261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<PragmaItem>()
1291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{  return "rs pragma"; }
1301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ObjectSlotItem>()
1331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{  return "rs object slot"; }
1341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ExportVarNameItem>()
1371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ return "rs export var"; }
1381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ExportFuncNameItem>()
1411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{  return "rs export func"; }
1421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ExportForeachFuncItem>()
1451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ return "rs export foreach"; }
1461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end namespace rsinfo
1481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass RSInfo {
1501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
1511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<std::pair<const char *,
1521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                                    const uint8_t *> > DependencyTableTy;
1531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<std::pair<const char*, const char*> > PragmaListTy;
1541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<uint32_t> ObjectSlotListTy;
1551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<const char *> ExportVarNameListTy;
1561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<const char *> ExportFuncNameListTy;
1571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<std::pair<const char *,
1581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                                    uint32_t> > ExportForeachFuncListTy;
1591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
1611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Calculate or load the SHA-1 information of the built-in dependencies.
162331310e1f3f86a795f78e42b3f03558a43829f09Stephen Hines  static bool LoadBuiltInSHA1Information();
1631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Return the path of the RS info file corresponded to the given output
1651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // executable file.
16601f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines  static android::String8 GetPath(const char *pFilename);
1671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  static const char LibBCCPath[];
169f7401ab4b42dcbd782f20ba5c279694edbd28516Shih-wei Liao  static const char LibCompilerRTPath[];
1701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  static const char LibRSPath[];
1712665c2f94ed14c1d15925d83b47aa519a11dafe5Shih-wei Liao  static const char LibCLCorePath[];
1728ee82d4c1dded958f27f0dc51ddeceda0c895d99Stephen Hines  static const char LibCLCoreDebugPath[];
173cdcce323a2acddb4234e6906c691e20bb3d714f9Michael Liao#if defined(ARCH_X86_HAVE_SSE2)
174cdcce323a2acddb4234e6906c691e20bb3d714f9Michael Liao  static const char LibCLCoreX86Path[];
175cdcce323a2acddb4234e6906c691e20bb3d714f9Michael Liao#endif
176b1cc74f2fc38ea115b69f65302bc62478fe59a4aShih-wei Liao#if defined(ARCH_ARM_HAVE_NEON)
177b1cc74f2fc38ea115b69f65302bc62478fe59a4aShih-wei Liao  static const char LibCLCoreNEONPath[];
178b1cc74f2fc38ea115b69f65302bc62478fe59a4aShih-wei Liao#endif
1791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changprivate:
1811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // SHA-1 of the built-in dependencies. Will be initialized in
1821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // LoadBuiltInSHA1Information().
183f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  static const uint8_t *LibBCCSHA1;
184f7401ab4b42dcbd782f20ba5c279694edbd28516Shih-wei Liao  static const uint8_t *LibCompilerRTSHA1;
185f290793bc65b8483332ac8b568962395c4a63927Zonr Chang  static const uint8_t *LibRSSHA1;
1862665c2f94ed14c1d15925d83b47aa519a11dafe5Shih-wei Liao  static const uint8_t *LibCLCoreSHA1;
1878ee82d4c1dded958f27f0dc51ddeceda0c895d99Stephen Hines  static const uint8_t *LibCLCoreDebugSHA1;
188b1cc74f2fc38ea115b69f65302bc62478fe59a4aShih-wei Liao#if defined(ARCH_ARM_HAVE_NEON)
189b1cc74f2fc38ea115b69f65302bc62478fe59a4aShih-wei Liao  static const uint8_t *LibCLCoreNEONSHA1;
190b1cc74f2fc38ea115b69f65302bc62478fe59a4aShih-wei Liao#endif
1911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  static bool CheckDependency(const RSInfo &pInfo,
1931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                              const char *pInputFilename,
1947bcec85228c1eceade6efc9cd7d02ef81c8d55e9Shih-wei Liao                              const DependencyTableTy &pDeps);
1951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  static bool AddBuiltInDependencies(RSInfo &pInfo);
1961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  rsinfo::Header mHeader;
1981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  char *mStringPool;
2001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // In most of the time, there're 4 source dependencies stored (libbcc.so,
2021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // libRS.so, libclcore and the input bitcode itself.)
2031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  DependencyTableTy mDependencyTable;
2041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  PragmaListTy mPragmas;
2051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ObjectSlotListTy mObjectSlots;
2061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ExportVarNameListTy mExportVarNames;
2071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ExportFuncNameListTy mExportFuncNames;
2081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ExportForeachFuncListTy mExportForeachFuncs;
2091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Initialize an empty RSInfo with its size of string pool is pStringPoolSize.
2111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  RSInfo(size_t pStringPoolSize);
2121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // layout() assigns value of offset in each ListHeader (i.e., it decides where
2141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // data should go in the file.) It also updates fields other than offset to
2151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // reflect the current RSInfo object states to mHeader.
2161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  bool layout(off_t initial_offset);
2171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
2191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ~RSInfo();
2201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Implemented in RSInfoExtractor.cpp.
2227bcec85228c1eceade6efc9cd7d02ef81c8d55e9Shih-wei Liao  static RSInfo *ExtractFromSource(const Source &pSource,
2237bcec85228c1eceade6efc9cd7d02ef81c8d55e9Shih-wei Liao                                   const DependencyTableTy &pDeps);
2241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Implemented in RSInfoReader.cpp.
2261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  static RSInfo *ReadFromFile(InputFile &pInput,
2277bcec85228c1eceade6efc9cd7d02ef81c8d55e9Shih-wei Liao                              const DependencyTableTy &pDeps);
2281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Implemneted in RSInfoWriter.cpp
2301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  bool write(OutputFile &pOutput);
2311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  void dump() const;
2331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // const getter
2351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline bool isThreadable() const
2361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mHeader.isThreadable; }
2371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline bool hasDebugInformation() const
2381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mHeader.hasDebugInformation; }
2391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const DependencyTableTy &getDependencyTable() const
2401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mDependencyTable; }
2411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const PragmaListTy &getPragmas() const
2421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mPragmas; }
2431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ObjectSlotListTy &getObjectSlots() const
2441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mObjectSlots; }
2451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ExportVarNameListTy &getExportVarNames() const
2461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mExportVarNames; }
2471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ExportFuncNameListTy &getExportFuncNames() const
2481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mExportFuncNames; }
2491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ExportForeachFuncListTy &getExportForeachFuncs() const
2501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mExportForeachFuncs; }
2511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  const char *getStringFromPool(rsinfo::StringIndexTy pStrIdx) const;
2531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  rsinfo::StringIndexTy getStringIdxInPool(const char *pStr) const;
2541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // setter
2561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline void setThreadable(bool pThreadable = true)
2571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { mHeader.isThreadable = pThreadable; }
2581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
2601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  enum FloatPrecision {
261ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao    FP_Full,
262ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao    FP_Relaxed,
263ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao    FP_Imprecise,
2641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  };
2651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Return the minimal floating point precision required for the associated
2671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // script.
268ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao  FloatPrecision getFloatPrecisionRequirement() const;
2691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
2701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end namespace bcc
2721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
273c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif  // BCC_RS_INFO_H
274