123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- //===--- SPIRVContext.cpp - SPIR-V SPIRVContext implementation-------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- #include <tuple>
- #include "clang/SPIRV/SPIRVContext.h"
- #include "llvm/llvm_assert/assert.h"
- namespace clang {
- namespace spirv {
- uint32_t SPIRVContext::getResultIdForType(const Type *t, bool *isRegistered) {
- assert(t != nullptr);
- uint32_t result_id = 0;
- auto iter = typeResultIdMap.find(t);
- if (iter == typeResultIdMap.end()) {
- // The Type has not been defined yet. Reserve an ID for it.
- result_id = takeNextId();
- typeResultIdMap[t] = result_id;
- if (isRegistered)
- *isRegistered = false;
- } else {
- result_id = iter->second;
- if (isRegistered)
- *isRegistered = true;
- }
- assert(result_id != 0);
- return result_id;
- }
- uint32_t SPIRVContext::getResultIdForConstant(const Constant *c) {
- assert(c != nullptr);
- uint32_t result_id = 0;
- auto iter = constantResultIdMap.find(c);
- if (iter == constantResultIdMap.end()) {
- // The constant has not been defined yet. Reserve an ID for it.
- result_id = takeNextId();
- constantResultIdMap[c] = result_id;
- } else {
- result_id = iter->second;
- }
- assert(result_id != 0);
- return result_id;
- }
- const Type *SPIRVContext::registerType(const Type &t) {
- // Insert function will only insert if it doesn't already exist in the set.
- TypeSet::iterator it;
- std::tie(it, std::ignore) = existingTypes.insert(t);
- return &*it;
- }
- const Constant *SPIRVContext::registerConstant(const Constant &c) {
- // Insert function will only insert if it doesn't already exist in the set.
- ConstantSet::iterator it;
- std::tie(it, std::ignore) = existingConstants.insert(c);
- return &*it;
- }
- const Decoration *SPIRVContext::registerDecoration(const Decoration &d) {
- // Insert function will only insert if it doesn't already exist in the set.
- DecorationSet::iterator it;
- std::tie(it, std::ignore) = existingDecorations.insert(d);
- return &*it;
- }
- } // end namespace spirv
- } // end namespace clang
|