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 } // namespace bcinfo 203 204 #endif // __ANDROID_BCINFO_METADATAEXTRACTOR_H__ 205