1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* 2cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines * Copyright 2011-2012, The Android Open Source Project 3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License. 6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at 7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software 11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and 14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License. 15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#ifndef __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstddef> 218e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar#include <memory> 228e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar 23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <stdint.h> 24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace llvm { 26a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes class Function; 27569986da116ed602c752395f9563260db38f6945Stephen Hines class Module; 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines class NamedMDNode; 29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo { 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 33e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hinesenum RSFloatPrecision { 34e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RS_FP_Full = 0, 35e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RS_FP_Relaxed = 1, 36e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines}; 37e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 3833cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Grossenum MetadataSignatureBitval { 3933cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_None = 0, 4033cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_In = 0x000001, 4133cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_Out = 0x000002, 4233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_Usr = 0x000004, 4333cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_X = 0x000008, 4433cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_Y = 0x000010, 4533cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_Kernel = 0x000020, 4633cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_Z = 0x000040, 4733cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross MD_SIG_Ctxt = 0x000080, 4833cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross}; 4933cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross 50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass MetadataExtractor { 5179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross public: 52a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross struct Reduce { 53a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross // These strings are owned by the Reduce instance, and deleted upon its destruction. 5479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross // They are assumed to have been allocated by "new []" and hence are deleted by "delete []". 5579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross const char *mReduceName; 5679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross const char *mInitializerName; 5779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross const char *mAccumulatorName; 5879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross const char *mCombinerName; 5979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross const char *mOutConverterName; 6079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross const char *mHalterName; 6179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 6279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross uint32_t mSignature; // of accumulator function 6379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross uint32_t mInputCount; // of accumulator function (and of kernel itself) 6479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross uint32_t mAccumulatorDataSize; // in bytes 6579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 66a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross Reduce() : 6779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross mReduceName(nullptr), 6879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross mInitializerName(nullptr), mAccumulatorName(nullptr), mCombinerName(nullptr), 6979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross mOutConverterName(nullptr), mHalterName(nullptr), 7079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross mSignature(0), mInputCount(0), mAccumulatorDataSize(0) { 7179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 72a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross ~Reduce() { 7379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mReduceName; 7479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mInitializerName; 7579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mAccumulatorName; 7679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mCombinerName; 7779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mOutConverterName; 7879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mHalterName; 7979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 8079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 81a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross Reduce(const Reduce &) = delete; 82a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross void operator=(const Reduce &) = delete; 8379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross }; 8479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines private: 86569986da116ed602c752395f9563260db38f6945Stephen Hines const llvm::Module *mModule; 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *mBitcode; 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mBitcodeSize; 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mExportVarCount; 91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mExportFuncCount; 9233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines size_t mExportForEachSignatureCount; 931895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala size_t mExportReduceCount; 94569986da116ed602c752395f9563260db38f6945Stephen Hines const char **mExportVarNameList; 95569986da116ed602c752395f9563260db38f6945Stephen Hines const char **mExportFuncNameList; 96cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const char **mExportForEachNameList; 9733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const uint32_t *mExportForEachSignatureList; 98a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes const uint32_t *mExportForEachInputCountList; 99a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross const Reduce *mExportReduceList; 100a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 101932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mPragmaCount; 102932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **mPragmaKeyList; 103932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **mPragmaValueList; 104932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 105932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mObjectSlotCount; 106932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const uint32_t *mObjectSlotList; 107932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 1080947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines uint32_t mTargetAPI; 109b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines uint32_t mCompilerVersion; 110094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea uint32_t mOptimizationLevel; 111094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 112e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines enum RSFloatPrecision mRSFloatPrecision; 113e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 1149fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // Flag to mark that script is threadable. True by default. 1159fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar bool mIsThreadable; 1169fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 11751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar const char *mBuildChecksum; 11851ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 119fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo bool mHasDebugInfo; 120fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo 121932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // Helper functions for extraction 122cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines bool populateForEachMetadata(const llvm::NamedMDNode *Names, 123cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Signatures); 124a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross bool populateReduceMetadata(const llvm::NamedMDNode *ReduceMetadata); 125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool populateObjectSlotMetadata(const llvm::NamedMDNode *ObjectSlotMetadata); 126932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void populatePragmaMetadata(const llvm::NamedMDNode *PragmaMetadata); 1279fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar void readThreadableFlag(const llvm::NamedMDNode *ThreadableMetadata); 12851ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar void readBuildChecksumMetadata(const llvm::NamedMDNode *ChecksumMetadata); 129932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 130a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t calculateNumInputs(const llvm::Function *Function, 131a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t Signature); 132a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 133932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines public: 134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Reads metadata from \p bitcode. 136932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 137932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \param bitcode - input bitcode string. 138932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \param bitcodeSize - length of \p bitcode string (in bytes). 139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines MetadataExtractor(const char *bitcode, size_t bitcodeSize); 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 142569986da116ed602c752395f9563260db38f6945Stephen Hines /** 143569986da116ed602c752395f9563260db38f6945Stephen Hines * Reads metadata from \p module. 144569986da116ed602c752395f9563260db38f6945Stephen Hines * 145569986da116ed602c752395f9563260db38f6945Stephen Hines * \param module - input module. 146569986da116ed602c752395f9563260db38f6945Stephen Hines */ 147569986da116ed602c752395f9563260db38f6945Stephen Hines MetadataExtractor(const llvm::Module *module); 148569986da116ed602c752395f9563260db38f6945Stephen Hines 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ~MetadataExtractor(); 150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 152932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Extract the actual metadata from the supplied bitcode. 153932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 154932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return true on success and false if an error occurred. 155932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool extract(); 157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 1590947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines * \return target API level of this bitcode. 1600947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines * 1610947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines * The target API is used during the SDK compilation to provide proper 1620947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines * visibility of the RenderScript runtime API functions. 1630947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines */ 1640947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines uint32_t getTargetAPI() const { 1650947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines return mTargetAPI; 1660947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines } 1670947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines 1680947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines /** 169932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of exported global variables (slots) in this script/module. 170932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 171932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getExportVarCount() const { 172932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mExportVarCount; 173932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 174932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 175932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 176569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported variable names. 177569986da116ed602c752395f9563260db38f6945Stephen Hines */ 178569986da116ed602c752395f9563260db38f6945Stephen Hines const char **getExportVarNameList() const { 179569986da116ed602c752395f9563260db38f6945Stephen Hines return mExportVarNameList; 180569986da116ed602c752395f9563260db38f6945Stephen Hines } 181569986da116ed602c752395f9563260db38f6945Stephen Hines 182569986da116ed602c752395f9563260db38f6945Stephen Hines /** 183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of exported global functions (slots) in this script/module. 184932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 185932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getExportFuncCount() const { 186932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mExportFuncCount; 187932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 188932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 189932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 190569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported function names. 191569986da116ed602c752395f9563260db38f6945Stephen Hines */ 192569986da116ed602c752395f9563260db38f6945Stephen Hines const char **getExportFuncNameList() const { 193569986da116ed602c752395f9563260db38f6945Stephen Hines return mExportFuncNameList; 194569986da116ed602c752395f9563260db38f6945Stephen Hines } 195569986da116ed602c752395f9563260db38f6945Stephen Hines 196569986da116ed602c752395f9563260db38f6945Stephen Hines /** 19733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines * \return number of exported ForEach functions in this script/module. 19833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines */ 19933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines size_t getExportForEachSignatureCount() const { 20033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return mExportForEachSignatureCount; 20133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 20233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 20333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines /** 204569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported ForEach function signatures. 20533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines */ 20633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const uint32_t *getExportForEachSignatureList() const { 20733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return mExportForEachSignatureList; 20833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 20933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 21033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines /** 211569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported ForEach function names. 212cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines */ 213cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const char **getExportForEachNameList() const { 214cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines return mExportForEachNameList; 215cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 216cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 217cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines /** 218a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes * \return array of input parameter counts. 219a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes */ 220a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes const uint32_t *getExportForEachInputCountList() const { 221a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes return mExportForEachInputCountList; 222a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes } 223a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 224a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes /** 225a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross * \return number of exported general reduce kernels (slots) in this script/module. 2261895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala */ 2271895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala size_t getExportReduceCount() const { 2281895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return mExportReduceCount; 2291895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 2301895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 2311895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala /** 23279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross * \return array of exported general reduce kernel descriptions. 23379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross */ 234a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross const Reduce *getExportReduceList() const { 235a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross return mExportReduceList; 23679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 23779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 23879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross /** 239932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of pragmas contained in pragmaKeyList and pragmaValueList. 240932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 241932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getPragmaCount() const { 242932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mPragmaCount; 243932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 244932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 245932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 246932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return pragma keys (the name for the pragma). 247932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 248932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **getPragmaKeyList() const { 249932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mPragmaKeyList; 250932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 251932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 252932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 253932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return pragma values (contents corresponding to a particular pragma key). 254932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 255932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **getPragmaValueList() const { 256932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mPragmaValueList; 257932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 258932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 259932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 260932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of object slots contained in objectSlotList. 261932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 262932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getObjectSlotCount() const { 263932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mObjectSlotCount; 264932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 265932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 266932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 267932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return array of object slot numbers that must be cleaned up by driver 268932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * on script teardown. 269932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 270932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const uint32_t *getObjectSlotList() const { 271932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mObjectSlotList; 272932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 273094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 274b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines /** 275b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines * \return compiler version that generated this bitcode. 276b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines */ 277b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines uint32_t getCompilerVersion() const { 278b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines return mCompilerVersion; 279b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines } 280b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines 281b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines /** 282b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines * \return compiler optimization level for this bitcode. 283b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines */ 284094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea uint32_t getOptimizationLevel() const { 285094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea return mOptimizationLevel; 286094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea } 287e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 288e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines /** 289e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines * \return minimal floating point precision that the script requires. 290e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines */ 291e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines enum RSFloatPrecision getRSFloatPrecision() const { 292e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines return mRSFloatPrecision; 293e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 294d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 295d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 296d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has an "In" 297d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 298d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 299d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 300d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 301d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureIn(uint32_t sig) { 30233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_In; 303d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 304d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 305d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 306d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has an "Out" 307d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 308d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 309d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 310d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 311d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureOut(uint32_t sig) { 31233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_Out; 313d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 314d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 315d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 316d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has a "UsrData" 317d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 318d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 319d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 320d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 321d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureUsrData(uint32_t sig) { 32233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_Usr; 323d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 324d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 325d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 326d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has an "X" 327d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 328d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 329d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 330d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 331d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureX(uint32_t sig) { 33233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_X; 333d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 334d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 335d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 336d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has a "Y" 337d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 338d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 339d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 340d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 341d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureY(uint32_t sig) { 34233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_Y; 343d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 344d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 345d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 346d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature is a 347d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * pass-by-value "Kernel". 348d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 349d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 350d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 351d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureKernel(uint32_t sig) { 35233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_Kernel; 35333cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross } 35433cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross 35533cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross /** 35633cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * \return whether or not this ForEach function signature has a "Z" 35733cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * parameter. 35833cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * 35933cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * \param sig - ForEach function signature to check. 36033cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross */ 36133cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross static bool hasForEachSignatureZ(uint32_t sig) { 36233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_Z; 36333cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross } 36433cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross 36533cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross /** 36633cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * \return whether or not this ForEach function signature has a "Ctxt" 36733cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * parameter. 36833cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * 36933cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross * \param sig - ForEach function signature to check. 37033cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross */ 37133cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross static bool hasForEachSignatureCtxt(uint32_t sig) { 37233cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross return sig & MD_SIG_Ctxt; 373d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 3749fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 3757de5fde8091a0fb32cc1cc531ec7401fbfb29986Pirama Arumuga Nainar /** 3767de5fde8091a0fb32cc1cc531ec7401fbfb29986Pirama Arumuga Nainar * \return whether "Kernels" in this script can be processed 3777de5fde8091a0fb32cc1cc531ec7401fbfb29986Pirama Arumuga Nainar * by multiple threads 3787de5fde8091a0fb32cc1cc531ec7401fbfb29986Pirama Arumuga Nainar */ 3797de5fde8091a0fb32cc1cc531ec7401fbfb29986Pirama Arumuga Nainar 3807de5fde8091a0fb32cc1cc531ec7401fbfb29986Pirama Arumuga Nainar bool isThreadable() const { 3819fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return mIsThreadable; 3829fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar } 3839fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 38451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar /** 38551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar * \return the build checksum extracted from the LLVM metadata 38651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar */ 38751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar const char *getBuildChecksum() const { 38851ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return mBuildChecksum; 38951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar } 390fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo 391fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo /** 392fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo * \return whether the module contains debug metadata 393fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo */ 394fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo bool hasDebugInfo() const { 395fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo return mHasDebugInfo; 396fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo } 397932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; 398932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 399932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // namespace bcinfo 400932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 401932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif // __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 402