aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorJosh Wolfe <thejoshwolfe@gmail.com>2015-12-03 10:56:17 -0700
committerJosh Wolfe <thejoshwolfe@gmail.com>2015-12-03 10:56:17 -0700
commit5af4ef88acb68b66d38846b398e1e34845cccfbf (patch)
tree36c7ac3ee73510adaf8ba08d9a1105f7f5a5b87c /src/codegen.cpp
parent708cae3786a5ce103d92bffe7ea8107df039426f (diff)
downloadzig-5af4ef88acb68b66d38846b398e1e34845cccfbf.tar.gz
zig-5af4ef88acb68b66d38846b398e1e34845cccfbf.zip
local variables work
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index e91464771a..eac6267888 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -103,17 +103,6 @@ static LLVMValueRef find_or_create_string(CodeGen *g, Buf *str) {
return global_value;
}
-static LLVMValueRef get_variable_value(CodeGen *g, Buf *name) {
- assert(g->cur_fn->proto_node->type == NodeTypeFnProto);
-
- SymbolTableEntry *symbol_entry = g->cur_fn->symbol_table.get(name);
-
- CodeGenNode *codegen_node = g->cur_fn->fn_def_node->codegen_node;
- assert(codegen_node);
- FnDefNode *codegen_fn_def = &codegen_node->data.fn_def_node;
- return codegen_fn_def->params[symbol_entry->param_index];
-}
-
static TypeTableEntry *get_expr_type(AstNode *node) {
return node->codegen_node->expr_node.type_entry;
}
@@ -481,7 +470,12 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) {
case NodeTypeReturnExpr:
return gen_return_expr(g, node);
case NodeTypeVariableDeclaration:
- zig_panic("TODO: variable declaration code gen");
+ {
+ LocalVariableTableEntry *variable = find_local_variable(node->codegen_node->expr_node.block_context, &node->data.variable_declaration.symbol);
+ assert(node->data.variable_declaration.expr);
+ variable->value_ref = gen_expr(g, node->data.variable_declaration.expr);
+ return nullptr;
+ }
case NodeTypeCastExpr:
return gen_cast_expr(g, node);
case NodeTypePrefixOpExpr:
@@ -516,8 +510,8 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) {
}
case NodeTypeSymbol:
{
- Buf *name = &node->data.symbol;
- return get_variable_value(g, name);
+ LocalVariableTableEntry *variable = find_local_variable(node->codegen_node->expr_node.block_context, &node->data.symbol);
+ return variable->value_ref;
}
case NodeTypeBlock:
return gen_block(g, node, nullptr);
@@ -648,8 +642,17 @@ static void do_code_gen(CodeGen *g) {
FnDefNode *codegen_fn_def = &codegen_node->data.fn_def_node;
assert(codegen_fn_def);
- codegen_fn_def->params = allocate<LLVMValueRef>(LLVMCountParams(fn));
- LLVMGetParams(fn, codegen_fn_def->params);
+ int param_count = fn_proto->params.length;
+ assert(param_count == (int)LLVMCountParams(fn));
+ LLVMValueRef *params = allocate<LLVMValueRef>(param_count);
+ LLVMGetParams(fn, params);
+
+ for (int i = 0; i < param_count; i += 1) {
+ AstNode *param_decl = fn_proto->params.at(i);
+ assert(param_decl->type == NodeTypeParamDecl);
+ LocalVariableTableEntry *parameter_variable = fn_def_node->codegen_node->data.fn_def_node.block_context->variable_table.get(&param_decl->data.param_decl.name);
+ parameter_variable->value_ref = params[i];
+ }
build_label_blocks(g, fn_def_node->data.fn_def.body);