21 namespace spatial_type {
27 :
Codegen(geo_operator, catalog) {
33 size_t size() const final {
return 1; }
39 const std::vector<llvm::Value*>& arg_lvs,
40 const std::vector<llvm::Value*>& pos_lvs,
44 if (arg_lvs.size() == size_t(1)) {
48 const auto& geo_ti = operand->get_type_info();
51 std::vector<llvm::Value*> array_operand_lvs;
52 array_operand_lvs.push_back(
53 cgen_state->emitExternalCall(
"array_buff",
54 llvm::Type::getInt8PtrTy(cgen_state->context_),
55 {arg_lvs.front(), pos_lvs.front()}));
56 const bool is_nullable = !geo_ti.get_notnull();
57 std::string size_fn_name =
"array_size";
59 size_fn_name +=
"_nullable";
62 std::vector<llvm::Value*> array_sz_args{
63 arg_lvs.front(), pos_lvs.front(), cgen_state->llInt(
log2_bytes(elem_sz))};
65 array_sz_args.push_back(
66 cgen_state->llInt(static_cast<int32_t>(inline_int_null_value<int32_t>())));
68 array_operand_lvs.push_back(cgen_state->emitExternalCall(
69 size_fn_name,
get_int_type(32, cgen_state->context_), array_sz_args));
70 return std::make_tuple(array_operand_lvs,
nullptr);
73 return std::make_tuple(arg_lvs,
nullptr);
76 std::vector<llvm::Value*>
codegen(
const std::vector<llvm::Value*>&
args,
81 const auto& geo_ti = getOperand(0)->get_type_info();
82 CHECK(geo_ti.is_geometry());
84 auto& builder = cgen_state->ir_builder_;
85 llvm::Value* array_buff_cast{
nullptr};
86 int32_t elem_size_bytes = 0;
88 array_buff_cast = builder.CreateBitCast(
89 args.front(), llvm::Type::getInt32PtrTy(cgen_state->context_));
92 array_buff_cast = builder.CreateBitCast(
93 args.front(), llvm::Type::getDoublePtrTy(cgen_state->context_));
97 const bool is_end_point = getName() ==
"ST_EndPoint";
98 const auto num_elements_lv =
99 builder.CreateSDiv(
args.back(), cgen_state->llInt(elem_size_bytes));
100 const auto index_lv =
101 is_end_point ? builder.CreateSub(num_elements_lv, cgen_state->llInt(int32_t(2)))
102 : cgen_state->llInt(int32_t(0));
103 auto array_offset_lv = builder.CreateGEP(
104 array_buff_cast->getType()->getScalarType()->getPointerElementType(),
107 operator_->getName() +
"_Offset");
108 return {array_offset_lv,
args.back()};
class for a per-database catalog. also includes metadata for the current database and the current use...
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
std::vector< llvm::Value * > codegen(const std::vector< llvm::Value * > &args, CodeGenerator::NullCheckCodegen *nullcheck_codegen, CgenState *cgen_state, const CompilationOptions &co) final
std::tuple< std::vector< llvm::Value * >, llvm::Value * > codegenLoads(const std::vector< llvm::Value * > &arg_lvs, const std::vector< llvm::Value * > &pos_lvs, CgenState *cgen_state) final
size_t size() const final
const Analyzer::GeoOperator * operator_
virtual const Analyzer::Expr * getOperand(const size_t index)
uint32_t log2_bytes(const uint32_t bytes)
StartEndPoint(const Analyzer::GeoOperator *geo_operator, const Catalog_Namespace::Catalog *catalog)
SQLTypeInfo getNullType() const final