Skip to content

Commit 426a29c

Browse files
authored
Added debug capabilities for lists and sets (#2733)
* Added debug capabilities for lists * Update tests * Update references * Add debug capabilities to sets
1 parent 44f9d26 commit 426a29c

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3571,6 +3571,62 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
35713571
line = v->base.base.loc.first;
35723572
column = 0;
35733573
}
3574+
3575+
if (ASR::is_a<ASR::List_t>(*v->m_type)) {
3576+
std::string member_type_name;
3577+
uint32_t member_type_size, member_type_encoding;
3578+
3579+
llvm::DIType *int_type = DBuilder->createBasicType("integer", 32, llvm::dwarf::DW_ATE_signed);
3580+
ASR::ttype_t *asr_member_type = ASRUtils::get_contained_type(v->m_type);
3581+
3582+
get_type_debug_info(asr_member_type, member_type_name,
3583+
member_type_size, member_type_encoding);
3584+
llvm::DIType *member_type = DBuilder->createBasicType(member_type_name, member_type_size, member_type_encoding);
3585+
3586+
llvm::DIType *member_pointer_type = DBuilder->createPointerType(member_type, 64, 0, 0, member_type_name+"*");
3587+
llvm::DIType *list_type = DBuilder->createStructType(
3588+
debug_current_scope, "list", debug_Unit, line, 64+member_type_size, 0, llvm::DINode::FlagZero, nullptr, DBuilder->getOrCreateArray({
3589+
DBuilder->createMemberType(debug_Unit, "i32", debug_Unit, line, 32, 0, 0, llvm::DINode::FlagZero, int_type),
3590+
DBuilder->createMemberType(debug_Unit, "i32", debug_Unit, line, 32, 32, 0, llvm::DINode::FlagZero, int_type),
3591+
DBuilder->createMemberType(debug_Unit, "member", debug_Unit, line, 64, 64, 0, llvm::DINode::FlagZero, member_pointer_type)
3592+
}));
3593+
llvm::DILocalVariable *debug_var = DBuilder->createParameterVariable(debug_current_scope,
3594+
v->m_name, ++debug_arg_count, debug_Unit, line, list_type, true);
3595+
DBuilder->insertDeclare(ptr, debug_var, DBuilder->createExpression(),
3596+
llvm::DILocation::get(debug_current_scope->getContext(),
3597+
line, 0, debug_current_scope), builder->GetInsertBlock());
3598+
} else if (ASR::is_a<ASR::Set_t>(*v->m_type)) {
3599+
std::string member_type_name;
3600+
uint32_t member_type_size, member_type_encoding;
3601+
3602+
llvm::DIType *int_type = DBuilder->createBasicType("integer", 32, llvm::dwarf::DW_ATE_signed);
3603+
llvm::DIType *int_8_ptr_type = DBuilder->createPointerType(
3604+
DBuilder->createBasicType("char", 8, llvm::dwarf::DW_ATE_unsigned_char), 64, 0, 0, "i8*");
3605+
ASR::ttype_t *asr_member_type = ASRUtils::get_contained_type(v->m_type);
3606+
3607+
get_type_debug_info(asr_member_type, member_type_name,
3608+
member_type_size, member_type_encoding);
3609+
llvm::DIType *member_type = DBuilder->createBasicType(member_type_name, member_type_size, member_type_encoding);
3610+
3611+
llvm::DIType *member_pointer_type = DBuilder->createPointerType(member_type, 64, 0, 0, member_type_name+"*");
3612+
llvm::DIType *list_type = DBuilder->createStructType(
3613+
debug_current_scope, "list", debug_Unit, line, 64+member_type_size, 0, llvm::DINode::FlagZero, nullptr, DBuilder->getOrCreateArray({
3614+
DBuilder->createMemberType(debug_Unit, "i32", debug_Unit, line, 32, 0, 0, llvm::DINode::FlagZero, int_type),
3615+
DBuilder->createMemberType(debug_Unit, "i32", debug_Unit, line, 32, 32, 0, llvm::DINode::FlagZero, int_type),
3616+
DBuilder->createMemberType(debug_Unit, "member", debug_Unit, line, 64, 64, 0, llvm::DINode::FlagZero, member_pointer_type)
3617+
}));
3618+
llvm::DIType *set_type = DBuilder->createStructType(
3619+
debug_current_scope, "list", debug_Unit, line, 64+member_type_size+32+64, 0, llvm::DINode::FlagZero, nullptr, DBuilder->getOrCreateArray({
3620+
DBuilder->createMemberType(debug_Unit, "i32", debug_Unit, line, 32, 0, 0, llvm::DINode::FlagZero, int_type),
3621+
DBuilder->createMemberType(debug_Unit, "list", debug_Unit, line, 128, 32, 0, llvm::DINode::FlagZero, list_type),
3622+
DBuilder->createMemberType(debug_Unit, "i8*", debug_Unit, line, 64, 160, 0, llvm::DINode::FlagZero, int_8_ptr_type)}));
3623+
llvm::DILocalVariable *debug_var = DBuilder->createParameterVariable(debug_current_scope,
3624+
v->m_name, ++debug_arg_count, debug_Unit, line, set_type, true);
3625+
DBuilder->insertDeclare(ptr, debug_var, DBuilder->createExpression(),
3626+
llvm::DILocation::get(debug_current_scope->getContext(),
3627+
line, 0, debug_current_scope), builder->GetInsertBlock());
3628+
} else {
3629+
35743630
std::string type_name;
35753631
uint32_t type_size, type_encoding;
35763632
get_type_debug_info(v->m_type, type_name, type_size,
@@ -3581,6 +3637,7 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
35813637
DBuilder->insertDeclare(ptr, debug_var, DBuilder->createExpression(),
35823638
llvm::DILocation::get(debug_current_scope->getContext(),
35833639
line, 0, debug_current_scope), builder->GetInsertBlock());
3640+
}
35843641
}
35853642

35863643
if( ASR::is_a<ASR::StructType_t>(*v->m_type) ) {

0 commit comments

Comments
 (0)