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