From a7555c58d97480e439d1543cc0d4e001b23e4dd1 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 29 Nov 2015 13:37:55 -0700 Subject: add unary expression --- src/codegen.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/codegen.cpp') diff --git a/src/codegen.cpp b/src/codegen.cpp index dd1f8a4722..4ecceaabdd 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -317,6 +317,7 @@ static void find_declarations(CodeGen *g, AstNode *node) { case NodeTypeAddExpr: case NodeTypeMultExpr: case NodeTypeCastExpr: + case NodeTypeUnaryExpr: case NodeTypePrimaryExpr: case NodeTypeGroupedExpr: zig_unreachable(); @@ -542,6 +543,9 @@ static void analyze_node(CodeGen *g, AstNode *node) { case NodeTypeCastExpr: zig_panic("TODO"); break; + case NodeTypeUnaryExpr: + zig_panic("TODO"); + break; case NodeTypePrimaryExpr: switch (node->data.primary_expr.type) { case PrimaryExprTypeNumber: @@ -740,10 +744,35 @@ static LLVMValueRef gen_primary_expr(CodeGen *g, AstNode *node) { zig_unreachable(); } +static LLVMValueRef gen_unary_expr(CodeGen *g, AstNode *node) { + assert(node->type == NodeTypeUnaryExpr); + assert(node->data.unary_expr.primary_expr); + + LLVMValueRef expr = gen_expr(g, node->data.unary_expr.primary_expr); + + switch (node->data.unary_expr.unary_op) { + case UnaryOpNegation: + add_debug_source_node(g, node); + return LLVMBuildNeg(g->builder, expr, ""); + case UnaryOpBoolNot: + { + LLVMValueRef zero = LLVMConstNull(LLVMTypeOf(expr)); + add_debug_source_node(g, node); + return LLVMBuildICmp(g->builder, LLVMIntEQ, expr, zero, ""); + } + case UnaryOpBinNot: + add_debug_source_node(g, node); + return LLVMBuildNot(g->builder, expr, ""); + case UnaryOpInvalid: + zig_unreachable(); + } + +} + static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeCastExpr); - LLVMValueRef expr = gen_primary_expr(g, node->data.cast_expr.primary_expr); + LLVMValueRef expr = gen_expr(g, node->data.cast_expr.unary_expr); if (!node->data.cast_expr.type) return expr; @@ -997,6 +1026,8 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { return gen_bool_or_expr(g, node); case NodeTypeReturnExpr: return gen_return_expr(g, node); + case NodeTypeUnaryExpr: + return gen_unary_expr(g, node); case NodeTypeRoot: case NodeTypeRootExportDecl: case NodeTypeFnProto: -- cgit v1.2.3