1 /* 2 * Copyright 2011-2012, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 18 #define __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 19 20 #include <cstddef> 21 #include <stdint.h> 22 23 namespace llvm { 24 class Module; 25 class NamedMDNode; 26 } 27 28 namespace bcinfo { 29 30 enum RSFloatPrecision { 31 RS_FP_Full = 0, 32 RS_FP_Relaxed = 1, 33 RS_FP_Imprecise = 2 34 }; 35 36 class MetadataExtractor { 37 private: 38 const llvm::Module *mModule; 39 const char *mBitcode; 40 size_t mBitcodeSize; 41 42 size_t mExportVarCount; 43 size_t mExportFuncCount; 44 size_t mExportForEachSignatureCount; 45 const char **mExportVarNameList; 46 const char **mExportFuncNameList; 47 const char **mExportForEachNameList; 48 const uint32_t *mExportForEachSignatureList; 49 50 size_t mPragmaCount; 51 const char **mPragmaKeyList; 52 const char **mPragmaValueList; 53 54 size_t mObjectSlotCount; 55 const uint32_t *mObjectSlotList; 56 57 uint32_t mCompilerVersion; 58 uint32_t mOptimizationLevel; 59 60 enum RSFloatPrecision mRSFloatPrecision; 61 62 // Helper functions for extraction 63 bool populateVarNameMetadata(const llvm::NamedMDNode *VarNameMetadata); 64 bool populateFuncNameMetadata(const llvm::NamedMDNode *FuncNameMetadata); 65 bool populateForEachMetadata(const llvm::NamedMDNode *Names, 66 const llvm::NamedMDNode *Signatures); 67 bool populateObjectSlotMetadata(const llvm::NamedMDNode *ObjectSlotMetadata); 68 void populatePragmaMetadata(const llvm::NamedMDNode *PragmaMetadata); 69 70 public: 71 /** 72 * Reads metadata from \p bitcode. 73 * 74 * \param bitcode - input bitcode string. 75 * \param bitcodeSize - length of \p bitcode string (in bytes). 76 */ 77 MetadataExtractor(const char *bitcode, size_t bitcodeSize); 78 79 /** 80 * Reads metadata from \p module. 81 * 82 * \param module - input module. 83 */ 84 MetadataExtractor(const llvm::Module *module); 85 86 ~MetadataExtractor(); 87 88 /** 89 * Extract the actual metadata from the supplied bitcode. 90 * 91 * \return true on success and false if an error occurred. 92 */ 93 bool extract(); 94 95 /** 96 * \return number of exported global variables (slots) in this script/module. 97 */ getExportVarCount()98 size_t getExportVarCount() const { 99 return mExportVarCount; 100 } 101 102 /** 103 * \return array of exported variable names. 104 */ getExportVarNameList()105 const char **getExportVarNameList() const { 106 return mExportVarNameList; 107 } 108 109 /** 110 * \return number of exported global functions (slots) in this script/module. 111 */ getExportFuncCount()112 size_t getExportFuncCount() const { 113 return mExportFuncCount; 114 } 115 116 /** 117 * \return array of exported function names. 118 */ getExportFuncNameList()119 const char **getExportFuncNameList() const { 120 return mExportFuncNameList; 121 } 122 123 /** 124 * \return number of exported ForEach functions in this script/module. 125 */ getExportForEachSignatureCount()126 size_t getExportForEachSignatureCount() const { 127 return mExportForEachSignatureCount; 128 } 129 130 /** 131 * \return array of exported ForEach function signatures. 132 */ getExportForEachSignatureList()133 const uint32_t *getExportForEachSignatureList() const { 134 return mExportForEachSignatureList; 135 } 136 137 /** 138 * \return array of exported ForEach function names. 139 */ getExportForEachNameList()140 const char **getExportForEachNameList() const { 141 return mExportForEachNameList; 142 } 143 144 /** 145 * \return number of pragmas contained in pragmaKeyList and pragmaValueList. 146 */ getPragmaCount()147 size_t getPragmaCount() const { 148 return mPragmaCount; 149 } 150 151 /** 152 * \return pragma keys (the name for the pragma). 153 */ getPragmaKeyList()154 const char **getPragmaKeyList() const { 155 return mPragmaKeyList; 156 } 157 158 /** 159 * \return pragma values (contents corresponding to a particular pragma key). 160 */ getPragmaValueList()161 const char **getPragmaValueList() const { 162 return mPragmaValueList; 163 } 164 165 /** 166 * \return number of object slots contained in objectSlotList. 167 */ getObjectSlotCount()168 size_t getObjectSlotCount() const { 169 return mObjectSlotCount; 170 } 171 172 /** 173 * \return array of object slot numbers that must be cleaned up by driver 174 * on script teardown. 175 */ getObjectSlotList()176 const uint32_t *getObjectSlotList() const { 177 return mObjectSlotList; 178 } 179 180 /** 181 * \return compiler version that generated this bitcode. 182 */ getCompilerVersion()183 uint32_t getCompilerVersion() const { 184 return mCompilerVersion; 185 } 186 187 /** 188 * \return compiler optimization level for this bitcode. 189 */ getOptimizationLevel()190 uint32_t getOptimizationLevel() const { 191 return mOptimizationLevel; 192 } 193 194 /** 195 * \return minimal floating point precision that the script requires. 196 */ getRSFloatPrecision()197 enum RSFloatPrecision getRSFloatPrecision() const { 198 return mRSFloatPrecision; 199 } 200 201 /** 202 * \return whether or not this ForEach function signature has an "In" 203 * parameter. 204 * 205 * \param sig - ForEach function signature to check. 206 */ hasForEachSignatureIn(uint32_t sig)207 static bool hasForEachSignatureIn(uint32_t sig) { 208 return sig & 0x01; 209 } 210 211 /** 212 * \return whether or not this ForEach function signature has an "Out" 213 * parameter. 214 * 215 * \param sig - ForEach function signature to check. 216 */ hasForEachSignatureOut(uint32_t sig)217 static bool hasForEachSignatureOut(uint32_t sig) { 218 return sig & 0x02; 219 } 220 221 /** 222 * \return whether or not this ForEach function signature has a "UsrData" 223 * parameter. 224 * 225 * \param sig - ForEach function signature to check. 226 */ hasForEachSignatureUsrData(uint32_t sig)227 static bool hasForEachSignatureUsrData(uint32_t sig) { 228 return sig & 0x04; 229 } 230 231 /** 232 * \return whether or not this ForEach function signature has an "X" 233 * parameter. 234 * 235 * \param sig - ForEach function signature to check. 236 */ hasForEachSignatureX(uint32_t sig)237 static bool hasForEachSignatureX(uint32_t sig) { 238 return sig & 0x08; 239 } 240 241 /** 242 * \return whether or not this ForEach function signature has a "Y" 243 * parameter. 244 * 245 * \param sig - ForEach function signature to check. 246 */ hasForEachSignatureY(uint32_t sig)247 static bool hasForEachSignatureY(uint32_t sig) { 248 return sig & 0x10; 249 } 250 251 /** 252 * \return whether or not this ForEach function signature is a 253 * pass-by-value "Kernel". 254 * 255 * \param sig - ForEach function signature to check. 256 */ hasForEachSignatureKernel(uint32_t sig)257 static bool hasForEachSignatureKernel(uint32_t sig) { 258 return sig & 0x20; 259 } 260 }; 261 262 } // namespace bcinfo 263 264 #endif // __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 265