[go: nahoru, domu]

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