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