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
22f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet#include <string>
231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utility>
241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
25ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
26f290793bc65b8483332ac8b568962395c4a63927Zonr Chang#include "bcc/Support/Sha1Util.h"
271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utils/String8.h>
291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utils/Vector.h>
301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
3101f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinesnamespace llvm {
3201f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinesclass Module;
3301f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines}
3401f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines
351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace bcc {
361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Forward declarations
381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass FileBase;
391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass InputFile;
401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass OutputFile;
411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass Source;
4201f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinesclass RSScript;
4301f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines
4401f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hinestypedef llvm::Module* (*RSLinkRuntimeCallback) (bcc::RSScript *, llvm::Module *, llvm::Module *);
451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace rsinfo {
471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* RS info file magic */
491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#define RSINFO_MAGIC      "\0rsinfo\n"
501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* RS info file version, encoded in 4 bytes of ASCII */
52f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet#define RSINFO_VERSION    "006\0"
531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ListHeader {
551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // The offset from the beginning of the file of data
561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t offset;
571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Number of item in the list
581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t count;
591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Size of each item
601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t itemSize;
611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
63c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillettypedef uint32_t StringIndexTy;
64c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet
651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* RS info file header */
661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) Header {
671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Magic versus version
681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t magic[8];
691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t version[4];
701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t isThreadable;
721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint8_t hasDebugInformation;
731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint16_t headerSize;
751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t strPoolSize;
771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
78f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // The index in the pool of the SHA-1 checksum of the source file.
79c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet  // It has a fixed-length of SHA1_DIGEST_LENGTH (=20) bytes.
80c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet  StringIndexTy sourceSha1Idx;
81f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // The index in the pool of the command used to compile this source.
82f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  StringIndexTy compileCommandLineIdx;
83f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // The index in the pool of the build fingerprint of Android when the source was compiled.
84f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  StringIndexTy buildFingerprintIdx;
85c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet
861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader pragmaList;
871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader objectSlotList;
881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader exportVarNameList;
891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader exportFuncNameList;
901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  struct ListHeader exportForeachFuncList;
911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Use value -1 as an invalid string index marker. No need to declare with
941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// 'static' modifier since 'const' variable has internal linkage by default.
951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changconst StringIndexTy gInvalidStringIndex = static_cast<StringIndexTy>(-1);
961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) PragmaItem {
981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Pragma is a key-value pair.
991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy key;
1001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy value;
1011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ObjectSlotItem {
1041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t slot;
1051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ExportVarNameItem {
1081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy name;
1091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ExportFuncNameItem {
1121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy name;
1131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changstruct __attribute__((packed)) ExportForeachFuncItem {
1161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  StringIndexTy name;
1171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  uint32_t signature;
1181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
1191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Return the human-readable name of the given rsinfo::*Item in the template
1211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// parameter. This is for debugging and error message.
1221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename Item>
1231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName();
1241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<PragmaItem>()
1271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{  return "rs pragma"; }
1281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ObjectSlotItem>()
1311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{  return "rs object slot"; }
1321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ExportVarNameItem>()
1351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ return "rs export var"; }
1361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ExportFuncNameItem>()
1391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{  return "rs export func"; }
1401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<>
1421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline const char *GetItemTypeName<ExportForeachFuncItem>()
1431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ return "rs export foreach"; }
1441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end namespace rsinfo
1461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changclass RSInfo {
1481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
149c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet  typedef const uint8_t* DependencyHashTy;
1501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<std::pair<const char*, const char*> > PragmaListTy;
1511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<uint32_t> ObjectSlotListTy;
1521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<const char *> ExportVarNameListTy;
1531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<const char *> ExportFuncNameListTy;
1541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  typedef android::Vector<std::pair<const char *,
1551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang                                    uint32_t> > ExportForeachFuncListTy;
1561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
1581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Return the path of the RS info file corresponded to the given output
1591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // executable file.
16001f05d4b45cbde1e07d4707152908c1d843f1328Stephen Hines  static android::String8 GetPath(const char *pFilename);
1611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
162f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // Check whether this info contains the same source hash, compile command line, and fingerprint.
163f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // If not, it's an indication we need to recompile.
164f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  bool IsConsistent(const char* pInputFilename, const DependencyHashTy& sourceHash,
165f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet                    const char* compileCommandLine, const char* buildFingerprint);
1661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changprivate:
1681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  rsinfo::Header mHeader;
1701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  char *mStringPool;
1721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
173f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // Pointer to the hash of the souce file, somewhere in the string pool.
174c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet  DependencyHashTy mSourceHash;
175f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // Pointer to the command used to compile this source, somewhere in the string pool.
176f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  const char* mCompileCommandLine;
177f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // Pointer to the build fingerprint of Android when the source was compiled, somewhere in the
178f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  // string pool.
179f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet  const char* mBuildFingerprint;
180f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet
1811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  PragmaListTy mPragmas;
1821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ObjectSlotListTy mObjectSlots;
1831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ExportVarNameListTy mExportVarNames;
1841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ExportFuncNameListTy mExportFuncNames;
1851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ExportForeachFuncListTy mExportForeachFuncs;
1861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Initialize an empty RSInfo with its size of string pool is pStringPoolSize.
1881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  RSInfo(size_t pStringPoolSize);
1891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // layout() assigns value of offset in each ListHeader (i.e., it decides where
1911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // data should go in the file.) It also updates fields other than offset to
1921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // reflect the current RSInfo object states to mHeader.
1931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  bool layout(off_t initial_offset);
1941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
1961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  ~RSInfo();
1971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
1981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Implemented in RSInfoExtractor.cpp.
1997bcec85228c1eceade6efc9cd7d02ef81c8d55e9Shih-wei Liao  static RSInfo *ExtractFromSource(const Source &pSource,
200f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet                                   const DependencyHashTy &sourceHashToEmbed,
201f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet                                   const char* compileCommandLineToEmbed,
202f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet                                   const char* buildFingerprintToEmbed);
2031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Implemented in RSInfoReader.cpp.
205c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet  static RSInfo *ReadFromFile(InputFile &pInput);
2061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Implemneted in RSInfoWriter.cpp
2081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  bool write(OutputFile &pOutput);
2091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  void dump() const;
2111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // const getter
2131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline bool isThreadable() const
2141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mHeader.isThreadable; }
2151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline bool hasDebugInformation() const
2161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mHeader.hasDebugInformation; }
2171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const PragmaListTy &getPragmas() const
2181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mPragmas; }
2191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ObjectSlotListTy &getObjectSlots() const
2201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mObjectSlots; }
2211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ExportVarNameListTy &getExportVarNames() const
2221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mExportVarNames; }
2231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ExportFuncNameListTy &getExportFuncNames() const
2241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mExportFuncNames; }
2251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline const ExportForeachFuncListTy &getExportForeachFuncs() const
2261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { return mExportForeachFuncs; }
2271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  const char *getStringFromPool(rsinfo::StringIndexTy pStrIdx) const;
2291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  rsinfo::StringIndexTy getStringIdxInPool(const char *pStr) const;
2301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // setter
2321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  inline void setThreadable(bool pThreadable = true)
2331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  { mHeader.isThreadable = pThreadable; }
2341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changpublic:
2361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  enum FloatPrecision {
237ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao    FP_Full,
238ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao    FP_Relaxed,
2391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  };
2401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
2411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // Return the minimal floating point precision required for the associated
2421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang  // script.
243ed7fffbc0e3fe3c5dced1248f6be52b6c95b513bShih-wei Liao  FloatPrecision getFloatPrecisionRequirement() const;
2441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang};
2451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
246f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet// Returns the arguments concatenated into one string.
247f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouilletstd::string getCommandLine(int argc, const char* const* argv);
248f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet
2491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end namespace bcc
2501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang
251c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#endif  // BCC_RS_INFO_H
252