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