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#include "bcinfo/MetadataExtractor.h" 18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 19b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines#include "bcinfo/BitcodeWrapper.h" 20fb81ec1a875d13d9750006313b9123903336101dStephen Hines#include "rsDefines.h" 21b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines 22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define LOG_TAG "bcinfo" 23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cutils/log.h> 24fe0de789385f766e2dacbcfdb05fa57509db874eElliott Hughes#ifdef __ANDROID__ 2532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines#include <cutils/properties.h> 2685d9571c9bd327aebd0cdd2255a1ef4fa4b27df1Nick Kralevich#endif 27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 29b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Constants.h" 30b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/LLVMContext.h" 31b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Module.h" 32a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes#include "llvm/IR/Function.h" 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h" 34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstdlib> 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo { 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 391bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hinesnamespace { 401bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines 41e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hinesllvm::StringRef getStringOperand(const llvm::Metadata *node) { 42e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (auto *mds = llvm::dyn_cast_or_null<const llvm::MDString>(node)) { 431bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines return mds->getString(); 441bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines } 451bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines return llvm::StringRef(); 461bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines} 47e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines 48e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hinesbool extractUIntFromMetadataString(uint32_t *value, 49e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines const llvm::Metadata *m) { 50e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines llvm::StringRef SigString = getStringOperand(m); 51e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (SigString != "") { 52e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (!SigString.getAsInteger(10, *value)) { 53e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return true; 54e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } 55e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } 56e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 57e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines} 58e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines 591895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Walaconst char *createStringFromValue(llvm::Metadata *m) { 601895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala auto ref = getStringOperand(m); 611895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala char *c = new char[ref.size() + 1]; 621895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala memcpy(c, ref.data(), ref.size()); 631895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala c[ref.size()] = '\0'; 641895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return c; 651bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines} 661bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines 6779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Grossconst char *createStringFromOptionalValue(llvm::MDNode *n, unsigned opndNum) { 6879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross llvm::Metadata *opnd; 6979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross if (opndNum >= n->getNumOperands() || !(opnd = n->getOperand(opndNum))) 7079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return nullptr; 7179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return createStringFromValue(opnd); 7279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross} 7379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 741895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Collect metadata from NamedMDNodes that contain a list of names 751895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// (strings). 761895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 771895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Inputs: 781895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 791895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// NamedMetadata - An LLVM metadata node, each of whose operands have 801895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// a string as their first entry 811895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 821895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// NameList - A reference that will hold an allocated array of strings 831895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 841895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Count - A reference that will hold the length of the allocated 851895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// array of strings 861895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 871895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Return value: 881895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 891895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Return true on success, false on error. 901895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 911895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Upon success, the function sets NameList to an array of strings 921895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// corresponding the names found in the metadata. The function sets 931895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Count to the number of entries in NameList. 941895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 951895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// An error occurs if one of the metadata operands doesn't have a 961895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// first entry. 971895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Walabool populateNameMetadata(const llvm::NamedMDNode *NameMetadata, 981895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala const char **&NameList, size_t &Count) { 991895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!NameMetadata) { 1001895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = nullptr; 1011895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala Count = 0; 1021895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return true; 1031895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1041895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1051895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala Count = NameMetadata->getNumOperands(); 1061895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!Count) { 1071895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = nullptr; 1081895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return true; 1091895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1101895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1111895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = new const char *[Count]; 1121895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1131895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala for (size_t i = 0; i < Count; i++) { 1141895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala llvm::MDNode *Name = NameMetadata->getOperand(i); 1151895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (Name && Name->getNumOperands() > 0) { 1161895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList[i] = createStringFromValue(Name->getOperand(0)); 1171895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } else { 1181895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala ALOGE("Metadata operand does not contain a name string"); 1191895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala for (size_t AllocatedIndex = 0; AllocatedIndex < i; AllocatedIndex++) { 1201895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala delete [] NameList[AllocatedIndex]; 1211895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1221895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala delete [] NameList; 1231895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = nullptr; 1241895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala Count = 0; 1251895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1261895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return false; 1271895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1281895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1291895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1301895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return true; 1311895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala} 1321895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1331895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala} // end anonymous namespace 1341895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where pragma info resides (should be synced with 136932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// slang.cpp) 137932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef PragmaMetadataName = "#pragma"; 138932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where exported variable names reside (should be 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ExportVarMetadataName = "#rs_export_var"; 142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where exported function names reside (should be 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ExportFuncMetadataName = "#rs_export_func"; 146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 147cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines// Name of metadata node where exported ForEach name information resides 148cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines// (should be synced with slang_rs_metadata.h) 149cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hinesstatic const llvm::StringRef ExportForEachNameMetadataName = 150cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines "#rs_export_foreach_name"; 151cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 15233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines// Name of metadata node where exported ForEach signature information resides 15333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines// (should be synced with slang_rs_metadata.h) 15433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hinesstatic const llvm::StringRef ExportForEachMetadataName = "#rs_export_foreach"; 15533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 15679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross// Name of metadata node where exported general reduce information resides 15779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross// (should be synced with slang_rs_metadata.h) 158a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Grossstatic const llvm::StringRef ExportReduceMetadataName = "#rs_export_reduce"; 15979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where RS object slot info resides (should be 161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ObjectSlotMetadataName = "#rs_object_slots"; 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 1649fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainarstatic const llvm::StringRef ThreadableMetadataName = "#rs_is_threadable"; 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 16651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar// Name of metadata node where the checksum for this build is stored. (should 16751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar// be synced with libbcc/lib/Core/Source.cpp) 16851ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainarstatic const llvm::StringRef ChecksumMetadataName = "#rs_build_checksum"; 16951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 170fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo// Name of metadata node which contains a list of compile units that have debug 171fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo// metadata. If this is null then there is no debug metadata in the compile 172fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo// unit. 173fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leostatic const llvm::StringRef DebugInfoMetadataName = "llvm.dbg.cu"; 174fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo 175932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesMetadataExtractor::MetadataExtractor(const char *bitcode, size_t bitcodeSize) 176900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes : mModule(nullptr), mBitcode(bitcode), mBitcodeSize(bitcodeSize), 177569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarCount(0), mExportFuncCount(0), mExportForEachSignatureCount(0), 178a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceCount(0), mExportVarNameList(nullptr), 1791895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportFuncNameList(nullptr), mExportForEachNameList(nullptr), 1801895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportForEachSignatureList(nullptr), 181a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportForEachInputCountList(nullptr), 182a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList(nullptr), 1831895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mPragmaCount(0), mPragmaKeyList(nullptr), mPragmaValueList(nullptr), 1841895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mObjectSlotCount(0), mObjectSlotList(nullptr), 1851895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mRSFloatPrecision(RS_FP_Full), mIsThreadable(true), 186fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo mBuildChecksum(nullptr), mHasDebugInfo(false) { 187b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines BitcodeWrapper wrapper(bitcode, bitcodeSize); 1880947923cf0ae67d85e068877bd13aa4a6c9d6dd4Stephen Hines mTargetAPI = wrapper.getTargetAPI(); 189b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines mCompilerVersion = wrapper.getCompilerVersion(); 190b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines mOptimizationLevel = wrapper.getOptimizationLevel(); 191569986da116ed602c752395f9563260db38f6945Stephen Hines} 192569986da116ed602c752395f9563260db38f6945Stephen Hines 193569986da116ed602c752395f9563260db38f6945Stephen HinesMetadataExtractor::MetadataExtractor(const llvm::Module *module) 1941895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala : mModule(module), mBitcode(nullptr), mBitcodeSize(0), 1951895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportVarCount(0), mExportFuncCount(0), mExportForEachSignatureCount(0), 196a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceCount(0), mExportVarNameList(nullptr), 1971895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportFuncNameList(nullptr), mExportForEachNameList(nullptr), 1981895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportForEachSignatureList(nullptr), 199a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportForEachInputCountList(nullptr), 200a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList(nullptr), 2011895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mPragmaCount(0), mPragmaKeyList(nullptr), mPragmaValueList(nullptr), 2021895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mObjectSlotCount(0), mObjectSlotList(nullptr), 2031895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mRSFloatPrecision(RS_FP_Full), mIsThreadable(true), 2041895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mBuildChecksum(nullptr) { 205e109434cfd2bc24d324506238483c1ecd587e228Stephen Hines mCompilerVersion = RS_VERSION; // Default to the actual current version. 206a7e5c8f85434e9b8cb0637da302135ba2e2976f5Stephen Hines mOptimizationLevel = 3; 207932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 208932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 209932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 210932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesMetadataExtractor::~MetadataExtractor() { 211569986da116ed602c752395f9563260db38f6945Stephen Hines if (mExportVarNameList) { 212569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportVarCount; i++) { 213569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportVarNameList[i]; 214900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportVarNameList[i] = nullptr; 215569986da116ed602c752395f9563260db38f6945Stephen Hines } 216569986da116ed602c752395f9563260db38f6945Stephen Hines } 217569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportVarNameList; 218900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportVarNameList = nullptr; 219569986da116ed602c752395f9563260db38f6945Stephen Hines 220569986da116ed602c752395f9563260db38f6945Stephen Hines if (mExportFuncNameList) { 221569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportFuncCount; i++) { 222569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportFuncNameList[i]; 223900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportFuncNameList[i] = nullptr; 224569986da116ed602c752395f9563260db38f6945Stephen Hines } 225569986da116ed602c752395f9563260db38f6945Stephen Hines } 226569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportFuncNameList; 227900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportFuncNameList = nullptr; 228569986da116ed602c752395f9563260db38f6945Stephen Hines 229cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mExportForEachNameList) { 230cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 231cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mExportForEachNameList[i]; 232900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachNameList[i] = nullptr; 233cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 234cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 235cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mExportForEachNameList; 236900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachNameList = nullptr; 237cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 23833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines delete [] mExportForEachSignatureList; 239900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachSignatureList = nullptr; 24033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 24179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mExportForEachInputCountList; 24279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross mExportForEachInputCountList = nullptr; 24379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 244a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross delete [] mExportReduceList; 245a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList = nullptr; 24679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 247cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 248cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mPragmaKeyList) { 249cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mPragmaKeyList[i]; 250900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaKeyList[i] = nullptr; 251cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 252cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mPragmaValueList) { 253cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mPragmaValueList[i]; 254900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaValueList[i] = nullptr; 255932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 256932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 257932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mPragmaKeyList; 258900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaKeyList = nullptr; 259932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mPragmaValueList; 260900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaValueList = nullptr; 261932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 262932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mObjectSlotList; 263900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mObjectSlotList = nullptr; 264932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 26551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar delete [] mBuildChecksum; 26651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 267932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 268932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 269932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 270932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 271932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool MetadataExtractor::populateObjectSlotMetadata( 272932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ObjectSlotMetadata) { 273932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!ObjectSlotMetadata) { 274932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 275932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 276932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 277932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotCount = ObjectSlotMetadata->getNumOperands(); 278932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 279932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mObjectSlotCount) { 280932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 281932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 282932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 283932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines uint32_t *TmpSlotList = new uint32_t[mObjectSlotCount]; 284932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines memset(TmpSlotList, 0, mObjectSlotCount * sizeof(*TmpSlotList)); 285932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 286932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines for (size_t i = 0; i < mObjectSlotCount; i++) { 287932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MDNode *ObjectSlot = ObjectSlotMetadata->getOperand(i); 288900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (ObjectSlot != nullptr && ObjectSlot->getNumOperands() == 1) { 289e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (!extractUIntFromMetadataString(&TmpSlotList[i], ObjectSlot->getOperand(0))) { 290e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Non-integer object slot value"); 291e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 292932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 293e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } else { 294e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Corrupt object slot information"); 295e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 296932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 297932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 298932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 299932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotList = TmpSlotList; 300932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 301932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 302932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 303932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 304932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 305932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid MetadataExtractor::populatePragmaMetadata( 306932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *PragmaMetadata) { 307932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!PragmaMetadata) { 308932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 309932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 310932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 311932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mPragmaCount = PragmaMetadata->getNumOperands(); 312932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mPragmaCount) { 313932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 314932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 315932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 316569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpKeyList = new const char*[mPragmaCount]; 317569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpValueList = new const char*[mPragmaCount]; 318932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 319932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 320932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MDNode *Pragma = PragmaMetadata->getOperand(i); 321900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (Pragma != nullptr && Pragma->getNumOperands() == 2) { 3221bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *PragmaKeyMDS = Pragma->getOperand(0); 323569986da116ed602c752395f9563260db38f6945Stephen Hines TmpKeyList[i] = createStringFromValue(PragmaKeyMDS); 3241bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *PragmaValueMDS = Pragma->getOperand(1); 325569986da116ed602c752395f9563260db38f6945Stephen Hines TmpValueList[i] = createStringFromValue(PragmaValueMDS); 326932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 327932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 328932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 329569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaKeyList = TmpKeyList; 330569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaValueList = TmpValueList; 331569986da116ed602c752395f9563260db38f6945Stephen Hines 332e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines // Check to see if we have any FP precision-related pragmas. 333e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines std::string Relaxed("rs_fp_relaxed"); 334e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines std::string Imprecise("rs_fp_imprecise"); 33532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines std::string Full("rs_fp_full"); 336e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines bool RelaxedPragmaSeen = false; 3375f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet bool FullPragmaSeen = false; 338e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 339e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines if (!Relaxed.compare(mPragmaKeyList[i])) { 340e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RelaxedPragmaSeen = true; 341e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } else if (!Imprecise.compare(mPragmaKeyList[i])) { 3425f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGW("rs_fp_imprecise is deprecated. Assuming rs_fp_relaxed instead."); 3435f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet RelaxedPragmaSeen = true; 3445f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet } else if (!Full.compare(mPragmaKeyList[i])) { 3455f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet FullPragmaSeen = true; 346e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 347e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 348e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 3495f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet if (RelaxedPragmaSeen && FullPragmaSeen) { 3505f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGE("Full and relaxed precision specified at the same time!"); 351e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 3525f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet mRSFloatPrecision = RelaxedPragmaSeen ? RS_FP_Relaxed : RS_FP_Full; 353e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 354fe0de789385f766e2dacbcfdb05fa57509db874eElliott Hughes#ifdef __ANDROID__ 3555f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet // Provide an override for precsiion via adb shell setprop 35632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_full 35732c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_relaxed 35832c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_imprecise 35932c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines char PrecisionPropBuf[PROPERTY_VALUE_MAX]; 36032c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines const std::string PrecisionPropName("debug.rs.precision"); 36132c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines property_get("debug.rs.precision", PrecisionPropBuf, ""); 36232c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines if (PrecisionPropBuf[0]) { 36332c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines if (!Relaxed.compare(PrecisionPropBuf)) { 3645f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGI("Switching to RS FP relaxed mode via setprop"); 36532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Relaxed; 36632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } else if (!Imprecise.compare(PrecisionPropBuf)) { 367900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes ALOGW("Switching to RS FP relaxed mode via setprop. rs_fp_imprecise was " 368900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes "specified but is deprecated "); 3695f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet mRSFloatPrecision = RS_FP_Relaxed; 37032c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } else if (!Full.compare(PrecisionPropBuf)) { 3715f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGI("Switching to RS FP full mode via setprop"); 37232c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Full; 3735f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet } else { 3745f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGE("Unrecognized debug.rs.precision %s", PrecisionPropBuf); 37532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } 37632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } 37785d9571c9bd327aebd0cdd2255a1ef4fa4b27df1Nick Kralevich#endif 378932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 379932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 380a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailesuint32_t MetadataExtractor::calculateNumInputs(const llvm::Function *Function, 381a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t Signature) { 382a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 383a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes if (hasForEachSignatureIn(Signature)) { 384a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t OtherCount = 0; 385a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 386a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureUsrData(Signature); 387a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureX(Signature); 388a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureY(Signature); 38933cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross OtherCount += hasForEachSignatureZ(Signature); 39033cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross OtherCount += hasForEachSignatureCtxt(Signature); 391a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureOut(Signature) && 392a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes Function->getReturnType()->isVoidTy(); 393a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 394a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes return Function->arg_size() - OtherCount; 395a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 396a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes } else { 397a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes return 0; 398a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes } 399a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes} 400a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 401a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 40233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hinesbool MetadataExtractor::populateForEachMetadata( 403cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Names, 404cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Signatures) { 40511de13e48f18daf77a64c3a627359e283b54cd15Stephen Hines if (!Names && !Signatures && mCompilerVersion == 0) { 4060231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // Handle legacy case for pre-ICS bitcode that doesn't contain a metadata 4070231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // section for ForEach. We generate a full signature for a "root" function 4080231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // which means that we need to set the bottom 5 bits in the mask. 4090231bb069417690bb4f513b80a9c0238112744f7Stephen Hines mExportForEachSignatureCount = 1; 410cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines char **TmpNameList = new char*[mExportForEachSignatureCount]; 411fb81ec1a875d13d9750006313b9123903336101dStephen Hines size_t RootLen = strlen(kRoot) + 1; 412fb81ec1a875d13d9750006313b9123903336101dStephen Hines TmpNameList[0] = new char[RootLen]; 413fb81ec1a875d13d9750006313b9123903336101dStephen Hines strncpy(TmpNameList[0], kRoot, RootLen); 414cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 4150231bb069417690bb4f513b80a9c0238112744f7Stephen Hines uint32_t *TmpSigList = new uint32_t[mExportForEachSignatureCount]; 4160231bb069417690bb4f513b80a9c0238112744f7Stephen Hines TmpSigList[0] = 0x1f; 417569986da116ed602c752395f9563260db38f6945Stephen Hines 418cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mExportForEachNameList = (const char**)TmpNameList; 4190231bb069417690bb4f513b80a9c0238112744f7Stephen Hines mExportForEachSignatureList = TmpSigList; 42033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 42133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 42233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 423109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Signatures) { 424109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount = Signatures->getNumOperands(); 425109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (!mExportForEachSignatureCount) { 426109be674a4ad2042f58f486042dded8c954e5300Stephen Hines return true; 427109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 428109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } else { 429109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount = 0; 430900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachSignatureList = nullptr; 43133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 43233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 43333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 43433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines uint32_t *TmpSigList = new uint32_t[mExportForEachSignatureCount]; 435569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpNameList = new const char*[mExportForEachSignatureCount]; 436a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t *TmpInputCountList = new uint32_t[mExportForEachSignatureCount]; 43733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 43833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 439cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines llvm::MDNode *SigNode = Signatures->getOperand(i); 440900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (SigNode != nullptr && SigNode->getNumOperands() == 1) { 441e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (!extractUIntFromMetadataString(&TmpSigList[i], SigNode->getOperand(0))) { 442e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Non-integer signature value"); 443e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 44433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 445e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } else { 446e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Corrupt signature information"); 447e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 44833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 44933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 45033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 451109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Names) { 452109be674a4ad2042f58f486042dded8c954e5300Stephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 453109be674a4ad2042f58f486042dded8c954e5300Stephen Hines llvm::MDNode *Name = Names->getOperand(i); 454900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (Name != nullptr && Name->getNumOperands() == 1) { 455109be674a4ad2042f58f486042dded8c954e5300Stephen Hines TmpNameList[i] = createStringFromValue(Name->getOperand(0)); 456a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 4578d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // Note that looking up the function by name can fail: One of 4588d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // the uses of MetadataExtractor is as part of the 4598d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // RSEmbedInfoPass, which bcc_compat runs sufficiently late in 4608d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // the phase order that RSKernelExpandPass has already run and 4618d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // the original (UNexpanded) kernel function (TmpNameList[i]) 4628d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // may have been deleted as having no references (if it has 4638d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // been inlined into the expanded kernel function and is 4648d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // otherwise unreferenced). 465900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes llvm::Function *Func = 466900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mModule->getFunction(llvm::StringRef(TmpNameList[i])); 467a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 468900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes TmpInputCountList[i] = (Func != nullptr) ? 469a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes calculateNumInputs(Func, TmpSigList[i]) : 0; 470109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 471109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 472109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } else { 473109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (mExportForEachSignatureCount != 1) { 4743e4cac486bc5a48640c4e65596a0be1ad05192e1Stephen Hines ALOGE("mExportForEachSignatureCount = %zu, but should be 1", 475109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount); 476cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 477109be674a4ad2042f58f486042dded8c954e5300Stephen Hines char *RootName = new char[5]; 478109be674a4ad2042f58f486042dded8c954e5300Stephen Hines strncpy(RootName, "root", 5); 479109be674a4ad2042f58f486042dded8c954e5300Stephen Hines TmpNameList[0] = RootName; 480cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 481cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 482569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachNameList = TmpNameList; 483569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachSignatureList = TmpSigList; 484a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes mExportForEachInputCountList = TmpInputCountList; 485569986da116ed602c752395f9563260db38f6945Stephen Hines 48633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 48733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines} 48833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 48933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 490a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Grossbool MetadataExtractor::populateReduceMetadata(const llvm::NamedMDNode *ReduceMetadata) { 491a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceCount = 0; 492a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList = nullptr; 49379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 494a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!ReduceMetadata || !(mExportReduceCount = ReduceMetadata->getNumOperands())) 49579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return true; 49679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 497a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross Reduce *TmpReduceList = new Reduce[mExportReduceCount]; 49879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 499a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross for (size_t i = 0; i < mExportReduceCount; i++) { 500a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross llvm::MDNode *Node = ReduceMetadata->getOperand(i); 50179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross if (!Node || Node->getNumOperands() < 3) { 50279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Missing reduce metadata"); 50379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 50479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 50579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 506a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mReduceName = createStringFromValue(Node->getOperand(0)); 50779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 508a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!extractUIntFromMetadataString(&TmpReduceList[i].mAccumulatorDataSize, 50979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross Node->getOperand(1))) { 51079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Non-integer accumulator data size value in reduce metadata"); 51179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 51279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 51379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 51479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross llvm::MDNode *AccumulatorNode = llvm::dyn_cast<llvm::MDNode>(Node->getOperand(2)); 51579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross if (!AccumulatorNode || AccumulatorNode->getNumOperands() != 2) { 51679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Malformed accumulator node in reduce metadata"); 51779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 51879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 519a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mAccumulatorName = createStringFromValue(AccumulatorNode->getOperand(0)); 520a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!extractUIntFromMetadataString(&TmpReduceList[i].mSignature, 52179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross AccumulatorNode->getOperand(1))) { 52279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Non-integer signature value in reduce metadata"); 52379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 52479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 5258d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // Note that looking up the function by name can fail: One of the 5268d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // uses of MetadataExtractor is as part of the RSEmbedInfoPass, 5278d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // which bcc_compat runs sufficiently late in the phase order that 5288d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // RSKernelExpandPass has already run and the original 5298d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // (UNexpanded) accumulator function (mAccumulatorName) may have 5308d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // been deleted as having no references (if it has been inlined 5318d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // into the expanded accumulator function and is otherwise 5328d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // unreferenced). 53379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross llvm::Function *Func = 534a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mModule->getFunction(llvm::StringRef(TmpReduceList[i].mAccumulatorName)); 53579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross // Why calculateNumInputs() - 1? The "-1" is because we don't 53679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross // want to treat the accumulator argument as an input. 537a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mInputCount = (Func ? calculateNumInputs(Func, TmpReduceList[i].mSignature) - 1 : 0); 53879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 539a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mInitializerName = createStringFromOptionalValue(Node, 3); 540a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mCombinerName = createStringFromOptionalValue(Node, 4); 541a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mOutConverterName = createStringFromOptionalValue(Node, 5); 542a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mHalterName = createStringFromOptionalValue(Node, 6); 54379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 54479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 545a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList = TmpReduceList; 54679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return true; 54779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross} 54879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 5499fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainarvoid MetadataExtractor::readThreadableFlag( 5509fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar const llvm::NamedMDNode *ThreadableMetadata) { 5519fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5529fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // Scripts are threadable by default. If we read a valid metadata value for 5539fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // 'ThreadableMetadataName' and it is set to 'no', we mark script as non 5549fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // threadable. All other exception paths retain the default value. 5559fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5569fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar mIsThreadable = true; 5579fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar if (ThreadableMetadata == nullptr) 5589fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return; 5599fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5609fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar llvm::MDNode *mdNode = ThreadableMetadata->getOperand(0); 5619fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar if (mdNode == nullptr) 5629fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return; 5639fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5641bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *mdValue = mdNode->getOperand(0); 5659fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar if (mdValue == nullptr) 5669fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return; 5679fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 568e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (getStringOperand(mdValue) == "no") 5699fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar mIsThreadable = false; 5709fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar} 5719fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 57251ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainarvoid MetadataExtractor::readBuildChecksumMetadata( 57351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar const llvm::NamedMDNode *ChecksumMetadata) { 57451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 57551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar if (ChecksumMetadata == nullptr) 57651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return; 57751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 5781bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::MDNode *mdNode = ChecksumMetadata->getOperand(0); 57951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar if (mdNode == nullptr) 58051ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return; 58151ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 5821bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *mdValue = mdNode->getOperand(0); 58351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar if (mdValue == nullptr) 58451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return; 58551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 58651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar mBuildChecksum = createStringFromValue(mdValue); 58751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar} 5889fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 589932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool MetadataExtractor::extract() { 590569986da116ed602c752395f9563260db38f6945Stephen Hines if (!(mBitcode && mBitcodeSize) && !mModule) { 591569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Invalid/empty bitcode/module"); 592932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 593932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 594932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 595d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::LLVMContext> mContext; 5968e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar bool shouldNullModule = false; 597569986da116ed602c752395f9563260db38f6945Stephen Hines 598569986da116ed602c752395f9563260db38f6945Stephen Hines if (!mModule) { 599569986da116ed602c752395f9563260db38f6945Stephen Hines mContext.reset(new llvm::LLVMContext()); 600d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::MemoryBuffer> MEM( 601569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::MemoryBuffer::getMemBuffer( 602e708ffe612f4566bea20334d2c9dac34db508e6eStephen Hines llvm::StringRef(mBitcode, mBitcodeSize), "", false)); 603569986da116ed602c752395f9563260db38f6945Stephen Hines std::string error; 604569986da116ed602c752395f9563260db38f6945Stephen Hines 6058e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar llvm::ErrorOr<std::unique_ptr<llvm::Module> > errval = 6068e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar llvm::parseBitcodeFile(MEM.get()->getMemBufferRef(), *mContext); 607d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines if (std::error_code ec = errval.getError()) { 608c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray ALOGE("Could not parse bitcode file"); 609c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray ALOGE("%s", ec.message().c_str()); 610c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray return false; 611569986da116ed602c752395f9563260db38f6945Stephen Hines } 6128e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar 6138e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar mModule = errval.get().release(); 6148e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar shouldNullModule = true; 615932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 616932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 617932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ExportVarMetadata = 618569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportVarMetadataName); 619932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ExportFuncMetadata = 620569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportFuncMetadataName); 621cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *ExportForEachNameMetadata = 622569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportForEachNameMetadataName); 62333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const llvm::NamedMDNode *ExportForEachMetadata = 624569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportForEachMetadataName); 625a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross const llvm::NamedMDNode *ExportReduceMetadata = 626a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mModule->getNamedMetadata(ExportReduceMetadataName); 627932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *PragmaMetadata = 628569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(PragmaMetadataName); 629932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ObjectSlotMetadata = 630569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ObjectSlotMetadataName); 6319fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar const llvm::NamedMDNode *ThreadableMetadata = 6329fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar mModule->getNamedMetadata(ThreadableMetadataName); 63351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar const llvm::NamedMDNode *ChecksumMetadata = 63451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar mModule->getNamedMetadata(ChecksumMetadataName); 635fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo const llvm::NamedMDNode *DebugInfoMetadata = 636fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo mModule->getNamedMetadata(DebugInfoMetadataName); 637094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 6381895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!populateNameMetadata(ExportVarMetadata, mExportVarNameList, 6391895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportVarCount)) { 640569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not populate export variable metadata"); 6418e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 642932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 643932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 6441895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!populateNameMetadata(ExportFuncMetadata, mExportFuncNameList, 6451895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportFuncCount)) { 646569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not populate export function metadata"); 6478e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 648932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 649932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 650cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (!populateForEachMetadata(ExportForEachNameMetadata, 651cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines ExportForEachMetadata)) { 65210c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not populate ForEach signature metadata"); 6538e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 65433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 65533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 656a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!populateReduceMetadata(ExportReduceMetadata)) { 65779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Could not populate export general reduction metadata"); 6588e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 65979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 66079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 661932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines populatePragmaMetadata(PragmaMetadata); 662932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 663932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!populateObjectSlotMetadata(ObjectSlotMetadata)) { 66410c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not populate object slot metadata"); 6658e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 666932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 667932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 6689fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar readThreadableFlag(ThreadableMetadata); 66951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar readBuildChecksumMetadata(ChecksumMetadata); 6709fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 671fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo mHasDebugInfo = DebugInfoMetadata != nullptr; 672fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo 6738e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar if (shouldNullModule) { 6748e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar mModule = nullptr; 6758e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar } 676932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 6778e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar 6788e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainarerr: 6798e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar if (shouldNullModule) { 6808e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar mModule = nullptr; 6818e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar } 6828e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar return false; 683932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 684932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 685932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // namespace bcinfo 686