1eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni/*
2eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * Copyright 2017, The Android Open Source Project
3eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni *
4eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * Licensed under the Apache License, Version 2.0 (the "License");
5eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * you may not use this file except in compliance with the License.
6eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * You may obtain a copy of the License at
7eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni *
8eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni *     http://www.apache.org/licenses/LICENSE-2.0
9eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni *
10eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * Unless required by applicable law or agreed to in writing, software
11eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * distributed under the License is distributed on an "AS IS" BASIS,
12eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * See the License for the specific language governing permissions and
14eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni * limitations under the License.
15eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni */
16eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
17eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni#include "Context.h"
18eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
19eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni#include "llvm/ADT/Triple.h"
20eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni#include "llvm/IR/Module.h"
21eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni#include "llvm/Support/raw_ostream.h"
22eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
23eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ninamespace rs2spirv {
24eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
25eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang NiContext &Context::getInstance() {
26eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  static Context c;
27eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  return c;
28eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni}
29eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
30bbf0b0eac5b1aa65ded878d80a0adc83e48527c8I-Jui (Ray) SungContext::Context() : mInitialized(false) {}
31eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
32bbf0b0eac5b1aa65ded878d80a0adc83e48527c8I-Jui (Ray) Sungbool Context::Initialize(std::unique_ptr<bcinfo::MetadataExtractor> ME) {
33eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  if (mInitialized) {
34eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    return true;
35eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  }
36eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
37bbf0b0eac5b1aa65ded878d80a0adc83e48527c8I-Jui (Ray) Sung  mMetadata = std::move(ME);
38eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
39eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  if (!mMetadata->extract()) {
40eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    llvm::errs() << "cannot extract metadata\n";
41bbf0b0eac5b1aa65ded878d80a0adc83e48527c8I-Jui (Ray) Sung    return false;
42eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  }
43eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
44eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  const char **varNames = mMetadata->getExportVarNameList();
45eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  size_t varCount = mMetadata->getExportVarCount();
46eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  mExportVarIndices.resize(varCount);
47eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
48eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  // Builds the lookup table from a variable name to its slot number
49eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  for (size_t slot = 0; slot < varCount; slot++) {
50eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    std::string varName(varNames[slot]);
51eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    mVarNameToSlot.insert(std::make_pair(varName, (uint32_t)slot));
52eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  }
53eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
54eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  const size_t kernelCount = mMetadata->getExportForEachSignatureCount();
55eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  const char **kernelNames = mMetadata->getExportForEachNameList();
56eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  for (size_t slot = 0; slot < kernelCount; slot++) {
57eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni    mForEachNameToSlot.insert(std::make_pair(kernelNames[slot], slot));
58eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  }
59eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
60eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  mInitialized = true;
61eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
62eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni  return true;
63eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni}
64eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni
65eb6548743c40f4129ca55a58ff2d5254f22e95e1Yang Ni} // namespace rs2spirv
66