SPIRVContext.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //===--- SPIRVContext.cpp - SPIR-V SPIRVContext implementation-------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include <tuple>
  10. #include "clang/SPIRV/SPIRVContext.h"
  11. namespace clang {
  12. namespace spirv {
  13. uint32_t SPIRVContext::getResultIdForType(const Type *t, bool *isRegistered) {
  14. assert(t != nullptr);
  15. uint32_t result_id = 0;
  16. auto iter = typeResultIdMap.find(t);
  17. if (iter == typeResultIdMap.end()) {
  18. // The Type has not been defined yet. Reserve an ID for it.
  19. result_id = takeNextId();
  20. typeResultIdMap[t] = result_id;
  21. if (isRegistered)
  22. *isRegistered = false;
  23. } else {
  24. result_id = iter->second;
  25. if (isRegistered)
  26. *isRegistered = true;
  27. }
  28. assert(result_id != 0);
  29. return result_id;
  30. }
  31. uint32_t SPIRVContext::getResultIdForConstant(const Constant *c) {
  32. assert(c != nullptr);
  33. uint32_t result_id = 0;
  34. auto iter = constantResultIdMap.find(c);
  35. if (iter == constantResultIdMap.end()) {
  36. // The constant has not been defined yet. Reserve an ID for it.
  37. result_id = takeNextId();
  38. constantResultIdMap[c] = result_id;
  39. } else {
  40. result_id = iter->second;
  41. }
  42. assert(result_id != 0);
  43. return result_id;
  44. }
  45. const Type *SPIRVContext::registerType(const Type &t) {
  46. // Insert function will only insert if it doesn't already exist in the set.
  47. TypeSet::iterator it;
  48. std::tie(it, std::ignore) = existingTypes.insert(t);
  49. return &*it;
  50. }
  51. const Constant *SPIRVContext::registerConstant(const Constant &c) {
  52. // Insert function will only insert if it doesn't already exist in the set.
  53. ConstantSet::iterator it;
  54. std::tie(it, std::ignore) = existingConstants.insert(c);
  55. return &*it;
  56. }
  57. const Decoration *SPIRVContext::registerDecoration(const Decoration &d) {
  58. // Insert function will only insert if it doesn't already exist in the set.
  59. DecorationSet::iterator it;
  60. std::tie(it, std::ignore) = existingDecorations.insert(d);
  61. return &*it;
  62. }
  63. } // end namespace spirv
  64. } // end namespace clang