From 4e7effd3d38894f4d00bb0bb51ed34e237a4167e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 4 Sep 2016 18:30:40 -0700 Subject: port to llvm 3.9 --- src/codegen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/codegen.cpp') diff --git a/src/codegen.cpp b/src/codegen.cpp index b4fcefe653..5c5041992d 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -4847,7 +4847,7 @@ static void init(CodeGen *g, Buf *source_path) { g->target_machine = LLVMCreateTargetMachine(target_ref, buf_ptr(&g->triple_str), target_specific_cpu_args, target_specific_features, opt_level, reloc_mode, LLVMCodeModelDefault); - g->target_data_ref = LLVMGetTargetMachineData(g->target_machine); + g->target_data_ref = LLVMCreateTargetDataLayout(g->target_machine); char *layout_str = LLVMCopyStringRepOfTargetData(g->target_data_ref); LLVMSetDataLayout(g->module, layout_str); -- cgit v1.2.3 From 20eb749ad6983d74ce8285a725d84248d41fca00 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 4 Sep 2016 22:32:23 -0700 Subject: generate debug info for global constants See #41 --- src/all_types.hpp | 1 + src/analyze.cpp | 1 + src/codegen.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++---- src/zig_llvm.cpp | 16 ++++++++++++++++ src/zig_llvm.hpp | 5 +++++ 5 files changed, 66 insertions(+), 4 deletions(-) (limited to 'src/codegen.cpp') diff --git a/src/all_types.hpp b/src/all_types.hpp index d5dec38dac..8a97cde001 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -1336,6 +1336,7 @@ struct VariableTableEntry { BlockContext *block_context; LLVMValueRef param_value_ref; bool force_depends_on_compile_var; + ImportTableEntry *import; }; struct ErrorTableEntry { diff --git a/src/analyze.cpp b/src/analyze.cpp index 5ffce5bdb8..e1728448e3 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3757,6 +3757,7 @@ static VariableTableEntry *add_local_var(CodeGen *g, AstNode *source_node, Impor VariableTableEntry *variable_entry = allocate(1); variable_entry->type = type_entry; variable_entry->block_context = context; + variable_entry->import = import; if (name) { buf_init_from_buf(&variable_entry->name, name); diff --git a/src/codegen.cpp b/src/codegen.cpp index 5c5041992d..6b748634f1 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -3954,6 +3954,19 @@ static void build_label_blocks(CodeGen *g, FnTableEntry *fn) { LLVMPositionBuilderAtEnd(g->builder, entry_block); } +static void gen_global_var(CodeGen *g, VariableTableEntry *var, LLVMValueRef init_val, + TypeTableEntry *type_entry) +{ + assert(var->is_const); + assert(var->import); + assert(type_entry); + bool is_local_to_unit = true; + LLVMZigCreateGlobalVariable(g->dbuilder, + var->block_context->di_scope, buf_ptr(&var->name), + buf_ptr(&var->name), var->import->di_file, var->decl_node->line + 1, + type_entry->di_type, is_local_to_unit, init_val); +} + static void do_code_gen(CodeGen *g) { assert(!g->errors.length); @@ -3967,10 +3980,29 @@ static void do_code_gen(CodeGen *g) { for (int i = 0; i < g->global_vars.length; i += 1) { VariableTableEntry *var = g->global_vars.at(i); - if (var->type->id == TypeTableEntryIdNumLitFloat || - var->type->id == TypeTableEntryIdNumLitInt || - !type_has_bits(var->type)) - { + if (var->type->id == TypeTableEntryIdNumLitFloat) { + // Generate debug info for it but that's it. + ConstExprValue *const_val = &get_resolved_expr(var->val_node)->const_val; + assert(const_val->ok); + TypeTableEntry *var_type = g->builtin_types.entry_f64; + LLVMValueRef init_val = LLVMConstReal(var_type->type_ref, const_val->data.x_bignum.data.x_float); + gen_global_var(g, var, init_val, var_type); + continue; + } + + if (var->type->id == TypeTableEntryIdNumLitInt) { + // Generate debug info for it but that's it. + ConstExprValue *const_val = &get_resolved_expr(var->val_node)->const_val; + assert(const_val->ok); + TypeTableEntry *var_type = const_val->data.x_bignum.is_negative ? + g->builtin_types.entry_isize : g->builtin_types.entry_usize; + LLVMValueRef init_val = LLVMConstInt(var_type->type_ref, + bignum_to_twos_complement(&const_val->data.x_bignum), false); + gen_global_var(g, var, init_val, var_type); + continue; + } + + if (!type_has_bits(var->type)) { continue; } @@ -3981,6 +4013,8 @@ static void do_code_gen(CodeGen *g) { if (var->decl_node->data.variable_declaration.is_extern) { global_value = LLVMAddGlobal(g->module, var->type->type_ref, buf_ptr(&var->name)); + // TODO debug info for the extern variable + LLVMSetLinkage(global_value, LLVMExternalLinkage); } else { AstNode *expr_node = var->decl_node->data.variable_declaration.expr; @@ -3999,6 +4033,11 @@ static void do_code_gen(CodeGen *g) { LLVMSetInitializer(global_value, init_val); LLVMSetLinkage(global_value, LLVMInternalLinkage); LLVMSetUnnamedAddr(global_value, true); + + // TODO debug info for function pointers + if (var->is_const && var->type->id != TypeTableEntryIdFn) { + gen_global_var(g, var, init_val, var->type); + } } LLVMSetGlobalConstant(global_value, var->is_const); diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 4efd64807a..969e624d4c 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -401,6 +401,22 @@ LLVMZigDILocalVariable *LLVMZigCreateAutoVariable(LLVMZigDIBuilder *dbuilder, return reinterpret_cast(result); } +LLVMZigDIGlobalVariable *LLVMZigCreateGlobalVariable(LLVMZigDIBuilder *dbuilder, + LLVMZigDIScope *scope, const char *name, const char *linkage_name, LLVMZigDIFile *file, + unsigned line_no, LLVMZigDIType *di_type, bool is_local_to_unit, LLVMValueRef constant_val) +{ + DIGlobalVariable *result = reinterpret_cast(dbuilder)->createGlobalVariable( + reinterpret_cast(scope), + name, + linkage_name, + reinterpret_cast(file), + line_no, + reinterpret_cast(di_type), + is_local_to_unit, + reinterpret_cast(constant_val)); + return reinterpret_cast(result); +} + LLVMZigDILocalVariable *LLVMZigCreateParameterVariable(LLVMZigDIBuilder *dbuilder, LLVMZigDIScope *scope, const char *name, LLVMZigDIFile *file, unsigned line_no, LLVMZigDIType *type, bool always_preserve, unsigned flags, unsigned arg_no) diff --git a/src/zig_llvm.hpp b/src/zig_llvm.hpp index 801e993216..34367403da 100644 --- a/src/zig_llvm.hpp +++ b/src/zig_llvm.hpp @@ -23,6 +23,7 @@ struct LLVMZigDILexicalBlock; struct LLVMZigDISubprogram; struct LLVMZigDISubroutineType; struct LLVMZigDILocalVariable; +struct LLVMZigDIGlobalVariable; struct LLVMZigDILocation; struct LLVMZigDIEnumerator; struct LLVMZigInsertionPoint; @@ -125,6 +126,10 @@ LLVMZigDILocalVariable *LLVMZigCreateAutoVariable(LLVMZigDIBuilder *dbuilder, LLVMZigDIScope *scope, const char *name, LLVMZigDIFile *file, unsigned line_no, LLVMZigDIType *type, bool always_preserve, unsigned flags); +LLVMZigDIGlobalVariable *LLVMZigCreateGlobalVariable(LLVMZigDIBuilder *dbuilder, + LLVMZigDIScope *scope, const char *name, const char *linkage_name, LLVMZigDIFile *file, + unsigned line_no, LLVMZigDIType *di_type, bool is_local_to_unit, LLVMValueRef constant_val); + LLVMZigDILocalVariable *LLVMZigCreateParameterVariable(LLVMZigDIBuilder *dbuilder, LLVMZigDIScope *scope, const char *name, LLVMZigDIFile *file, unsigned line_no, LLVMZigDIType *type, bool always_preserve, unsigned flags, unsigned arg_no); -- cgit v1.2.3 From 4979e606c36fdca886f82b0dd8c0db17374ab8f6 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 5 Sep 2016 16:18:49 -0400 Subject: fix gcc 5.4.0compile errors --- src/analyze.cpp | 2 +- src/codegen.cpp | 4 ++-- src/parseh.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/codegen.cpp') diff --git a/src/analyze.cpp b/src/analyze.cpp index e1728448e3..3064ad359d 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -6026,7 +6026,7 @@ static TypeTableEntry *analyze_switch_expr(CodeGen *g, ImportTableEntry *import, int *field_use_counts = nullptr; - HashMap err_use_nodes; + HashMap err_use_nodes = {}; if (expr_type->id == TypeTableEntryIdEnum) { field_use_counts = allocate(expr_type->data.enumeration.field_count); } else if (expr_type->id == TypeTableEntryIdErrorUnion) { diff --git a/src/codegen.cpp b/src/codegen.cpp index 6b748634f1..9b0e61fdaf 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -2757,7 +2757,7 @@ static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { static LLVMValueRef gen_block(CodeGen *g, AstNode *block_node, TypeTableEntry *implicit_return_type) { assert(block_node->type == NodeTypeBlock); - LLVMValueRef return_value; + LLVMValueRef return_value = nullptr; for (int i = 0; i < block_node->data.block.statements.length; i += 1) { AstNode *statement_node = block_node->data.block.statements.at(i); return_value = gen_expr(g, statement_node); @@ -3301,7 +3301,7 @@ static LLVMValueRef gen_var_decl_expr(CodeGen *g, AstNode *node) { } } - LLVMValueRef init_val; + LLVMValueRef init_val = nullptr; TypeTableEntry *init_val_type; return gen_var_decl_raw(g, node, &node->data.variable_declaration, false, &init_val, &init_val_type, false); } diff --git a/src/parseh.cpp b/src/parseh.cpp index fb2605a0e6..64838bb496 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -1205,7 +1205,7 @@ static void visit_var_decl(Context *c, const VarDecl *var_decl) { emit_warning(c, var_decl, "ignoring variable '%s' - unable to evaluate initializer\n", buf_ptr(name)); return; } - AstNode *init_node; + AstNode *init_node = nullptr; switch (ap_value->getKind()) { case APValue::Int: { -- cgit v1.2.3