Skip to content

Commit be793bc

Browse files
committed
Implement GetPointer and PointerToCPtr nodes
1 parent 63f2677 commit be793bc

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/libasr/codegen/asr_to_c.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
114114
ASR::Derived_t *t = ASR::down_cast<ASR::Derived_t>(v.m_type);
115115
std::string dims = convert_dims_c(t->n_dims, t->m_dims);
116116
sub = format_type_c(dims, "struct", v.m_name, use_ref, dummy);
117+
} else if (ASR::is_a<ASR::CPtr_t>(*v.m_type)) {
118+
sub = format_type_c("", "void*", v.m_name, false, false);
117119
} else {
118120
diag.codegen_error_label("Type number '"
119121
+ std::to_string(v.m_type->type)
@@ -333,6 +335,12 @@ R"(
333335
case ASR::ttypeType::Character: {
334336
return "%s";
335337
}
338+
case ASR::ttypeType::CPtr: {
339+
return "%p";
340+
}
341+
case ASR::ttypeType::Pointer: {
342+
return "%p";
343+
}
336344
default : throw LFortranException("Not implemented");
337345
}
338346
}

src/libasr/codegen/asr_to_c_cpp.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,42 @@ R"(#include <stdio.h>
685685
}
686686
}
687687

688+
std::string get_c_type_from_ttype_t(ASR::ttype_t* t) {
689+
std::string type_src = "";
690+
switch( t->type ) {
691+
case ASR::ttypeType::Integer: {
692+
type_src = "int";
693+
break;
694+
}
695+
case ASR::ttypeType::Pointer: {
696+
ASR::Pointer_t* ptr_type = ASR::down_cast<ASR::Pointer_t>(t);
697+
type_src = get_c_type_from_ttype_t(ptr_type->m_type) + "*";
698+
break;
699+
}
700+
case ASR::ttypeType::CPtr: {
701+
type_src = "void*";
702+
break;
703+
}
704+
default: {
705+
throw CodeGenError("Type " + ASRUtils::type_to_str_python(t) + " not supported yet.");
706+
}
707+
}
708+
return type_src;
709+
}
710+
711+
void visit_GetPointer(const ASR::GetPointer_t& x) {
712+
self().visit_expr(*x.m_arg);
713+
std::string arg_src = std::move(src);
714+
src = "&" + arg_src;
715+
}
716+
717+
void visit_PointerToCPtr(const ASR::PointerToCPtr_t& x) {
718+
self().visit_expr(*x.m_arg);
719+
std::string arg_src = std::move(src);
720+
std::string type_src = get_c_type_from_ttype_t(x.m_type);
721+
src = "(" + type_src + ") " + arg_src;
722+
}
723+
688724
void visit_BinOp(const ASR::BinOp_t &x) {
689725
self().visit_expr(*x.m_left);
690726
std::string left = std::move(src);

0 commit comments

Comments
 (0)