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