CGOpenCLRuntime.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //===----- CGOpenCLRuntime.cpp - Interface to OpenCL Runtimes -------------===//
  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. //
  10. // This provides an abstract class for OpenCL code generation. Concrete
  11. // subclasses of this implement code generation for specific OpenCL
  12. // runtime libraries.
  13. //
  14. //===----------------------------------------------------------------------===//
  15. #include "CGOpenCLRuntime.h"
  16. #include "CodeGenFunction.h"
  17. #include "llvm/IR/DerivedTypes.h"
  18. #include "llvm/IR/GlobalValue.h"
  19. #include <assert.h>
  20. using namespace clang;
  21. using namespace CodeGen;
  22. CGOpenCLRuntime::~CGOpenCLRuntime() {}
  23. void CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF,
  24. const VarDecl &D) {
  25. return CGF.EmitStaticVarDecl(D, llvm::GlobalValue::InternalLinkage);
  26. }
  27. llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) {
  28. assert(T->isOpenCLSpecificType() &&
  29. "Not an OpenCL specific type!");
  30. llvm::LLVMContext& Ctx = CGM.getLLVMContext();
  31. uint32_t ImgAddrSpc =
  32. CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
  33. switch (cast<BuiltinType>(T)->getKind()) {
  34. default:
  35. llvm_unreachable("Unexpected opencl builtin type!");
  36. return nullptr;
  37. case BuiltinType::OCLImage1d:
  38. return llvm::PointerType::get(llvm::StructType::create(
  39. Ctx, "opencl.image1d_t"), ImgAddrSpc);
  40. case BuiltinType::OCLImage1dArray:
  41. return llvm::PointerType::get(llvm::StructType::create(
  42. Ctx, "opencl.image1d_array_t"), ImgAddrSpc);
  43. case BuiltinType::OCLImage1dBuffer:
  44. return llvm::PointerType::get(llvm::StructType::create(
  45. Ctx, "opencl.image1d_buffer_t"), ImgAddrSpc);
  46. case BuiltinType::OCLImage2d:
  47. return llvm::PointerType::get(llvm::StructType::create(
  48. Ctx, "opencl.image2d_t"), ImgAddrSpc);
  49. case BuiltinType::OCLImage2dArray:
  50. return llvm::PointerType::get(llvm::StructType::create(
  51. Ctx, "opencl.image2d_array_t"), ImgAddrSpc);
  52. case BuiltinType::OCLImage2dDepth:
  53. return llvm::PointerType::get(
  54. llvm::StructType::create(Ctx, "opencl.image2d_depth_t"), ImgAddrSpc);
  55. case BuiltinType::OCLImage2dArrayDepth:
  56. return llvm::PointerType::get(
  57. llvm::StructType::create(Ctx, "opencl.image2d_array_depth_t"),
  58. ImgAddrSpc);
  59. case BuiltinType::OCLImage2dMSAA:
  60. return llvm::PointerType::get(
  61. llvm::StructType::create(Ctx, "opencl.image2d_msaa_t"), ImgAddrSpc);
  62. case BuiltinType::OCLImage2dArrayMSAA:
  63. return llvm::PointerType::get(
  64. llvm::StructType::create(Ctx, "opencl.image2d_array_msaa_t"),
  65. ImgAddrSpc);
  66. case BuiltinType::OCLImage2dMSAADepth:
  67. return llvm::PointerType::get(
  68. llvm::StructType::create(Ctx, "opencl.image2d_msaa_depth_t"),
  69. ImgAddrSpc);
  70. case BuiltinType::OCLImage2dArrayMSAADepth:
  71. return llvm::PointerType::get(
  72. llvm::StructType::create(Ctx, "opencl.image2d_array_msaa_depth_t"),
  73. ImgAddrSpc);
  74. case BuiltinType::OCLImage3d:
  75. return llvm::PointerType::get(llvm::StructType::create(
  76. Ctx, "opencl.image3d_t"), ImgAddrSpc);
  77. case BuiltinType::OCLSampler:
  78. return llvm::IntegerType::get(Ctx, 32);
  79. case BuiltinType::OCLEvent:
  80. return llvm::PointerType::get(llvm::StructType::create(
  81. Ctx, "opencl.event_t"), 0);
  82. case BuiltinType::OCLClkEvent:
  83. return llvm::PointerType::get(
  84. llvm::StructType::create(Ctx, "opencl.clk_event_t"), 0);
  85. case BuiltinType::OCLQueue:
  86. return llvm::PointerType::get(
  87. llvm::StructType::create(Ctx, "opencl.queue_t"), 0);
  88. case BuiltinType::OCLNDRange:
  89. return llvm::PointerType::get(
  90. llvm::StructType::create(Ctx, "opencl.ndrange_t"), 0);
  91. case BuiltinType::OCLReserveID:
  92. return llvm::PointerType::get(
  93. llvm::StructType::create(Ctx, "opencl.reserve_id_t"), 0);
  94. }
  95. }
  96. llvm::Type *CGOpenCLRuntime::getPipeType() {
  97. if (!PipeTy){
  98. uint32_t PipeAddrSpc =
  99. CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
  100. PipeTy = llvm::PointerType::get(llvm::StructType::create(
  101. CGM.getLLVMContext(), "opencl.pipe_t"), PipeAddrSpc);
  102. }
  103. return PipeTy;
  104. }