authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-28 15:10:27-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-28 15:10:27-07:00
loga299de2265ae1fc2da31214725ea5bf399848319
tree98dd5e1a3e61f5ae0f0bb4cd8a75e5f1fee049d1
parent4815c03caa08ecca6bdca85885506e850f9869b1

better alignment value for stack variables

fixes debug info sometimes not being available for parameters

3 files changed, 15 insertions(+), 9 deletions(-)

src/codegen.cpp+9-9
......@@ -3547,25 +3547,25 @@ static void do_code_gen(CodeGen *g) {
35473547
35483548 if (var->block_context->node->type == NodeTypeFnDef) {
35493549 assert(var->gen_arg_index >= 0);
3550 TypeTableEntry *gen_type;
35503551 if (handle_is_ptr(var->type)) {
3551 TypeTableEntry *gen_type = fn_table_entry->type_entry->data.fn.gen_param_info[var->src_arg_index].type;
3552 gen_type = fn_table_entry->type_entry->data.fn.gen_param_info[var->src_arg_index].type;
35523553 var->value_ref = LLVMGetParam(fn, var->gen_arg_index);
3553 var->di_loc_var = LLVMZigCreateParameterVariable(g->dbuilder, var->block_context->di_scope,
3554 buf_ptr(&var->name), import->di_file, var->decl_node->line + 1,
3555 gen_type->di_type, !g->strip_debug_symbols, 0, var->gen_arg_index + 1);
35563554 } else {
3555 gen_type = var->type;
35573556 var->value_ref = LLVMBuildAlloca(g->builder, var->type->type_ref, buf_ptr(&var->name));
3558 uint64_t align_bytes = LLVMABISizeOfType(g->target_data_ref, var->type->type_ref);
3557 unsigned align_bytes = ZigLLVMGetPrefTypeAlignment(g->target_data_ref, var->type->type_ref);
35593558 LLVMSetAlignment(var->value_ref, align_bytes);
3560 var->di_loc_var = LLVMZigCreateAutoVariable(g->dbuilder, var->block_context->di_scope,
3561 buf_ptr(&var->name), import->di_file, var->decl_node->line + 1,
3562 var->type->di_type, !g->strip_debug_symbols, 0);
35633559 }
3560 var->di_loc_var = LLVMZigCreateParameterVariable(g->dbuilder, var->block_context->di_scope,
3561 buf_ptr(&var->name), import->di_file, var->decl_node->line + 1,
3562 gen_type->di_type, !g->strip_debug_symbols, 0, var->gen_arg_index + 1);
35643563
35653564 } else {
35663565 var->value_ref = LLVMBuildAlloca(g->builder, var->type->type_ref, buf_ptr(&var->name));
35673566
3568 uint64_t align_bytes = LLVMABISizeOfType(g->target_data_ref, var->type->type_ref);
3567
3568 unsigned align_bytes = ZigLLVMGetPrefTypeAlignment(g->target_data_ref, var->type->type_ref);
35693569 LLVMSetAlignment(var->value_ref, align_bytes);
35703570
35713571 var->di_loc_var = LLVMZigCreateAutoVariable(g->dbuilder, var->block_context->di_scope,
src/zig_llvm.cpp+4
......@@ -641,6 +641,10 @@ void ZigLLVMAddModuleDebugInfoFlag(LLVMModuleRef module) {
641641 unwrap(module)->addModuleFlag(Module::Warning, "Debug Info Version", DEBUG_METADATA_VERSION);
642642}
643643
644unsigned ZigLLVMGetPrefTypeAlignment(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
645 return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
646}
647
644648//------------------------------------
645649
646650#include "buffer.hpp"
src/zig_llvm.hpp+2
......@@ -152,6 +152,8 @@ void LLVMZigSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state);
152152
153153void ZigLLVMAddFunctionAttr(LLVMValueRef fn, const char *attr_name, const char *attr_value);
154154
155unsigned ZigLLVMGetPrefTypeAlignment(LLVMTargetDataRef TD, LLVMTypeRef Ty);
156
155157
156158// copied from include/llvm/ADT/Triple.h
157159