diff options
| author | gingerBill <bill@gingerbill.org> | 2018-08-14 17:07:56 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-08-14 17:07:56 +0100 |
| commit | acc010cba5df63b38704245254e721187335a7b2 (patch) | |
| tree | 2b92d291e6c3804f6e5cc177c5ed0443798d1f8d /src/ir_print.cpp | |
| parent | 89f4e7a8dbed4272f85f10568a542697aa3b38f8 (diff) | |
Add `bit_set` type
Diffstat (limited to 'src/ir_print.cpp')
| -rw-r--r-- | src/ir_print.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/ir_print.cpp b/src/ir_print.cpp index 46d351c8f..eded9d8dc 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -65,6 +65,10 @@ void ir_write_i64(irFileBuffer *f, i64 i) { String str = i64_to_string(i, f->buf, IR_FILE_BUFFER_BUF_LEN-1); ir_write_string(f, str); } +void ir_write_u64(irFileBuffer *f, u64 i) { + String str = u64_to_string(i, f->buf, IR_FILE_BUFFER_BUF_LEN-1); + ir_write_string(f, str); +} void ir_write_big_int(irFileBuffer *f, BigInt const &x) { i64 i = 0; if (x.neg) { @@ -502,6 +506,19 @@ void ir_print_type(irFileBuffer *f, irModule *m, Type *t, bool in_struct) { ir_fprintf(f, "{[0 x <%lld x i8>], [%lld x i8]}", align, size); break; } + + case Type_BitSet: { + i64 align = type_align_of(t); + i64 size = type_size_of(t); + switch (size) { + case 0: ir_write_str_lit(f, "{}"); return; + case 1: ir_write_str_lit(f, "i8"); return; + case 2: ir_write_str_lit(f, "i16"); return; + case 4: ir_write_str_lit(f, "i32"); return; + case 8: ir_write_str_lit(f, "i64"); return; + default: GB_PANIC("Unknown bit_set size"); break; + } + } } } @@ -766,6 +783,34 @@ void ir_print_exact_value(irFileBuffer *f, irModule *m, ExactValue value, Type * ir_write_byte(f, '}'); if (type->Struct.is_packed) ir_write_byte(f, '>'); + } else if (is_type_bit_set(type)) { + ast_node(cl, CompoundLit, value.value_compound); + if (cl->elems.count == 0) { + ir_write_str_lit(f, "zeroinitializer"); + break; + } + + i64 sz = type_size_of(type); + if (sz == 0) { + ir_write_str_lit(f, "zeroinitializer"); + break; + } + + u64 bits = 0; + for_array(i, cl->elems) { + Ast *e = cl->elems[i]; + GB_ASSERT(e->kind != Ast_FieldValue); + + TypeAndValue tav = e->tav; + if (tav.mode != Addressing_Constant) { + continue; + } + GB_ASSERT(tav.value.kind == ExactValue_Integer); + i64 v = big_int_to_i64(&tav.value.value_integer); + i64 lower = type->BitSet.min; + bits |= 1ull<<cast(u64)(v-lower); + } + ir_write_u64(f, bits); } else { ir_write_str_lit(f, "zeroinitializer"); } |