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" 23d5c690148285e5c3a396ff0a48a3c20bdd833dd5Mark Salyzyn#include <log/log.h> 24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 25cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross#include "Assert.h" 26cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross 27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 28b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Constants.h" 29b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/LLVMContext.h" 30b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Module.h" 31a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes#include "llvm/IR/Function.h" 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h" 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 34110b1c1e87fe4a6a25f9ddc89ac4685779329b9dMiao Wang#ifdef __ANDROID__ 35110b1c1e87fe4a6a25f9ddc89ac4685779329b9dMiao Wang#include "Properties.h" 36110b1c1e87fe4a6a25f9ddc89ac4685779329b9dMiao Wang#endif 37110b1c1e87fe4a6a25f9ddc89ac4685779329b9dMiao Wang 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstdlib> 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo { 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 421bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hinesnamespace { 431bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines 44e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hinesllvm::StringRef getStringOperand(const llvm::Metadata *node) { 45e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (auto *mds = llvm::dyn_cast_or_null<const llvm::MDString>(node)) { 461bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines return mds->getString(); 471bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines } 481bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines return llvm::StringRef(); 491bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines} 50e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines 51e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hinesbool extractUIntFromMetadataString(uint32_t *value, 52e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines const llvm::Metadata *m) { 53e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines llvm::StringRef SigString = getStringOperand(m); 54e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (SigString != "") { 55e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (!SigString.getAsInteger(10, *value)) { 56e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return true; 57e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } 58e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } 59e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 60e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines} 61e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines 621895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Walaconst char *createStringFromValue(llvm::Metadata *m) { 631895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala auto ref = getStringOperand(m); 641895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala char *c = new char[ref.size() + 1]; 651895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala memcpy(c, ref.data(), ref.size()); 661895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala c[ref.size()] = '\0'; 671895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return c; 681bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines} 691bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines 7079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Grossconst char *createStringFromOptionalValue(llvm::MDNode *n, unsigned opndNum) { 7179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross llvm::Metadata *opnd; 7279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross if (opndNum >= n->getNumOperands() || !(opnd = n->getOperand(opndNum))) 7379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return nullptr; 7479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return createStringFromValue(opnd); 7579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross} 7679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 771895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Collect metadata from NamedMDNodes that contain a list of names 781895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// (strings). 791895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 801895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Inputs: 811895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 821895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// NamedMetadata - An LLVM metadata node, each of whose operands have 831895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// a string as their first entry 841895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 851895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// NameList - A reference that will hold an allocated array of strings 861895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 871895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Count - A reference that will hold the length of the allocated 881895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// array of strings 891895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 901895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Return value: 911895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 921895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Return true on success, false on error. 931895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 941895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Upon success, the function sets NameList to an array of strings 951895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// corresponding the names found in the metadata. The function sets 961895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// Count to the number of entries in NameList. 971895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// 981895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// An error occurs if one of the metadata operands doesn't have a 991895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala// first entry. 1001895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Walabool populateNameMetadata(const llvm::NamedMDNode *NameMetadata, 1011895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala const char **&NameList, size_t &Count) { 1021895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!NameMetadata) { 1031895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = nullptr; 1041895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala Count = 0; 1051895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return true; 1061895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1071895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1081895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala Count = NameMetadata->getNumOperands(); 1091895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!Count) { 1101895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = nullptr; 1111895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return true; 1121895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1131895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1141895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = new const char *[Count]; 1151895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1161895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala for (size_t i = 0; i < Count; i++) { 1171895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala llvm::MDNode *Name = NameMetadata->getOperand(i); 1181895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (Name && Name->getNumOperands() > 0) { 1191895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList[i] = createStringFromValue(Name->getOperand(0)); 1201895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } else { 1211895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala ALOGE("Metadata operand does not contain a name string"); 1221895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala for (size_t AllocatedIndex = 0; AllocatedIndex < i; AllocatedIndex++) { 1231895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala delete [] NameList[AllocatedIndex]; 1241895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1251895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala delete [] NameList; 1261895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala NameList = nullptr; 1271895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala Count = 0; 1281895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1291895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return false; 1301895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1311895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala } 1321895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1331895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala return true; 1341895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala} 1351895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 1361895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala} // end anonymous namespace 1371895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala 138932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where pragma info resides (should be synced with 139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// slang.cpp) 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef PragmaMetadataName = "#pragma"; 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where exported variable names reside (should be 143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ExportVarMetadataName = "#rs_export_var"; 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where exported function names reside (should be 147932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ExportFuncMetadataName = "#rs_export_func"; 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 150cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines// Name of metadata node where exported ForEach name information resides 151cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines// (should be synced with slang_rs_metadata.h) 152cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hinesstatic const llvm::StringRef ExportForEachNameMetadataName = 153cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines "#rs_export_foreach_name"; 154cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 15533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines// Name of metadata node where exported ForEach signature information resides 15633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines// (should be synced with slang_rs_metadata.h) 15733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hinesstatic const llvm::StringRef ExportForEachMetadataName = "#rs_export_foreach"; 15833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 15979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross// Name of metadata node where exported general reduce information resides 16079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross// (should be synced with slang_rs_metadata.h) 161a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Grossstatic const llvm::StringRef ExportReduceMetadataName = "#rs_export_reduce"; 16279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where RS object slot info resides (should be 164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ObjectSlotMetadataName = "#rs_object_slots"; 166932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 1679fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainarstatic const llvm::StringRef ThreadableMetadataName = "#rs_is_threadable"; 168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 16951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar// Name of metadata node where the checksum for this build is stored. (should 17051ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar// be synced with libbcc/lib/Core/Source.cpp) 17151ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainarstatic const llvm::StringRef ChecksumMetadataName = "#rs_build_checksum"; 17251ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 173fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo// Name of metadata node which contains a list of compile units that have debug 174fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo// metadata. If this is null then there is no debug metadata in the compile 175fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo// unit. 176fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leostatic const llvm::StringRef DebugInfoMetadataName = "llvm.dbg.cu"; 177fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo 178cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Grossconst char MetadataExtractor::kWrapperMetadataName[] = "#rs_wrapper"; 179cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross 180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesMetadataExtractor::MetadataExtractor(const char *bitcode, size_t bitcodeSize) 181900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes : mModule(nullptr), mBitcode(bitcode), mBitcodeSize(bitcodeSize), 182569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarCount(0), mExportFuncCount(0), mExportForEachSignatureCount(0), 183a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceCount(0), mExportVarNameList(nullptr), 1841895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportFuncNameList(nullptr), mExportForEachNameList(nullptr), 1851895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportForEachSignatureList(nullptr), 186a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportForEachInputCountList(nullptr), 187a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList(nullptr), 1881895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mPragmaCount(0), mPragmaKeyList(nullptr), mPragmaValueList(nullptr), 1891895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mObjectSlotCount(0), mObjectSlotList(nullptr), 1901895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mRSFloatPrecision(RS_FP_Full), mIsThreadable(true), 191fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo mBuildChecksum(nullptr), mHasDebugInfo(false) { 192b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines BitcodeWrapper wrapper(bitcode, bitcodeSize); 193b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines mCompilerVersion = wrapper.getCompilerVersion(); 194b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines mOptimizationLevel = wrapper.getOptimizationLevel(); 195569986da116ed602c752395f9563260db38f6945Stephen Hines} 196569986da116ed602c752395f9563260db38f6945Stephen Hines 197569986da116ed602c752395f9563260db38f6945Stephen HinesMetadataExtractor::MetadataExtractor(const llvm::Module *module) 1981895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala : mModule(module), mBitcode(nullptr), mBitcodeSize(0), 1991895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportVarCount(0), mExportFuncCount(0), mExportForEachSignatureCount(0), 200a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceCount(0), mExportVarNameList(nullptr), 2011895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportFuncNameList(nullptr), mExportForEachNameList(nullptr), 2021895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportForEachSignatureList(nullptr), 203a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportForEachInputCountList(nullptr), 204a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList(nullptr), 2051895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mPragmaCount(0), mPragmaKeyList(nullptr), mPragmaValueList(nullptr), 2061895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mObjectSlotCount(0), mObjectSlotList(nullptr), 2071895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mRSFloatPrecision(RS_FP_Full), mIsThreadable(true), 2081895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mBuildChecksum(nullptr) { 209cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross const llvm::NamedMDNode *const wrapperMDNode = module->getNamedMetadata(kWrapperMetadataName); 210cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross bccAssert((wrapperMDNode != nullptr) && (wrapperMDNode->getNumOperands() == 1)); 211cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross const llvm::MDNode *const wrapperMDTuple = wrapperMDNode->getOperand(0); 212cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross 213cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross bool success = true; 214cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross success &= extractUIntFromMetadataString(&mCompilerVersion, wrapperMDTuple->getOperand(0)); 215cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross success &= extractUIntFromMetadataString(&mOptimizationLevel, wrapperMDTuple->getOperand(1)); 216cf5afcb229806de1b62dee5a7cc0c7ba6a69f482David Gross bccAssert(success); 217932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 218932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 219932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 220932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesMetadataExtractor::~MetadataExtractor() { 221569986da116ed602c752395f9563260db38f6945Stephen Hines if (mExportVarNameList) { 222569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportVarCount; i++) { 223569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportVarNameList[i]; 224900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportVarNameList[i] = nullptr; 225569986da116ed602c752395f9563260db38f6945Stephen Hines } 226569986da116ed602c752395f9563260db38f6945Stephen Hines } 227569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportVarNameList; 228900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportVarNameList = nullptr; 229569986da116ed602c752395f9563260db38f6945Stephen Hines 230569986da116ed602c752395f9563260db38f6945Stephen Hines if (mExportFuncNameList) { 231569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportFuncCount; i++) { 232569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportFuncNameList[i]; 233900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportFuncNameList[i] = nullptr; 234569986da116ed602c752395f9563260db38f6945Stephen Hines } 235569986da116ed602c752395f9563260db38f6945Stephen Hines } 236569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportFuncNameList; 237900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportFuncNameList = nullptr; 238569986da116ed602c752395f9563260db38f6945Stephen Hines 239cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mExportForEachNameList) { 240cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 241cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mExportForEachNameList[i]; 242900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachNameList[i] = nullptr; 243cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 244cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 245cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mExportForEachNameList; 246900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachNameList = nullptr; 247cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 24833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines delete [] mExportForEachSignatureList; 249900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachSignatureList = nullptr; 25033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 25179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross delete [] mExportForEachInputCountList; 25279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross mExportForEachInputCountList = nullptr; 25379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 254a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross delete [] mExportReduceList; 255a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList = nullptr; 25679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 257cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 258cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mPragmaKeyList) { 259cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mPragmaKeyList[i]; 260900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaKeyList[i] = nullptr; 261cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 262cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mPragmaValueList) { 263cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mPragmaValueList[i]; 264900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaValueList[i] = nullptr; 265932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 266932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 267932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mPragmaKeyList; 268900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaKeyList = nullptr; 269932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mPragmaValueList; 270900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mPragmaValueList = nullptr; 271932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 272932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mObjectSlotList; 273900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mObjectSlotList = nullptr; 274932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 27551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar delete [] mBuildChecksum; 27651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 277932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 278932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 279932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 280932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 281932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool MetadataExtractor::populateObjectSlotMetadata( 282932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ObjectSlotMetadata) { 283932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!ObjectSlotMetadata) { 284932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 285932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 286932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 287932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotCount = ObjectSlotMetadata->getNumOperands(); 288932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 289932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mObjectSlotCount) { 290932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 291932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 292932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 293932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines uint32_t *TmpSlotList = new uint32_t[mObjectSlotCount]; 294932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines memset(TmpSlotList, 0, mObjectSlotCount * sizeof(*TmpSlotList)); 295932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 296932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines for (size_t i = 0; i < mObjectSlotCount; i++) { 297932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MDNode *ObjectSlot = ObjectSlotMetadata->getOperand(i); 298900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (ObjectSlot != nullptr && ObjectSlot->getNumOperands() == 1) { 299e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (!extractUIntFromMetadataString(&TmpSlotList[i], ObjectSlot->getOperand(0))) { 300e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Non-integer object slot value"); 301e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 302932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 303e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } else { 304e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Corrupt object slot information"); 305e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 306932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 307932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 308932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 309932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotList = TmpSlotList; 310932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 311932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 312932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 313932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 314932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 315932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid MetadataExtractor::populatePragmaMetadata( 316932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *PragmaMetadata) { 317932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!PragmaMetadata) { 318932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 319932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 320932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 321932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mPragmaCount = PragmaMetadata->getNumOperands(); 322932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mPragmaCount) { 323932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 324932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 325932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 326569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpKeyList = new const char*[mPragmaCount]; 327569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpValueList = new const char*[mPragmaCount]; 328932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 329932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 330932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MDNode *Pragma = PragmaMetadata->getOperand(i); 331900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (Pragma != nullptr && Pragma->getNumOperands() == 2) { 3321bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *PragmaKeyMDS = Pragma->getOperand(0); 333569986da116ed602c752395f9563260db38f6945Stephen Hines TmpKeyList[i] = createStringFromValue(PragmaKeyMDS); 3341bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *PragmaValueMDS = Pragma->getOperand(1); 335569986da116ed602c752395f9563260db38f6945Stephen Hines TmpValueList[i] = createStringFromValue(PragmaValueMDS); 336932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 337932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 338932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 339569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaKeyList = TmpKeyList; 340569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaValueList = TmpValueList; 341569986da116ed602c752395f9563260db38f6945Stephen Hines 342e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines // Check to see if we have any FP precision-related pragmas. 343e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines std::string Relaxed("rs_fp_relaxed"); 344e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines std::string Imprecise("rs_fp_imprecise"); 34532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines std::string Full("rs_fp_full"); 346e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines bool RelaxedPragmaSeen = false; 3475f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet bool FullPragmaSeen = false; 348e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 349e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines if (!Relaxed.compare(mPragmaKeyList[i])) { 350e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RelaxedPragmaSeen = true; 351e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } else if (!Imprecise.compare(mPragmaKeyList[i])) { 3525f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGW("rs_fp_imprecise is deprecated. Assuming rs_fp_relaxed instead."); 3535f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet RelaxedPragmaSeen = true; 3545f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet } else if (!Full.compare(mPragmaKeyList[i])) { 3555f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet FullPragmaSeen = true; 356e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 357e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 358e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 3595f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet if (RelaxedPragmaSeen && FullPragmaSeen) { 3605f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGE("Full and relaxed precision specified at the same time!"); 361e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 3625f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet mRSFloatPrecision = RelaxedPragmaSeen ? RS_FP_Relaxed : RS_FP_Full; 363e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 364fe0de789385f766e2dacbcfdb05fa57509db874eElliott Hughes#ifdef __ANDROID__ 3655f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet // Provide an override for precsiion via adb shell setprop 36632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_full 36732c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_relaxed 36832c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_imprecise 369110b1c1e87fe4a6a25f9ddc89ac4685779329b9dMiao Wang char PrecisionPropBuf[PROP_VALUE_MAX]; 37032c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines const std::string PrecisionPropName("debug.rs.precision"); 37132c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines property_get("debug.rs.precision", PrecisionPropBuf, ""); 37232c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines if (PrecisionPropBuf[0]) { 37332c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines if (!Relaxed.compare(PrecisionPropBuf)) { 3745f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGI("Switching to RS FP relaxed mode via setprop"); 37532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Relaxed; 37632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } else if (!Imprecise.compare(PrecisionPropBuf)) { 377900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes ALOGW("Switching to RS FP relaxed mode via setprop. rs_fp_imprecise was " 378900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes "specified but is deprecated "); 3795f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet mRSFloatPrecision = RS_FP_Relaxed; 38032c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } else if (!Full.compare(PrecisionPropBuf)) { 3815f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGI("Switching to RS FP full mode via setprop"); 38232c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Full; 3835f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet } else { 3845f2e6b9bc70956fc30a9a6d1679f587e4a729884Jean-Luc Brouillet ALOGE("Unrecognized debug.rs.precision %s", PrecisionPropBuf); 38532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } 38632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } 38785d9571c9bd327aebd0cdd2255a1ef4fa4b27df1Nick Kralevich#endif 388932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 389932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 390a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailesuint32_t MetadataExtractor::calculateNumInputs(const llvm::Function *Function, 391a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t Signature) { 392a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 393a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes if (hasForEachSignatureIn(Signature)) { 394a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t OtherCount = 0; 395a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 396a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureUsrData(Signature); 397a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureX(Signature); 398a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureY(Signature); 39933cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross OtherCount += hasForEachSignatureZ(Signature); 40033cda5cf335afc6aa2dbe02062bc9e6649e1f87cDavid Gross OtherCount += hasForEachSignatureCtxt(Signature); 401a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes OtherCount += hasForEachSignatureOut(Signature) && 402a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes Function->getReturnType()->isVoidTy(); 403a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 404a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes return Function->arg_size() - OtherCount; 405a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 406a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes } else { 407a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes return 0; 408a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes } 409a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes} 410a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 411a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 41233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hinesbool MetadataExtractor::populateForEachMetadata( 413cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Names, 414cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Signatures) { 41511de13e48f18daf77a64c3a627359e283b54cd15Stephen Hines if (!Names && !Signatures && mCompilerVersion == 0) { 4160231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // Handle legacy case for pre-ICS bitcode that doesn't contain a metadata 4170231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // section for ForEach. We generate a full signature for a "root" function 4180231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // which means that we need to set the bottom 5 bits in the mask. 4190231bb069417690bb4f513b80a9c0238112744f7Stephen Hines mExportForEachSignatureCount = 1; 420cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines char **TmpNameList = new char*[mExportForEachSignatureCount]; 421fb81ec1a875d13d9750006313b9123903336101dStephen Hines size_t RootLen = strlen(kRoot) + 1; 422fb81ec1a875d13d9750006313b9123903336101dStephen Hines TmpNameList[0] = new char[RootLen]; 423fb81ec1a875d13d9750006313b9123903336101dStephen Hines strncpy(TmpNameList[0], kRoot, RootLen); 424cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 4250231bb069417690bb4f513b80a9c0238112744f7Stephen Hines uint32_t *TmpSigList = new uint32_t[mExportForEachSignatureCount]; 4260231bb069417690bb4f513b80a9c0238112744f7Stephen Hines TmpSigList[0] = 0x1f; 427569986da116ed602c752395f9563260db38f6945Stephen Hines 428cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mExportForEachNameList = (const char**)TmpNameList; 4290231bb069417690bb4f513b80a9c0238112744f7Stephen Hines mExportForEachSignatureList = TmpSigList; 43033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 43133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 43233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 433109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Signatures) { 434109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount = Signatures->getNumOperands(); 435109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (!mExportForEachSignatureCount) { 436109be674a4ad2042f58f486042dded8c954e5300Stephen Hines return true; 437109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 438109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } else { 439109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount = 0; 440900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mExportForEachSignatureList = nullptr; 44133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 44233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 44333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 44433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines uint32_t *TmpSigList = new uint32_t[mExportForEachSignatureCount]; 445569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpNameList = new const char*[mExportForEachSignatureCount]; 446a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes uint32_t *TmpInputCountList = new uint32_t[mExportForEachSignatureCount]; 44733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 44833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 449cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines llvm::MDNode *SigNode = Signatures->getOperand(i); 450900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (SigNode != nullptr && SigNode->getNumOperands() == 1) { 451e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (!extractUIntFromMetadataString(&TmpSigList[i], SigNode->getOperand(0))) { 452e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Non-integer signature value"); 453e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 45433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 455e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines } else { 456e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines ALOGE("Corrupt signature information"); 457e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines return false; 45833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 45933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 46033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 461109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Names) { 462109be674a4ad2042f58f486042dded8c954e5300Stephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 463109be674a4ad2042f58f486042dded8c954e5300Stephen Hines llvm::MDNode *Name = Names->getOperand(i); 464900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes if (Name != nullptr && Name->getNumOperands() == 1) { 465109be674a4ad2042f58f486042dded8c954e5300Stephen Hines TmpNameList[i] = createStringFromValue(Name->getOperand(0)); 466a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 4678d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // Note that looking up the function by name can fail: One of 4688d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // the uses of MetadataExtractor is as part of the 4698d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // RSEmbedInfoPass, which bcc_compat runs sufficiently late in 4708d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // the phase order that RSKernelExpandPass has already run and 4718d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // the original (UNexpanded) kernel function (TmpNameList[i]) 4728d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // may have been deleted as having no references (if it has 4738d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // been inlined into the expanded kernel function and is 4748d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // otherwise unreferenced). 475900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes llvm::Function *Func = 476900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mModule->getFunction(llvm::StringRef(TmpNameList[i])); 477a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes 478900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes TmpInputCountList[i] = (Func != nullptr) ? 479a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes calculateNumInputs(Func, TmpSigList[i]) : 0; 480109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 481109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 482109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } else { 483109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (mExportForEachSignatureCount != 1) { 4843e4cac486bc5a48640c4e65596a0be1ad05192e1Stephen Hines ALOGE("mExportForEachSignatureCount = %zu, but should be 1", 485109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount); 486cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 487109be674a4ad2042f58f486042dded8c954e5300Stephen Hines char *RootName = new char[5]; 488109be674a4ad2042f58f486042dded8c954e5300Stephen Hines strncpy(RootName, "root", 5); 489109be674a4ad2042f58f486042dded8c954e5300Stephen Hines TmpNameList[0] = RootName; 490cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 491cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 492569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachNameList = TmpNameList; 493569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachSignatureList = TmpSigList; 494a668182c61d2f3079416317b6c2914428a6a4c7aChris Wailes mExportForEachInputCountList = TmpInputCountList; 495569986da116ed602c752395f9563260db38f6945Stephen Hines 49633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 49733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines} 49833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 49933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 500a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Grossbool MetadataExtractor::populateReduceMetadata(const llvm::NamedMDNode *ReduceMetadata) { 501a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceCount = 0; 502a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mExportReduceList = nullptr; 50379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 504a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!ReduceMetadata || !(mExportReduceCount = ReduceMetadata->getNumOperands())) 50579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return true; 50679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 507d389fdd75cab6b3ad25a499599761726e3840bcbLuis Lozano std::unique_ptr<Reduce[]> TmpReduceList(new Reduce[mExportReduceCount]); 50879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 509a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross for (size_t i = 0; i < mExportReduceCount; i++) { 510a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross llvm::MDNode *Node = ReduceMetadata->getOperand(i); 51179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross if (!Node || Node->getNumOperands() < 3) { 51279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Missing reduce metadata"); 51379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 51479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 51579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 516a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mReduceName = createStringFromValue(Node->getOperand(0)); 51779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 518a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!extractUIntFromMetadataString(&TmpReduceList[i].mAccumulatorDataSize, 51979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross Node->getOperand(1))) { 52079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Non-integer accumulator data size value in reduce metadata"); 52179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 52279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 52379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 52479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross llvm::MDNode *AccumulatorNode = llvm::dyn_cast<llvm::MDNode>(Node->getOperand(2)); 52579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross if (!AccumulatorNode || AccumulatorNode->getNumOperands() != 2) { 52679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Malformed accumulator node in reduce metadata"); 52779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 52879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 529a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mAccumulatorName = createStringFromValue(AccumulatorNode->getOperand(0)); 530a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!extractUIntFromMetadataString(&TmpReduceList[i].mSignature, 53179e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross AccumulatorNode->getOperand(1))) { 53279e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Non-integer signature value in reduce metadata"); 53379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return false; 53479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 5358d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // Note that looking up the function by name can fail: One of the 5368d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // uses of MetadataExtractor is as part of the RSEmbedInfoPass, 5378d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // which bcc_compat runs sufficiently late in the phase order that 5388d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // RSKernelExpandPass has already run and the original 5398d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // (UNexpanded) accumulator function (mAccumulatorName) may have 5408d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // been deleted as having no references (if it has been inlined 5418d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // into the expanded accumulator function and is otherwise 5428d7fe847327eeb07c5a4770c31235dc28d570c97David Gross // unreferenced). 54379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross llvm::Function *Func = 544a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mModule->getFunction(llvm::StringRef(TmpReduceList[i].mAccumulatorName)); 54579e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross // Why calculateNumInputs() - 1? The "-1" is because we don't 54679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross // want to treat the accumulator argument as an input. 547a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mInputCount = (Func ? calculateNumInputs(Func, TmpReduceList[i].mSignature) - 1 : 0); 54879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 549a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mInitializerName = createStringFromOptionalValue(Node, 3); 550a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mCombinerName = createStringFromOptionalValue(Node, 4); 551a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mOutConverterName = createStringFromOptionalValue(Node, 5); 552a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross TmpReduceList[i].mHalterName = createStringFromOptionalValue(Node, 6); 55379e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 55479e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 555d389fdd75cab6b3ad25a499599761726e3840bcbLuis Lozano mExportReduceList = TmpReduceList.release(); 55679e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross return true; 55779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross} 55879e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 5599fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainarvoid MetadataExtractor::readThreadableFlag( 5609fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar const llvm::NamedMDNode *ThreadableMetadata) { 5619fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5629fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // Scripts are threadable by default. If we read a valid metadata value for 5639fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // 'ThreadableMetadataName' and it is set to 'no', we mark script as non 5649fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar // threadable. All other exception paths retain the default value. 5659fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5669fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar mIsThreadable = true; 5679fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar if (ThreadableMetadata == nullptr) 5689fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return; 5699fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5709fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar llvm::MDNode *mdNode = ThreadableMetadata->getOperand(0); 5719fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar if (mdNode == nullptr) 5729fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return; 5739fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 5741bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *mdValue = mdNode->getOperand(0); 5759fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar if (mdValue == nullptr) 5769fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar return; 5779fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 578e1c7d298e3e38ffff294ce57c37ab43827a67ee5Stephen Hines if (getStringOperand(mdValue) == "no") 5799fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar mIsThreadable = false; 5809fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar} 5819fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 58251ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainarvoid MetadataExtractor::readBuildChecksumMetadata( 58351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar const llvm::NamedMDNode *ChecksumMetadata) { 58451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 58551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar if (ChecksumMetadata == nullptr) 58651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return; 58751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 5881bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::MDNode *mdNode = ChecksumMetadata->getOperand(0); 58951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar if (mdNode == nullptr) 59051ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return; 59151ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 5921bd9f627fa0affb457507e86b0b6684c695fe726Stephen Hines llvm::Metadata *mdValue = mdNode->getOperand(0); 59351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar if (mdValue == nullptr) 59451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar return; 59551ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar 59651ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar mBuildChecksum = createStringFromValue(mdValue); 59751ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar} 5989fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 599932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool MetadataExtractor::extract() { 600569986da116ed602c752395f9563260db38f6945Stephen Hines if (!(mBitcode && mBitcodeSize) && !mModule) { 601569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Invalid/empty bitcode/module"); 602932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 603932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 604932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 605d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::LLVMContext> mContext; 6068e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar bool shouldNullModule = false; 607569986da116ed602c752395f9563260db38f6945Stephen Hines 608569986da116ed602c752395f9563260db38f6945Stephen Hines if (!mModule) { 609569986da116ed602c752395f9563260db38f6945Stephen Hines mContext.reset(new llvm::LLVMContext()); 610d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::MemoryBuffer> MEM( 611569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::MemoryBuffer::getMemBuffer( 612e708ffe612f4566bea20334d2c9dac34db508e6eStephen Hines llvm::StringRef(mBitcode, mBitcodeSize), "", false)); 613569986da116ed602c752395f9563260db38f6945Stephen Hines std::string error; 614569986da116ed602c752395f9563260db38f6945Stephen Hines 6158e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar llvm::ErrorOr<std::unique_ptr<llvm::Module> > errval = 6168e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar llvm::parseBitcodeFile(MEM.get()->getMemBufferRef(), *mContext); 617d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines if (std::error_code ec = errval.getError()) { 618c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray ALOGE("Could not parse bitcode file"); 619c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray ALOGE("%s", ec.message().c_str()); 620c2074caf075818abb6d3689ad924ca09f4a5ba1fTim Murray return false; 621569986da116ed602c752395f9563260db38f6945Stephen Hines } 6228e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar 6238e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar mModule = errval.get().release(); 6248e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar shouldNullModule = true; 625932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 626932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 627932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ExportVarMetadata = 628569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportVarMetadataName); 629932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ExportFuncMetadata = 630569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportFuncMetadataName); 631cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *ExportForEachNameMetadata = 632569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportForEachNameMetadataName); 63333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const llvm::NamedMDNode *ExportForEachMetadata = 634569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportForEachMetadataName); 635a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross const llvm::NamedMDNode *ExportReduceMetadata = 636a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross mModule->getNamedMetadata(ExportReduceMetadataName); 637932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *PragmaMetadata = 638569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(PragmaMetadataName); 639932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ObjectSlotMetadata = 640569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ObjectSlotMetadataName); 6419fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar const llvm::NamedMDNode *ThreadableMetadata = 6429fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar mModule->getNamedMetadata(ThreadableMetadataName); 64351ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar const llvm::NamedMDNode *ChecksumMetadata = 64451ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar mModule->getNamedMetadata(ChecksumMetadataName); 645fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo const llvm::NamedMDNode *DebugInfoMetadata = 646fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo mModule->getNamedMetadata(DebugInfoMetadataName); 647094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 6481895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!populateNameMetadata(ExportVarMetadata, mExportVarNameList, 6491895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportVarCount)) { 650569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not populate export variable metadata"); 6518e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 652932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 653932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 6541895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala if (!populateNameMetadata(ExportFuncMetadata, mExportFuncNameList, 6551895ac12bda8ebb1097dd3336e0919e2f08cbc4aMatt Wala mExportFuncCount)) { 656569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not populate export function metadata"); 6578e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 658932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 659932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 660cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (!populateForEachMetadata(ExportForEachNameMetadata, 661cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines ExportForEachMetadata)) { 66210c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not populate ForEach signature metadata"); 6638e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 66433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 66533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 666a48ea364652efcf947dd33c8a6ba893e9c00dd6aDavid Gross if (!populateReduceMetadata(ExportReduceMetadata)) { 66779e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross ALOGE("Could not populate export general reduction metadata"); 6688e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 66979e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross } 67079e1a05f704ada1bb12749fe3f8b9b69309be9e5David Gross 671932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines populatePragmaMetadata(PragmaMetadata); 672932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 673932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!populateObjectSlotMetadata(ObjectSlotMetadata)) { 67410c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not populate object slot metadata"); 6758e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar goto err; 676932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 677932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 6789fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar readThreadableFlag(ThreadableMetadata); 67951ee77bd31e7d8ca6c89e37b5806c8fc2afcf0dcPirama Arumuga Nainar readBuildChecksumMetadata(ChecksumMetadata); 6809fe081b8bae8a95d903f8fa8dc0a7590ae706606Pirama Arumuga Nainar 681fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo mHasDebugInfo = DebugInfoMetadata != nullptr; 682fff398dc41bb579c7ad668387eebf9e3e972aecaDean De Leo 6838e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar if (shouldNullModule) { 6848e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar mModule = nullptr; 6858e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar } 686932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 6878e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar 6888e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainarerr: 6898e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar if (shouldNullModule) { 6908e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar mModule = nullptr; 6918e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar } 6928e9089377848628813a697b972773e969b942c3bPirama Arumuga Nainar return false; 693932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 694932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 695932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // namespace bcinfo 696