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" 20b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines 21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define LOG_TAG "bcinfo" 22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cutils/log.h> 2332c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines#include <cutils/properties.h> 24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/ADT/OwningPtr.h" 26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 27094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea#include "llvm/Constants.h" 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/LLVMContext.h" 29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Module.h" 30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h" 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstdlib> 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo { 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where pragma info resides (should be synced with 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// slang.cpp) 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef PragmaMetadataName = "#pragma"; 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where exported variable names reside (should be 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ExportVarMetadataName = "#rs_export_var"; 43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where exported function names reside (should be 45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ExportFuncMetadataName = "#rs_export_func"; 47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 48cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines// Name of metadata node where exported ForEach name information resides 49cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines// (should be synced with slang_rs_metadata.h) 50cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hinesstatic const llvm::StringRef ExportForEachNameMetadataName = 51cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines "#rs_export_foreach_name"; 52cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 5333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines// Name of metadata node where exported ForEach signature information resides 5433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines// (should be synced with slang_rs_metadata.h) 5533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hinesstatic const llvm::StringRef ExportForEachMetadataName = "#rs_export_foreach"; 5633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// Name of metadata node where RS object slot info resides (should be 58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// synced with slang_rs_metadata.h) 59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const llvm::StringRef ObjectSlotMetadataName = "#rs_object_slots"; 60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesMetadataExtractor::MetadataExtractor(const char *bitcode, size_t bitcodeSize) 63569986da116ed602c752395f9563260db38f6945Stephen Hines : mModule(NULL), mBitcode(bitcode), mBitcodeSize(bitcodeSize), 64569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarCount(0), mExportFuncCount(0), mExportForEachSignatureCount(0), 65569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarNameList(NULL), mExportFuncNameList(NULL), 66569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachNameList(NULL), mExportForEachSignatureList(NULL), 67569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaCount(0), mPragmaKeyList(NULL), mPragmaValueList(NULL), 68a7e5c8f85434e9b8cb0637da302135ba2e2976f5Stephen Hines mObjectSlotCount(0), mObjectSlotList(NULL), 69e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines mRSFloatPrecision(RS_FP_Full) { 70b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines BitcodeWrapper wrapper(bitcode, bitcodeSize); 71b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines mCompilerVersion = wrapper.getCompilerVersion(); 72b67c9e7a28cb734c1d62d835c33dedbe45074356Stephen Hines mOptimizationLevel = wrapper.getOptimizationLevel(); 73569986da116ed602c752395f9563260db38f6945Stephen Hines} 74569986da116ed602c752395f9563260db38f6945Stephen Hines 75569986da116ed602c752395f9563260db38f6945Stephen Hines 76569986da116ed602c752395f9563260db38f6945Stephen HinesMetadataExtractor::MetadataExtractor(const llvm::Module *module) 77569986da116ed602c752395f9563260db38f6945Stephen Hines : mModule(module), mBitcode(NULL), mBitcodeSize(0), mExportVarCount(0), 7833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines mExportFuncCount(0), mExportForEachSignatureCount(0), 79569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarNameList(NULL), mExportFuncNameList(NULL), 80cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mExportForEachNameList(NULL), mExportForEachSignatureList(NULL), 81cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mPragmaCount(0), mPragmaKeyList(NULL), mPragmaValueList(NULL), 8298abb2d77b6519a43c98427141ba1ded42441b8aStephen Hines mObjectSlotCount(0), mObjectSlotList(NULL), 8398abb2d77b6519a43c98427141ba1ded42441b8aStephen Hines mRSFloatPrecision(RS_FP_Full) { 84a7e5c8f85434e9b8cb0637da302135ba2e2976f5Stephen Hines mCompilerVersion = 0; 85a7e5c8f85434e9b8cb0637da302135ba2e2976f5Stephen Hines mOptimizationLevel = 3; 86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesMetadataExtractor::~MetadataExtractor() { 90569986da116ed602c752395f9563260db38f6945Stephen Hines if (mExportVarNameList) { 91569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportVarCount; i++) { 92569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportVarNameList[i]; 93569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarNameList[i] = NULL; 94569986da116ed602c752395f9563260db38f6945Stephen Hines } 95569986da116ed602c752395f9563260db38f6945Stephen Hines } 96569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportVarNameList; 97569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarNameList = NULL; 98569986da116ed602c752395f9563260db38f6945Stephen Hines 99569986da116ed602c752395f9563260db38f6945Stephen Hines if (mExportFuncNameList) { 100569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportFuncCount; i++) { 101569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportFuncNameList[i]; 102569986da116ed602c752395f9563260db38f6945Stephen Hines mExportFuncNameList[i] = NULL; 103569986da116ed602c752395f9563260db38f6945Stephen Hines } 104569986da116ed602c752395f9563260db38f6945Stephen Hines } 105569986da116ed602c752395f9563260db38f6945Stephen Hines delete [] mExportFuncNameList; 106569986da116ed602c752395f9563260db38f6945Stephen Hines mExportFuncNameList = NULL; 107569986da116ed602c752395f9563260db38f6945Stephen Hines 108cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mExportForEachNameList) { 109cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 110cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mExportForEachNameList[i]; 111cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mExportForEachNameList[i] = NULL; 112cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 113cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 114cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mExportForEachNameList; 115cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mExportForEachNameList = NULL; 116cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 11733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines delete [] mExportForEachSignatureList; 11833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines mExportForEachSignatureList = NULL; 11933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 120cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 121cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mPragmaKeyList) { 122cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mPragmaKeyList[i]; 123cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mPragmaKeyList[i] = NULL; 124cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 125cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (mPragmaValueList) { 126cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines delete [] mPragmaValueList[i]; 127cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mPragmaValueList[i] = NULL; 128932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 129932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 130932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mPragmaKeyList; 131932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mPragmaKeyList = NULL; 132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mPragmaValueList; 133932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mPragmaValueList = NULL; 134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 135932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mObjectSlotList; 136932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotList = NULL; 137932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 138932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 139932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 140932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 141932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 142932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool MetadataExtractor::populateObjectSlotMetadata( 143932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ObjectSlotMetadata) { 144932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!ObjectSlotMetadata) { 145932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 146932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 147932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 148932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotCount = ObjectSlotMetadata->getNumOperands(); 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mObjectSlotCount) { 151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 152932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 153932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 154932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines uint32_t *TmpSlotList = new uint32_t[mObjectSlotCount]; 155932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines memset(TmpSlotList, 0, mObjectSlotCount * sizeof(*TmpSlotList)); 156932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 157932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines for (size_t i = 0; i < mObjectSlotCount; i++) { 158932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MDNode *ObjectSlot = ObjectSlotMetadata->getOperand(i); 159932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (ObjectSlot != NULL && ObjectSlot->getNumOperands() == 1) { 160932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::Value *SlotMDS = ObjectSlot->getOperand(0); 161932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (SlotMDS->getValueID() == llvm::Value::MDStringVal) { 162932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::StringRef Slot = 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines static_cast<llvm::MDString*>(SlotMDS)->getString(); 164932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines uint32_t USlot = 0; 165932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Slot.getAsInteger(10, USlot)) { 16610c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Non-integer object slot value '%s'", Slot.str().c_str()); 167932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 168932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 169932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines TmpSlotList[i] = USlot; 170932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 171932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 172932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 173932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 174932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mObjectSlotList = TmpSlotList; 175932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 176932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 177932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 178932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 179932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesstatic const char *createStringFromValue(llvm::Value *v) { 181932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (v->getValueID() != llvm::Value::MDStringVal) { 182932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return NULL; 183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 184932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 185932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::StringRef ref = static_cast<llvm::MDString*>(v)->getString(); 186932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 187932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char *c = new char[ref.size() + 1]; 188932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines memcpy(c, ref.data(), ref.size()); 189932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines c[ref.size()] = '\0'; 190932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 191932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return c; 192932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 193932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 194932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 195932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid MetadataExtractor::populatePragmaMetadata( 196932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *PragmaMetadata) { 197932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!PragmaMetadata) { 198932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 199932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 200932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 201932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mPragmaCount = PragmaMetadata->getNumOperands(); 202932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mPragmaCount) { 203932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 204932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 205932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 206569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpKeyList = new const char*[mPragmaCount]; 207569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpValueList = new const char*[mPragmaCount]; 208932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 209932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 210932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MDNode *Pragma = PragmaMetadata->getOperand(i); 211932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (Pragma != NULL && Pragma->getNumOperands() == 2) { 212932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::Value *PragmaKeyMDS = Pragma->getOperand(0); 213569986da116ed602c752395f9563260db38f6945Stephen Hines TmpKeyList[i] = createStringFromValue(PragmaKeyMDS); 214932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::Value *PragmaValueMDS = Pragma->getOperand(1); 215569986da116ed602c752395f9563260db38f6945Stephen Hines TmpValueList[i] = createStringFromValue(PragmaValueMDS); 216932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 217932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 218932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 219569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaKeyList = TmpKeyList; 220569986da116ed602c752395f9563260db38f6945Stephen Hines mPragmaValueList = TmpValueList; 221569986da116ed602c752395f9563260db38f6945Stephen Hines 222e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines // Check to see if we have any FP precision-related pragmas. 223e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines std::string Relaxed("rs_fp_relaxed"); 224e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines std::string Imprecise("rs_fp_imprecise"); 22532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines std::string Full("rs_fp_full"); 226e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines bool RelaxedPragmaSeen = false; 227e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines bool ImprecisePragmaSeen = false; 228e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 229e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines for (size_t i = 0; i < mPragmaCount; i++) { 230e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines if (!Relaxed.compare(mPragmaKeyList[i])) { 231e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines if (RelaxedPragmaSeen || ImprecisePragmaSeen) { 232e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines ALOGE("Multiple float precision pragmas specified!"); 233e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 234e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines RelaxedPragmaSeen = true; 235e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } else if (!Imprecise.compare(mPragmaKeyList[i])) { 236e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines if (RelaxedPragmaSeen || ImprecisePragmaSeen) { 237e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines ALOGE("Multiple float precision pragmas specified!"); 238e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 239e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines ImprecisePragmaSeen = true; 240e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 241e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 242e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 243e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines // Imprecise is selected over Relaxed precision. 244e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines // In the absence of both, we stick to the default Full precision. 245e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines if (ImprecisePragmaSeen) { 246e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines mRSFloatPrecision = RS_FP_Imprecise; 247e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } else if (RelaxedPragmaSeen) { 248e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines mRSFloatPrecision = RS_FP_Relaxed; 249e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines } 250e1fd804a58c0ed67c75566c784d0b20d81e97adaStephen Hines 25132c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // Provide an override for precsion via adb shell setprop 25232c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_full 25332c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_relaxed 25432c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines // adb shell setprop debug.rs.precision rs_fp_imprecise 25532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines char PrecisionPropBuf[PROPERTY_VALUE_MAX]; 25632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines const std::string PrecisionPropName("debug.rs.precision"); 25732c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines property_get("debug.rs.precision", PrecisionPropBuf, ""); 25832c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines if (PrecisionPropBuf[0]) { 25932c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines if (!Relaxed.compare(PrecisionPropBuf)) { 26032c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines ALOGE("Switching to RS FP relaxed mode via setprop"); 26132c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Relaxed; 26232c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } else if (!Imprecise.compare(PrecisionPropBuf)) { 26332c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines ALOGE("Switching to RS FP imprecise mode via setprop"); 26432c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Imprecise; 26532c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } else if (!Full.compare(PrecisionPropBuf)) { 26632c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines ALOGE("Switching to RS FP full mode via setprop"); 26732c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines mRSFloatPrecision = RS_FP_Full; 26832c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } 26932c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines } 27032c56ecf42ad3d99d40e9bf1ac2a097d27f12744Stephen Hines 271932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 272932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 273932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 274932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 275569986da116ed602c752395f9563260db38f6945Stephen Hinesbool MetadataExtractor::populateVarNameMetadata( 276569986da116ed602c752395f9563260db38f6945Stephen Hines const llvm::NamedMDNode *VarNameMetadata) { 277569986da116ed602c752395f9563260db38f6945Stephen Hines if (!VarNameMetadata) { 278569986da116ed602c752395f9563260db38f6945Stephen Hines return true; 279569986da116ed602c752395f9563260db38f6945Stephen Hines } 280569986da116ed602c752395f9563260db38f6945Stephen Hines 281569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarCount = VarNameMetadata->getNumOperands(); 282569986da116ed602c752395f9563260db38f6945Stephen Hines if (!mExportVarCount) { 283569986da116ed602c752395f9563260db38f6945Stephen Hines return true; 284569986da116ed602c752395f9563260db38f6945Stephen Hines } 285569986da116ed602c752395f9563260db38f6945Stephen Hines 286569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpNameList = new const char *[mExportVarCount]; 287569986da116ed602c752395f9563260db38f6945Stephen Hines 288569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportVarCount; i++) { 289569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::MDNode *Name = VarNameMetadata->getOperand(i); 290569986da116ed602c752395f9563260db38f6945Stephen Hines if (Name != NULL && Name->getNumOperands() > 1) { 291569986da116ed602c752395f9563260db38f6945Stephen Hines TmpNameList[i] = createStringFromValue(Name->getOperand(0)); 292569986da116ed602c752395f9563260db38f6945Stephen Hines } 293569986da116ed602c752395f9563260db38f6945Stephen Hines } 294569986da116ed602c752395f9563260db38f6945Stephen Hines 295569986da116ed602c752395f9563260db38f6945Stephen Hines mExportVarNameList = TmpNameList; 296569986da116ed602c752395f9563260db38f6945Stephen Hines 297569986da116ed602c752395f9563260db38f6945Stephen Hines return true; 298569986da116ed602c752395f9563260db38f6945Stephen Hines} 299569986da116ed602c752395f9563260db38f6945Stephen Hines 300569986da116ed602c752395f9563260db38f6945Stephen Hines 301569986da116ed602c752395f9563260db38f6945Stephen Hinesbool MetadataExtractor::populateFuncNameMetadata( 302569986da116ed602c752395f9563260db38f6945Stephen Hines const llvm::NamedMDNode *FuncNameMetadata) { 303569986da116ed602c752395f9563260db38f6945Stephen Hines if (!FuncNameMetadata) { 304569986da116ed602c752395f9563260db38f6945Stephen Hines return true; 305569986da116ed602c752395f9563260db38f6945Stephen Hines } 306569986da116ed602c752395f9563260db38f6945Stephen Hines 307569986da116ed602c752395f9563260db38f6945Stephen Hines mExportFuncCount = FuncNameMetadata->getNumOperands(); 308569986da116ed602c752395f9563260db38f6945Stephen Hines if (!mExportFuncCount) { 309569986da116ed602c752395f9563260db38f6945Stephen Hines return true; 310569986da116ed602c752395f9563260db38f6945Stephen Hines } 311569986da116ed602c752395f9563260db38f6945Stephen Hines 312569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpNameList = new const char*[mExportFuncCount]; 313569986da116ed602c752395f9563260db38f6945Stephen Hines 314569986da116ed602c752395f9563260db38f6945Stephen Hines for (size_t i = 0; i < mExportFuncCount; i++) { 315569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::MDNode *Name = FuncNameMetadata->getOperand(i); 316569986da116ed602c752395f9563260db38f6945Stephen Hines if (Name != NULL && Name->getNumOperands() == 1) { 317569986da116ed602c752395f9563260db38f6945Stephen Hines TmpNameList[i] = createStringFromValue(Name->getOperand(0)); 318569986da116ed602c752395f9563260db38f6945Stephen Hines } 319569986da116ed602c752395f9563260db38f6945Stephen Hines } 320569986da116ed602c752395f9563260db38f6945Stephen Hines 321569986da116ed602c752395f9563260db38f6945Stephen Hines mExportFuncNameList = TmpNameList; 322569986da116ed602c752395f9563260db38f6945Stephen Hines 323569986da116ed602c752395f9563260db38f6945Stephen Hines return true; 324569986da116ed602c752395f9563260db38f6945Stephen Hines} 325569986da116ed602c752395f9563260db38f6945Stephen Hines 326569986da116ed602c752395f9563260db38f6945Stephen Hines 32733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hinesbool MetadataExtractor::populateForEachMetadata( 328cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Names, 329cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *Signatures) { 330109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (!Names && !Signatures) { 3310231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // Handle legacy case for pre-ICS bitcode that doesn't contain a metadata 3320231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // section for ForEach. We generate a full signature for a "root" function 3330231bb069417690bb4f513b80a9c0238112744f7Stephen Hines // which means that we need to set the bottom 5 bits in the mask. 3340231bb069417690bb4f513b80a9c0238112744f7Stephen Hines mExportForEachSignatureCount = 1; 335cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines char **TmpNameList = new char*[mExportForEachSignatureCount]; 336cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines TmpNameList[0] = new char[5]; 337cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines strncpy(TmpNameList[0], "root", 5); 338cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 3390231bb069417690bb4f513b80a9c0238112744f7Stephen Hines uint32_t *TmpSigList = new uint32_t[mExportForEachSignatureCount]; 3400231bb069417690bb4f513b80a9c0238112744f7Stephen Hines TmpSigList[0] = 0x1f; 341569986da116ed602c752395f9563260db38f6945Stephen Hines 342cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines mExportForEachNameList = (const char**)TmpNameList; 3430231bb069417690bb4f513b80a9c0238112744f7Stephen Hines mExportForEachSignatureList = TmpSigList; 34433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 34533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 34633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 347109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Signatures) { 348109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount = Signatures->getNumOperands(); 349109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (!mExportForEachSignatureCount) { 350109be674a4ad2042f58f486042dded8c954e5300Stephen Hines return true; 351109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 352109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } else { 353109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount = 0; 354109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureList = NULL; 35533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 35633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 35733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 35833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines uint32_t *TmpSigList = new uint32_t[mExportForEachSignatureCount]; 359569986da116ed602c752395f9563260db38f6945Stephen Hines const char **TmpNameList = new const char*[mExportForEachSignatureCount]; 36033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 36133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 362cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines llvm::MDNode *SigNode = Signatures->getOperand(i); 36333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines if (SigNode != NULL && SigNode->getNumOperands() == 1) { 36433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines llvm::Value *SigVal = SigNode->getOperand(0); 36533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines if (SigVal->getValueID() == llvm::Value::MDStringVal) { 36633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines llvm::StringRef SigString = 36733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines static_cast<llvm::MDString*>(SigVal)->getString(); 36833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines uint32_t Signature = 0; 36933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines if (SigString.getAsInteger(10, Signature)) { 37010c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Non-integer signature value '%s'", SigString.str().c_str()); 37133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return false; 37233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 37333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines TmpSigList[i] = Signature; 37433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 37533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 37633f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 37733f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 378109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Names) { 379109be674a4ad2042f58f486042dded8c954e5300Stephen Hines for (size_t i = 0; i < mExportForEachSignatureCount; i++) { 380109be674a4ad2042f58f486042dded8c954e5300Stephen Hines llvm::MDNode *Name = Names->getOperand(i); 381109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (Name != NULL && Name->getNumOperands() == 1) { 382109be674a4ad2042f58f486042dded8c954e5300Stephen Hines TmpNameList[i] = createStringFromValue(Name->getOperand(0)); 383109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 384109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } 385109be674a4ad2042f58f486042dded8c954e5300Stephen Hines } else { 386109be674a4ad2042f58f486042dded8c954e5300Stephen Hines if (mExportForEachSignatureCount != 1) { 3873e4cac486bc5a48640c4e65596a0be1ad05192e1Stephen Hines ALOGE("mExportForEachSignatureCount = %zu, but should be 1", 388109be674a4ad2042f58f486042dded8c954e5300Stephen Hines mExportForEachSignatureCount); 389cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 390109be674a4ad2042f58f486042dded8c954e5300Stephen Hines char *RootName = new char[5]; 391109be674a4ad2042f58f486042dded8c954e5300Stephen Hines strncpy(RootName, "root", 5); 392109be674a4ad2042f58f486042dded8c954e5300Stephen Hines TmpNameList[0] = RootName; 393cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines } 394cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines 395569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachNameList = TmpNameList; 396569986da116ed602c752395f9563260db38f6945Stephen Hines mExportForEachSignatureList = TmpSigList; 397569986da116ed602c752395f9563260db38f6945Stephen Hines 39833f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return true; 39933f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines} 40033f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 40133f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 402932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool MetadataExtractor::extract() { 403569986da116ed602c752395f9563260db38f6945Stephen Hines if (!(mBitcode && mBitcodeSize) && !mModule) { 404569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Invalid/empty bitcode/module"); 405932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 406932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 407932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 408569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::OwningPtr<llvm::LLVMContext> mContext; 409569986da116ed602c752395f9563260db38f6945Stephen Hines 410569986da116ed602c752395f9563260db38f6945Stephen Hines if (!mModule) { 411569986da116ed602c752395f9563260db38f6945Stephen Hines mContext.reset(new llvm::LLVMContext()); 412569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::OwningPtr<llvm::MemoryBuffer> MEM( 413569986da116ed602c752395f9563260db38f6945Stephen Hines llvm::MemoryBuffer::getMemBuffer( 414e708ffe612f4566bea20334d2c9dac34db508e6eStephen Hines llvm::StringRef(mBitcode, mBitcodeSize), "", false)); 415569986da116ed602c752395f9563260db38f6945Stephen Hines std::string error; 416569986da116ed602c752395f9563260db38f6945Stephen Hines 417569986da116ed602c752395f9563260db38f6945Stephen Hines // Module ownership is handled by the context, so we don't need to free it. 418569986da116ed602c752395f9563260db38f6945Stephen Hines mModule = llvm::ParseBitcodeFile(MEM.get(), *mContext, &error); 419569986da116ed602c752395f9563260db38f6945Stephen Hines if (!mModule) { 420569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not parse bitcode file"); 421569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("%s", error.c_str()); 422569986da116ed602c752395f9563260db38f6945Stephen Hines return false; 423569986da116ed602c752395f9563260db38f6945Stephen Hines } 424932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 425932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 426932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ExportVarMetadata = 427569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportVarMetadataName); 428932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ExportFuncMetadata = 429569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportFuncMetadataName); 430cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines const llvm::NamedMDNode *ExportForEachNameMetadata = 431569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportForEachNameMetadataName); 43233f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines const llvm::NamedMDNode *ExportForEachMetadata = 433569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ExportForEachMetadataName); 434932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *PragmaMetadata = 435569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(PragmaMetadataName); 436932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const llvm::NamedMDNode *ObjectSlotMetadata = 437569986da116ed602c752395f9563260db38f6945Stephen Hines mModule->getNamedMetadata(ObjectSlotMetadataName); 438094881f513ab366f7ffd0b2c7778ab50281ca59eDaniel Malea 439932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 440569986da116ed602c752395f9563260db38f6945Stephen Hines if (!populateVarNameMetadata(ExportVarMetadata)) { 441569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not populate export variable metadata"); 442569986da116ed602c752395f9563260db38f6945Stephen Hines return false; 443932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 444932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 445569986da116ed602c752395f9563260db38f6945Stephen Hines if (!populateFuncNameMetadata(ExportFuncMetadata)) { 446569986da116ed602c752395f9563260db38f6945Stephen Hines ALOGE("Could not populate export function metadata"); 447569986da116ed602c752395f9563260db38f6945Stephen Hines return false; 448932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 449932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 450cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines if (!populateForEachMetadata(ExportForEachNameMetadata, 451cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines ExportForEachMetadata)) { 45210c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not populate ForEach signature metadata"); 45333f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines return false; 45433f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines } 45533f8fe2bfafe00ad2c74e4590ffdd0bcfc5eb31dStephen Hines 456932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines populatePragmaMetadata(PragmaMetadata); 457932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 458932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!populateObjectSlotMetadata(ObjectSlotMetadata)) { 45910c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not populate object slot metadata"); 460932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 461932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 462932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 463932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 464932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 465932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 466932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // namespace bcinfo 467932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 468