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> 21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <stdint.h> 22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace llvm { 24569986da116ed602c752395f9563260db38f6945Stephen Hines class Module; 25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines class NamedMDNode; 26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo { 29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 30e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hinesenum RSFloatPrecision { 31e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RS_FP_Full = 0, 32e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RS_FP_Relaxed = 1, 33e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines}; 34e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass MetadataExtractor { 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines private: 37569986da116ed602c752395f9563260db38f6945Stephen Hines const llvm::Module *mModule; 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *mBitcode; 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mBitcodeSize; 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mExportVarCount; 42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mExportFuncCount; 4333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines size_t mExportForEachSignatureCount; 44569986da116ed602c752395f9563260db38f6945Stephen Hines const char **mExportVarNameList; 45569986da116ed602c752395f9563260db38f6945Stephen Hines const char **mExportFuncNameList; 46cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const char **mExportForEachNameList; 4733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const uint32_t *mExportForEachSignatureList; 48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mPragmaCount; 50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **mPragmaKeyList; 51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **mPragmaValueList; 52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t mObjectSlotCount; 54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const uint32_t *mObjectSlotList; 55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 56b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines uint32_t mCompilerVersion; 57094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea uint32_t mOptimizationLevel; 58094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 59e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines enum RSFloatPrecision mRSFloatPrecision; 60e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // Helper functions for extraction 62569986da116ed602c752395f9563260db38f6945Stephen Hines bool populateVarNameMetadata(const llvm::NamedMDNode *VarNameMetadata); 63569986da116ed602c752395f9563260db38f6945Stephen Hines bool populateFuncNameMetadata(const llvm::NamedMDNode *FuncNameMetadata); 64cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines bool populateForEachMetadata(const llvm::NamedMDNode *Names, 65cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Signatures); 66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool populateObjectSlotMetadata(const llvm::NamedMDNode *ObjectSlotMetadata); 67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines void populatePragmaMetadata(const llvm::NamedMDNode *PragmaMetadata); 68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines public: 70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Reads metadata from \p bitcode. 72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \param bitcode - input bitcode string. 74932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \param bitcodeSize - length of \p bitcode string (in bytes). 75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines MetadataExtractor(const char *bitcode, size_t bitcodeSize); 77932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 78569986da116ed602c752395f9563260db38f6945Stephen Hines /** 79569986da116ed602c752395f9563260db38f6945Stephen Hines * Reads metadata from \p module. 80569986da116ed602c752395f9563260db38f6945Stephen Hines * 81569986da116ed602c752395f9563260db38f6945Stephen Hines * \param module - input module. 82569986da116ed602c752395f9563260db38f6945Stephen Hines */ 83569986da116ed602c752395f9563260db38f6945Stephen Hines MetadataExtractor(const llvm::Module *module); 84569986da116ed602c752395f9563260db38f6945Stephen Hines 85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines ~MetadataExtractor(); 86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Extract the actual metadata from the supplied bitcode. 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return true on success and false if an error occurred. 91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 92932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines bool extract(); 93932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 94932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 95932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of exported global variables (slots) in this script/module. 96932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 97932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getExportVarCount() const { 98932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mExportVarCount; 99932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 100932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 101932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 102569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported variable names. 103569986da116ed602c752395f9563260db38f6945Stephen Hines */ 104569986da116ed602c752395f9563260db38f6945Stephen Hines const char **getExportVarNameList() const { 105569986da116ed602c752395f9563260db38f6945Stephen Hines return mExportVarNameList; 106569986da116ed602c752395f9563260db38f6945Stephen Hines } 107569986da116ed602c752395f9563260db38f6945Stephen Hines 108569986da116ed602c752395f9563260db38f6945Stephen Hines /** 109932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of exported global functions (slots) in this script/module. 110932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 111932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getExportFuncCount() const { 112932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mExportFuncCount; 113932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 114932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 115932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 116569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported function names. 117569986da116ed602c752395f9563260db38f6945Stephen Hines */ 118569986da116ed602c752395f9563260db38f6945Stephen Hines const char **getExportFuncNameList() const { 119569986da116ed602c752395f9563260db38f6945Stephen Hines return mExportFuncNameList; 120569986da116ed602c752395f9563260db38f6945Stephen Hines } 121569986da116ed602c752395f9563260db38f6945Stephen Hines 122569986da116ed602c752395f9563260db38f6945Stephen Hines /** 12333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines * \return number of exported ForEach functions in this script/module. 12433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines */ 12533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines size_t getExportForEachSignatureCount() const { 12633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return mExportForEachSignatureCount; 12733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 12833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 12933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines /** 130569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported ForEach function signatures. 13133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines */ 13233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const uint32_t *getExportForEachSignatureList() const { 13333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return mExportForEachSignatureList; 13433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 13533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 13633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines /** 137569986da116ed602c752395f9563260db38f6945Stephen Hines * \return array of exported ForEach function names. 138cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines */ 139cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const char **getExportForEachNameList() const { 140cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines return mExportForEachNameList; 141cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 142cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 143cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines /** 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of pragmas contained in pragmaKeyList and pragmaValueList. 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getPragmaCount() const { 147932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mPragmaCount; 148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return pragma keys (the name for the pragma). 152932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 153932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **getPragmaKeyList() const { 154932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mPragmaKeyList; 155932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return pragma values (contents corresponding to a particular pragma key). 159932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char **getPragmaValueList() const { 161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mPragmaValueList; 162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return number of object slots contained in objectSlotList. 166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 167932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines size_t getObjectSlotCount() const { 168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mObjectSlotCount; 169932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 170932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 171932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines /** 172932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * \return array of object slot numbers that must be cleaned up by driver 173932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * on script teardown. 174932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 175932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const uint32_t *getObjectSlotList() const { 176932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return mObjectSlotList; 177932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 178094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 179b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines /** 180b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines * \return compiler version that generated this bitcode. 181b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines */ 182b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines uint32_t getCompilerVersion() const { 183b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines return mCompilerVersion; 184b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines } 185b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines 186b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines /** 187b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines * \return compiler optimization level for this bitcode. 188b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines */ 189094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea uint32_t getOptimizationLevel() const { 190094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea return mOptimizationLevel; 191094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea } 192e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 193e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines /** 194e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines * \return minimal floating point precision that the script requires. 195e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines */ 196e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines enum RSFloatPrecision getRSFloatPrecision() const { 197e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines return mRSFloatPrecision; 198e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 199d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 200d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 201d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has an "In" 202d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 203d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 204d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 205d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 206d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureIn(uint32_t sig) { 207d88177580db4ddedf680854c51db333c97eabc59Stephen Hines return sig & 0x01; 208d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 209d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 210d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 211d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has an "Out" 212d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 213d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 214d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 215d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 216d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureOut(uint32_t sig) { 217d88177580db4ddedf680854c51db333c97eabc59Stephen Hines return sig & 0x02; 218d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 219d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 220d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 221d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has a "UsrData" 222d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 223d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 224d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 225d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 226d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureUsrData(uint32_t sig) { 227d88177580db4ddedf680854c51db333c97eabc59Stephen Hines return sig & 0x04; 228d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 229d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 230d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 231d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has an "X" 232d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 233d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 234d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 235d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 236d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureX(uint32_t sig) { 237d88177580db4ddedf680854c51db333c97eabc59Stephen Hines return sig & 0x08; 238d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 239d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 240d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 241d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature has a "Y" 242d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * parameter. 243d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 244d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 245d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 246d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureY(uint32_t sig) { 247d88177580db4ddedf680854c51db333c97eabc59Stephen Hines return sig & 0x10; 248d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 249d88177580db4ddedf680854c51db333c97eabc59Stephen Hines 250d88177580db4ddedf680854c51db333c97eabc59Stephen Hines /** 251d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \return whether or not this ForEach function signature is a 252d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * pass-by-value "Kernel". 253d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * 254d88177580db4ddedf680854c51db333c97eabc59Stephen Hines * \param sig - ForEach function signature to check. 255d88177580db4ddedf680854c51db333c97eabc59Stephen Hines */ 256d88177580db4ddedf680854c51db333c97eabc59Stephen Hines static bool hasForEachSignatureKernel(uint32_t sig) { 257d88177580db4ddedf680854c51db333c97eabc59Stephen Hines return sig & 0x20; 258d88177580db4ddedf680854c51db333c97eabc59Stephen Hines } 259932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}; 260932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 261932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // namespace bcinfo 262932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 263932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif // __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 264