From d83e4092bfee7bfdb59d1522289aa0bc7df407e4 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 6 Aug 2017 18:15:11 -0400 Subject: [PATCH] fix constant debug info when number literal is 0 --- src/analyze.cpp | 34 +++++++++++++++------------------- src/codegen.cpp | 3 +++ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 6ad5af782b..8418dbdcd1 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -813,8 +813,19 @@ static const char *calling_convention_name(CallingConvention cc) { case CallingConventionCold: return "coldcc"; case CallingConventionNaked: return "nakedcc"; case CallingConventionStdcall: return "stdcallcc"; - default: zig_unreachable(); } + zig_unreachable(); +} + +static const char *calling_convention_fn_type_str(CallingConvention cc) { + switch (cc) { + case CallingConventionUnspecified: return ""; + case CallingConventionC: return "extern "; + case CallingConventionCold: return "coldcc "; + case CallingConventionNaked: return "nakedcc "; + case CallingConventionStdcall: return "stdcallcc "; + } + zig_unreachable(); } TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) { @@ -832,24 +843,7 @@ TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) { // populate the name of the type buf_resize(&fn_type->name, 0); - const char *cc_str; - switch (fn_type->data.fn.fn_type_id.cc) { - case CallingConventionUnspecified: - cc_str = ""; - break; - case CallingConventionC: - cc_str = "extern "; - break; - case CallingConventionCold: - cc_str = "coldcc "; - break; - case CallingConventionNaked: - cc_str = "nakedcc "; - break; - case CallingConventionStdcall: - cc_str = "stdcallcc "; - break; - } + const char *cc_str = calling_convention_fn_type_str(fn_type->data.fn.fn_type_id.cc); buf_appendf(&fn_type->name, "%sfn(", cc_str); for (size_t i = 0; i < fn_type_id->param_count; i += 1) { FnTypeParamInfo *param_info = &fn_type_id->param_info[i]; @@ -4145,6 +4139,8 @@ void render_const_value(CodeGen *g, Buf *buf, ConstExprValue *const_val) { } TypeTableEntry *make_int_type(CodeGen *g, bool is_signed, uint32_t size_in_bits) { + assert(size_in_bits > 0); + TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdInt); entry->is_copyable = true; entry->type_ref = LLVMIntType(size_in_bits); diff --git a/src/codegen.cpp b/src/codegen.cpp index 2a3b4d7938..b5404c60d7 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -3891,6 +3891,9 @@ static void do_code_gen(CodeGen *g) { ConstExprValue *const_val = var->value; assert(const_val->special != ConstValSpecialRuntime); size_t bits_needed = bigint_bits_needed(&const_val->data.x_bigint); + if (bits_needed < 8) { + bits_needed = 8; + } TypeTableEntry *var_type = get_int_type(g, const_val->data.x_bigint.is_negative, bits_needed); LLVMValueRef init_val = bigint_to_llvm_const(var_type->type_ref, &const_val->data.x_bigint); gen_global_var(g, var, init_val, var_type);