Codegen for CopyGroupingValues Example IR for (group by int_col, string_col): (mangled function names have been shortened) define void @CopyGroupingValues(%"class.impala::GroupingAggregator"* %this_ptr, %"class.impala::Tuple"* %intermediate_tuple, i8* %buffer) { entry: call void @_ZN6impala18GroupingAggregator30CopyGroupingValuesFixedLenSlot... (%"class.impala::GroupingAggregator"* %this_ptr, %"c
| 1297 | // ret void |
| 1298 | // } |
| 1299 | Status GroupingAggregatorConfig::CodegenCopyGroupingValues(LlvmCodeGen* codegen, |
| 1300 | llvm::Function** fn) { |
| 1301 | llvm::PointerType* this_ptr_type = codegen->GetStructPtrType<GroupingAggregator>(); |
| 1302 | llvm::PointerType* tuple_ptr_type = codegen->GetStructPtrType<Tuple>(); |
| 1303 | LlvmCodeGen::FnPrototype prototype(codegen, "CopyGroupingValues", |
| 1304 | codegen->void_type()); |
| 1305 | prototype.AddArgument(LlvmCodeGen::NamedVariable("this_ptr", this_ptr_type)); |
| 1306 | prototype.AddArgument( |
| 1307 | LlvmCodeGen::NamedVariable("intermediate_tuple", tuple_ptr_type)); |
| 1308 | prototype.AddArgument(LlvmCodeGen::NamedVariable("buffer", codegen->ptr_type())); |
| 1309 | |
| 1310 | llvm::LLVMContext& context = codegen->context(); |
| 1311 | LlvmBuilder builder(context); |
| 1312 | llvm::Value* args[3]; |
| 1313 | *fn = prototype.GeneratePrototype(&builder, args); |
| 1314 | |
| 1315 | llvm::Value* this_ptr = args[0]; |
| 1316 | llvm::Value* intermediate_tuple = args[1]; |
| 1317 | llvm::Value* buffer = args[2]; |
| 1318 | |
| 1319 | // Copy fixed len slots |
| 1320 | for (int i = 0; i < grouping_exprs_.size(); ++i) { |
| 1321 | // Get relevant data from slot desc as consts |
| 1322 | SlotDescriptor* slot_desc = intermediate_tuple_desc_->slots()[i]; |
| 1323 | llvm::Value* idx = codegen->GetI32Constant(i); |
| 1324 | llvm::Value* tuple_offset = codegen->GetI32Constant(slot_desc->tuple_offset()); |
| 1325 | llvm::Value* slot_size = codegen->GetI32Constant(slot_desc->slot_size()); |
| 1326 | |
| 1327 | llvm::Value* null_indicator_offset = |
| 1328 | slot_desc->null_indicator_offset().ToIRPacked(codegen); |
| 1329 | |
| 1330 | // call CopyGroupingValuesFixedLenSlot |
| 1331 | codegen->CodegenCallFunction(&builder, |
| 1332 | IRFunction::GROUPING_AGG_COPY_GROUPING_VALUES_FIXED_LEN_SLOT, |
| 1333 | {this_ptr, intermediate_tuple, idx, null_indicator_offset, tuple_offset, |
| 1334 | slot_size}); |
| 1335 | } |
| 1336 | |
| 1337 | // Copy var len string data |
| 1338 | for (int expr_idx : string_grouping_exprs_) { |
| 1339 | // Get relevant data from slot desc as consts |
| 1340 | SlotDescriptor* slot_desc = intermediate_tuple_desc_->slots()[expr_idx]; |
| 1341 | llvm::Value* tuple_offset = codegen->GetI32Constant(slot_desc->tuple_offset()); |
| 1342 | llvm::Value* idx = codegen->GetI32Constant(expr_idx); |
| 1343 | |
| 1344 | // call CopyGroupingValuesStringSlot |
| 1345 | llvm::Value* bytes_copied = codegen->CodegenCallFunction(&builder, |
| 1346 | IRFunction::GROUPING_AGG_COPY_GROUPING_VALUES_STRING_SLOT, |
| 1347 | {this_ptr, intermediate_tuple, idx, tuple_offset, buffer}, "bytes_copied"); |
| 1348 | |
| 1349 | // increase buffer by bytes copied |
| 1350 | buffer = builder.CreateGEP(buffer, bytes_copied, "buffer"); |
| 1351 | } |
| 1352 | |
| 1353 | builder.CreateRetVoid(); |
| 1354 | |
| 1355 | *fn = codegen->FinalizeFunction(*fn); |
| 1356 | if (*fn == nullptr) { |
nothing calls this directly
no test coverage detected