Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9028f68

Browse files
authored
Merge pull request #1769 from certik/uint2
Add unsigned integer support to C backend
2 parents 40e7778 + e14cc37 commit 9028f68

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

integration_tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ RUN(NAME const_03 LABELS cpython llvm c
311311
EXTRAFILES const_03b.c)
312312
RUN(NAME const_04 LABELS cpython llvm c)
313313
RUN(NAME expr_01 LABELS cpython llvm c wasm wasm_x64)
314-
RUN(NAME expr_01u LABELS cpython llvm)
314+
RUN(NAME expr_01u LABELS cpython llvm c)
315315
RUN(NAME expr_02 LABELS cpython llvm c wasm wasm_x64)
316316
RUN(NAME expr_03 LABELS cpython llvm c wasm wasm_x64)
317317
RUN(NAME expr_04 LABELS cpython llvm c wasm)

src/libasr/codegen/asr_to_c.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,44 @@ class ASRToCVisitor : public BaseCCPPVisitor<ASRToCVisitor>
316316
dims = convert_dims_c(t->n_dims, t->m_dims, v_m_type, is_fixed_size);
317317
sub = format_type_c(dims, type_name, v_m_name, use_ref, dummy);
318318
}
319+
} else if (ASRUtils::is_unsigned_integer(*v_m_type)) {
320+
headers.insert("inttypes.h");
321+
ASR::UnsignedInteger_t *t = ASR::down_cast<ASR::UnsignedInteger_t>(v_m_type);
322+
std::string type_name = "uint" + std::to_string(t->m_kind * 8) + "_t";
323+
if( is_array ) {
324+
bool is_fixed_size = true;
325+
dims = convert_dims_c(t->n_dims, t->m_dims, v_m_type, is_fixed_size, true);
326+
bool is_struct_type_member = ASR::is_a<ASR::StructType_t>(
327+
*ASR::down_cast<ASR::symbol_t>(v.m_parent_symtab->asr_owner));
328+
if( is_fixed_size && is_struct_type_member ) {
329+
if( !force_declare ) {
330+
force_declare_name = std::string(v.m_name);
331+
}
332+
sub = type_name + " " + force_declare_name + dims;
333+
} else {
334+
std::string encoded_type_name = "u" + std::to_string(t->m_kind * 8);
335+
if( !force_declare ) {
336+
force_declare_name = std::string(v.m_name);
337+
}
338+
generate_array_decl(sub, force_declare_name, type_name, dims,
339+
encoded_type_name, t->m_dims, t->n_dims,
340+
use_ref, dummy,
341+
(v.m_intent != ASRUtils::intent_in &&
342+
v.m_intent != ASRUtils::intent_inout &&
343+
v.m_intent != ASRUtils::intent_out &&
344+
!is_struct_type_member) || force_declare,
345+
is_fixed_size, false, v.m_abi);
346+
}
347+
} else {
348+
bool is_fixed_size = true;
349+
std::string v_m_name = v.m_name;
350+
if( declare_as_constant ) {
351+
type_name = "const " + type_name;
352+
v_m_name = const_name;
353+
}
354+
dims = convert_dims_c(t->n_dims, t->m_dims, v_m_type, is_fixed_size);
355+
sub = format_type_c(dims, type_name, v_m_name, use_ref, dummy);
356+
}
319357
} else if (ASRUtils::is_real(*v_m_type)) {
320358
ASR::Real_t *t = ASR::down_cast<ASR::Real_t>(v_m_type);
321359
std::string type_name = "float";

src/libasr/codegen/asr_to_c_cpp.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,14 @@ R"(#include <stdio.h>
394394
case (4) : sub = "int32_t "; break;
395395
case (8) : sub = "int64_t "; break;
396396
}
397+
} else if (ASRUtils::is_unsigned_integer(*return_var->m_type)) {
398+
int kind = ASR::down_cast<ASR::UnsignedInteger_t>(return_var->m_type)->m_kind;
399+
switch (kind) {
400+
case (1) : sub = "uint8_t "; break;
401+
case (2) : sub = "uint16_t "; break;
402+
case (4) : sub = "uint32_t "; break;
403+
case (8) : sub = "uint64_t "; break;
404+
}
397405
} else if (ASRUtils::is_real(*return_var->m_type)) {
398406
bool is_float = ASR::down_cast<ASR::Real_t>(return_var->m_type)->m_kind == 4;
399407
if (is_float) {
@@ -1382,6 +1390,12 @@ R"(#include <stdio.h>
13821390
// src = src;
13831391
break;
13841392
}
1393+
case (ASR::cast_kindType::IntegerToUnsignedInteger) : {
1394+
int dest_kind = ASRUtils::extract_kind_from_ttype_t(x.m_type);
1395+
src = "(uint" + std::to_string(dest_kind * 8) + "_t)(" + src + ")";
1396+
last_expr_precedence = 2;
1397+
break;
1398+
}
13851399
case (ASR::cast_kindType::ComplexToComplex) : {
13861400
break;
13871401
}
@@ -1522,6 +1536,10 @@ R"(#include <stdio.h>
15221536
handle_Compare(x);
15231537
}
15241538

1539+
void visit_UnsignedIntegerCompare(const ASR::UnsignedIntegerCompare_t &x) {
1540+
handle_Compare(x);
1541+
}
1542+
15251543
void visit_RealCompare(const ASR::RealCompare_t &x) {
15261544
handle_Compare(x);
15271545
}
@@ -1672,6 +1690,10 @@ R"(#include <stdio.h>
16721690
handle_BinOp(x);
16731691
}
16741692

1693+
void visit_UnsignedIntegerBinOp(const ASR::UnsignedIntegerBinOp_t &x) {
1694+
handle_BinOp(x);
1695+
}
1696+
16751697
void visit_RealBinOp(const ASR::RealBinOp_t &x) {
16761698
handle_BinOp(x);
16771699
}

0 commit comments

Comments
 (0)