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