From a299de2265ae1fc2da31214725ea5bf399848319 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 28 Apr 2016 15:10:27 -0700 Subject: [PATCH] better alignment value for stack variables fixes debug info sometimes not being available for parameters --- src/codegen.cpp | 18 +++++++++--------- src/zig_llvm.cpp | 4 ++++ src/zig_llvm.hpp | 2 ++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 5410fdcea..487c3ba37 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -3547,25 +3547,25 @@ static void do_code_gen(CodeGen *g) { if (var->block_context->node->type == NodeTypeFnDef) { assert(var->gen_arg_index >= 0); + TypeTableEntry *gen_type; if (handle_is_ptr(var->type)) { - TypeTableEntry *gen_type = fn_table_entry->type_entry->data.fn.gen_param_info[var->src_arg_index].type; + gen_type = fn_table_entry->type_entry->data.fn.gen_param_info[var->src_arg_index].type; var->value_ref = LLVMGetParam(fn, var->gen_arg_index); - var->di_loc_var = LLVMZigCreateParameterVariable(g->dbuilder, var->block_context->di_scope, - buf_ptr(&var->name), import->di_file, var->decl_node->line + 1, - gen_type->di_type, !g->strip_debug_symbols, 0, var->gen_arg_index + 1); } else { + gen_type = var->type; var->value_ref = LLVMBuildAlloca(g->builder, var->type->type_ref, buf_ptr(&var->name)); - uint64_t align_bytes = LLVMABISizeOfType(g->target_data_ref, var->type->type_ref); + unsigned align_bytes = ZigLLVMGetPrefTypeAlignment(g->target_data_ref, var->type->type_ref); LLVMSetAlignment(var->value_ref, align_bytes); - var->di_loc_var = LLVMZigCreateAutoVariable(g->dbuilder, var->block_context->di_scope, - buf_ptr(&var->name), import->di_file, var->decl_node->line + 1, - var->type->di_type, !g->strip_debug_symbols, 0); } + var->di_loc_var = LLVMZigCreateParameterVariable(g->dbuilder, var->block_context->di_scope, + buf_ptr(&var->name), import->di_file, var->decl_node->line + 1, + gen_type->di_type, !g->strip_debug_symbols, 0, var->gen_arg_index + 1); } else { var->value_ref = LLVMBuildAlloca(g->builder, var->type->type_ref, buf_ptr(&var->name)); - uint64_t align_bytes = LLVMABISizeOfType(g->target_data_ref, var->type->type_ref); + + unsigned align_bytes = ZigLLVMGetPrefTypeAlignment(g->target_data_ref, var->type->type_ref); LLVMSetAlignment(var->value_ref, align_bytes); var->di_loc_var = LLVMZigCreateAutoVariable(g->dbuilder, var->block_context->di_scope, diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 8e56ed3de..cc0b63d1c 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -641,6 +641,10 @@ void ZigLLVMAddModuleDebugInfoFlag(LLVMModuleRef module) { unwrap(module)->addModuleFlag(Module::Warning, "Debug Info Version", DEBUG_METADATA_VERSION); } +unsigned ZigLLVMGetPrefTypeAlignment(LLVMTargetDataRef TD, LLVMTypeRef Ty) { + return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty)); +} + //------------------------------------ #include "buffer.hpp" diff --git a/src/zig_llvm.hpp b/src/zig_llvm.hpp index 2c3df900b..43a3e4729 100644 --- a/src/zig_llvm.hpp +++ b/src/zig_llvm.hpp @@ -152,6 +152,8 @@ void LLVMZigSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state); void ZigLLVMAddFunctionAttr(LLVMValueRef fn, const char *attr_name, const char *attr_value); +unsigned ZigLLVMGetPrefTypeAlignment(LLVMTargetDataRef TD, LLVMTypeRef Ty); + // copied from include/llvm/ADT/Triple.h