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>
21f229c40f0d2da19985e68955aef1a06ce4121e63Pirama Arumuga Nainar#include <memory>
22f229c40f0d2da19985e68955aef1a06ce4121e63Pirama 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:
529fa4d4480252ecfe08c97bc35888360b1e19ec99David Gross  struct Reduce {
539fa4d4480252ecfe08c97bc35888360b1e19ec99David 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
669fa4d4480252ecfe08c97bc35888360b1e19ec99David 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    }
729fa4d4480252ecfe08c97bc35888360b1e19ec99David 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
819fa4d4480252ecfe08c97bc35888360b1e19ec99David Gross    Reduce(const Reduce &) = delete;
829fa4d4480252ecfe08c97bc35888360b1e19ec99David 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;
999fa4d4480252ecfe08c97bc35888360b1e19ec99David 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
108b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines  uint32_t mCompilerVersion;
109094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea  uint32_t mOptimizationLevel;
110094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea
111e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines  enum RSFloatPrecision mRSFloatPrecision;
112e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines
1139fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar  // Flag to mark that script is threadable.  True by default.
1149fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar  bool mIsThreadable;
1159fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar
11651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar  const char *mBuildChecksum;
11751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar
118fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo  bool mHasDebugInfo;
119fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo
120932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  // Helper functions for extraction
121cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines  bool populateForEachMetadata(const llvm::NamedMDNode *Names,
122cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines                               const llvm::NamedMDNode *Signatures);
1239fa4d4480252ecfe08c97bc35888360b1e19ec99David Gross  bool populateReduceMetadata(const llvm::NamedMDNode *ReduceMetadata);
124932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  bool populateObjectSlotMetadata(const llvm::NamedMDNode *ObjectSlotMetadata);
125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  void populatePragmaMetadata(const llvm::NamedMDNode *PragmaMetadata);
1269fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar  void readThreadableFlag(const llvm::NamedMDNode *ThreadableMetadata);
12751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar  void readBuildChecksumMetadata(const llvm::NamedMDNode *ChecksumMetadata);
128932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
129a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes  uint32_t calculateNumInputs(const llvm::Function *Function,
130a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes                              uint32_t Signature);
131a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes
132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines public:
133cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross
134cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross  // Name of metadata node where information extracted from the
135cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross  // bitcode wrapper should have been stored when we use the
136cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross  // MetadataExtractor constructor that takes a Module as a parameter.
137cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross  static const char kWrapperMetadataName[];
138cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross
139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * Reads metadata from \p bitcode.
141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   *
142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \param bitcode - input bitcode string.
143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \param bitcodeSize - length of \p bitcode string (in bytes).
144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  MetadataExtractor(const char *bitcode, size_t bitcodeSize);
146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
147569986da116ed602c752395f9563260db38f6945Stephen Hines  /**
148569986da116ed602c752395f9563260db38f6945Stephen Hines   * Reads metadata from \p module.
149569986da116ed602c752395f9563260db38f6945Stephen Hines   *
150569986da116ed602c752395f9563260db38f6945Stephen Hines   * \param module - input module.
151cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   *
152cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   * module must contain a metadata node named kWrapperMetadataName.
153569986da116ed602c752395f9563260db38f6945Stephen Hines   */
1548a019dd0040bedf5078e4d18e06a244a675b80e8Chih-Hung Hsieh  explicit MetadataExtractor(const llvm::Module *module);
155569986da116ed602c752395f9563260db38f6945Stephen Hines
156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  ~MetadataExtractor();
157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
159932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * Extract the actual metadata from the supplied bitcode.
160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   *
161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return true on success and false if an error occurred.
162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  bool extract();
164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return number of exported global variables (slots) in this script/module.
167932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t getExportVarCount() const {
169932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mExportVarCount;
170932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
171932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
172932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
173569986da116ed602c752395f9563260db38f6945Stephen Hines   * \return array of exported variable names.
174569986da116ed602c752395f9563260db38f6945Stephen Hines   */
175569986da116ed602c752395f9563260db38f6945Stephen Hines  const char **getExportVarNameList() const {
176569986da116ed602c752395f9563260db38f6945Stephen Hines    return mExportVarNameList;
177569986da116ed602c752395f9563260db38f6945Stephen Hines  }
178569986da116ed602c752395f9563260db38f6945Stephen Hines
179569986da116ed602c752395f9563260db38f6945Stephen Hines  /**
180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return number of exported global functions (slots) in this script/module.
181932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
182932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t getExportFuncCount() const {
183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mExportFuncCount;
184932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
185932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
186932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
187569986da116ed602c752395f9563260db38f6945Stephen Hines   * \return array of exported function names.
188569986da116ed602c752395f9563260db38f6945Stephen Hines   */
189569986da116ed602c752395f9563260db38f6945Stephen Hines  const char **getExportFuncNameList() const {
190569986da116ed602c752395f9563260db38f6945Stephen Hines    return mExportFuncNameList;
191569986da116ed602c752395f9563260db38f6945Stephen Hines  }
192569986da116ed602c752395f9563260db38f6945Stephen Hines
193569986da116ed602c752395f9563260db38f6945Stephen Hines  /**
19433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines   * \return number of exported ForEach functions in this script/module.
19533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines   */
19633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines  size_t getExportForEachSignatureCount() const {
19733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines    return mExportForEachSignatureCount;
19833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines  }
19933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines
20033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines  /**
201569986da116ed602c752395f9563260db38f6945Stephen Hines   * \return array of exported ForEach function signatures.
20233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines   */
20333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines  const uint32_t *getExportForEachSignatureList() const {
20433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines    return mExportForEachSignatureList;
20533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines  }
20633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines
20733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines  /**
208569986da116ed602c752395f9563260db38f6945Stephen Hines   * \return array of exported ForEach function names.
209cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines   */
210cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines  const char **getExportForEachNameList() const {
211cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines    return mExportForEachNameList;
212cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines  }
213cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines
214cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines  /**
215a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes   * \return array of input parameter counts.
216a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes   */
217a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes  const uint32_t *getExportForEachInputCountList() const {
218a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes    return mExportForEachInputCountList;
219a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes  }
220a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes
221a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes  /**
2229fa4d4480252ecfe08c97bc35888360b1e19ec99David Gross   * \return number of exported general reduce kernels (slots) in this script/module.
2231895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala   */
2241895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala  size_t getExportReduceCount() const {
2251895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala    return mExportReduceCount;
2261895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala  }
2271895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala
2281895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala  /**
22979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross   * \return array of exported general reduce kernel descriptions.
23079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross   */
2319fa4d4480252ecfe08c97bc35888360b1e19ec99David Gross  const Reduce *getExportReduceList() const {
2329fa4d4480252ecfe08c97bc35888360b1e19ec99David Gross    return mExportReduceList;
23379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross  }
23479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross
23579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross  /**
236932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return number of pragmas contained in pragmaKeyList and pragmaValueList.
237932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
238932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t getPragmaCount() const {
239932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mPragmaCount;
240932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
241932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
242932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
243932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return pragma keys (the name for the pragma).
244932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
245932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  const char **getPragmaKeyList() const {
246932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mPragmaKeyList;
247932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
248932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
249932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
250932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return pragma values (contents corresponding to a particular pragma key).
251932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
252932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  const char **getPragmaValueList() const {
253932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mPragmaValueList;
254932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
255932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
256932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
257932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return number of object slots contained in objectSlotList.
258932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
259932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t getObjectSlotCount() const {
260932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mObjectSlotCount;
261932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
262932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
263932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
264932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return array of object slot numbers that must be cleaned up by driver
265932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   *         on script teardown.
266932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
267932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  const uint32_t *getObjectSlotList() const {
268932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mObjectSlotList;
269932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
270094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea
271b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines  /**
272cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   * \return compiler version indicating which guarantees this bitcode is
273cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   *         known to obey.
274b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines   */
275b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines  uint32_t getCompilerVersion() const {
276b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines    return mCompilerVersion;
277b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines  }
278b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines
279b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines  /**
280cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   * \return compiler optimization level for this bitcode.  In the case of
281cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   *         linked bitcode (user_bitcode + libclcore_bitcode), this is the
282cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross   *         optimization level of user_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