diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-11-24 03:06:10 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-11-24 03:06:10 -0700 |
| commit | e112818e25b710199f5c757c17717499356d516e (patch) | |
| tree | 40958c73fa1e08a594d7d9bad4b6ab54057cccb6 /src/codegen.cpp | |
| parent | 4bbc074dd7d78f83c57103b22f95967f0936e904 (diff) | |
| download | zig-e112818e25b710199f5c757c17717499356d516e.tar.gz zig-e112818e25b710199f5c757c17717499356d516e.zip | |
codegen: fix param type of const strings
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index f838bec6a1..f1aaf84392 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -4,6 +4,7 @@ #include <stdio.h> #include <llvm-c/Core.h> +#include <llvm-c/Analysis.h> struct FnTableEntry { LLVMValueRef fn_value; @@ -235,9 +236,10 @@ static LLVMValueRef find_or_create_string(CodeGen *g, Buf *str) { } LLVMValueRef text = LLVMConstString(buf_ptr(str), buf_len(str), false); LLVMValueRef global_value = LLVMAddGlobal(g->mod, LLVMTypeOf(text), ""); - LLVMSetLinkage(global_value, LLVMInternalLinkage); + LLVMSetLinkage(global_value, LLVMPrivateLinkage); LLVMSetInitializer(global_value, text); LLVMSetGlobalConstant(global_value, true); + LLVMSetUnnamedAddr(global_value, true); g->str_table.put(str, global_value); return global_value; @@ -257,8 +259,15 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *expr_node) { case AstNodeExpressionTypeString: { Buf *str = &expr_node->data.expression.data.string; - fprintf(stderr, "str = '%s'\n", buf_ptr(str)); - return find_or_create_string(g, str); + LLVMValueRef str_val = find_or_create_string(g, str); + LLVMValueRef indices[] = { + LLVMConstInt(LLVMInt32Type(), 0, false), + LLVMConstInt(LLVMInt32Type(), 0, false) + }; + LLVMValueRef ptr_val = LLVMBuildInBoundsGEP(g->builder, str_val, + indices, 2, ""); + + return ptr_val; } case AstNodeExpressionTypeFnCall: return gen_fn_call(g, expr_node->data.expression.data.fn_call); @@ -322,6 +331,9 @@ void code_gen(CodeGen *g) { } LLVMDumpModule(g->mod); + + char *error = nullptr; + LLVMVerifyModule(g->mod, LLVMAbortProcessAction, &error); } ZigList<ErrorMsg> *codegen_error_messages(CodeGen *g) { |
