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