authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-01 12:51:45-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-09-01 12:51:45-07:00
log0f38955ee5b5ff2251fdbc3ac4d95a9aecfdfd3c
tree40518f7f646ecf2e32b1e25b639fda1706032f5f
parentfa8912ab7853501b5cbae57dbc34ba8d2ac0e123

translate while loops and implicit bitcasts


1 files changed, 29 insertions(+), 13 deletions(-)

src/parseh.cpp+29-13
......@@ -949,6 +949,14 @@ static AstNode * trans_conditional_operator(Context *c, AstNode *block, Conditio
949949 return node;
950950}
951951
952static AstNode * trans_create_bin_op(Context *c, AstNode *block, Expr *lhs, BinOpType bin_op, Expr *rhs) {
953 AstNode *node = trans_create_node(c, NodeTypeBinOpExpr);
954 node->data.bin_op_expr.bin_op = bin_op;
955 node->data.bin_op_expr.op1 = trans_expr(c, block, lhs);
956 node->data.bin_op_expr.op2 = trans_expr(c, block, rhs);
957 return node;
958}
959
952960static AstNode * trans_binary_operator(Context *c, AstNode *block, BinaryOperator *stmt) {
953961 switch (stmt->getOpcode()) {
954962 case BO_PtrMemD:
......@@ -970,19 +978,13 @@ static AstNode * trans_binary_operator(Context *c, AstNode *block, BinaryOperato
970978 case BO_Shr:
971979 zig_panic("TODO handle more C binary operators: BO_Shr");
972980 case BO_LT:
973 {
974 AstNode *node = trans_create_node(c, NodeTypeBinOpExpr);
975 node->data.bin_op_expr.bin_op = BinOpTypeCmpLessThan;
976 node->data.bin_op_expr.op1 = trans_expr(c, block, stmt->getLHS());
977 node->data.bin_op_expr.op2 = trans_expr(c, block, stmt->getRHS());
978 return node;
979 }
981 return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpLessThan, stmt->getRHS());
980982 case BO_GT:
981 zig_panic("TODO handle more C binary operators: BO_GT");
983 return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpGreaterThan, stmt->getRHS());
982984 case BO_LE:
983 zig_panic("TODO handle more C binary operators: BO_LE");
985 return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpLessOrEq, stmt->getRHS());
984986 case BO_GE:
985 zig_panic("TODO handle more C binary operators: BO_GE");
987 return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpGreaterOrEq, stmt->getRHS());
986988 case BO_EQ:
987989 zig_panic("TODO handle more C binary operators: BO_EQ");
988990 case BO_NE:
......@@ -1031,7 +1033,14 @@ static AstNode * trans_implicit_cast_expr(Context *c, AstNode *block, ImplicitCa
10311033 case CK_LValueToRValue:
10321034 return trans_expr(c, block, stmt->getSubExpr());
10331035 case CK_IntegralCast:
1034 zig_panic("TODO handle C translation cast CK_IntegralCast");
1036 {
1037 AstNode *node = trans_create_node(c, NodeTypeFnCallExpr);
1038 node->data.fn_call_expr.fn_ref_expr = trans_create_symbol_node(c, "bitCast");
1039 node->data.fn_call_expr.is_builtin = true;
1040 node->data.fn_call_expr.params.append(trans_qual_type(c, stmt->getType(), stmt->getExprLoc()));
1041 node->data.fn_call_expr.params.append(trans_expr(c, block, stmt->getSubExpr()));
1042 return node;
1043 }
10351044 case CK_Dependent:
10361045 zig_panic("TODO handle C translation cast CK_Dependent");
10371046 case CK_BitCast:
......@@ -1386,6 +1395,13 @@ static AstNode * trans_local_declaration(Context *c, AstNode *block, DeclStmt *s
13861395 return nullptr;
13871396}
13881397
1398static AstNode *trans_while_loop(Context *c, AstNode *block, WhileStmt *stmt) {
1399 AstNode *while_node = trans_create_node(c, NodeTypeWhileExpr);
1400 while_node->data.while_expr.condition = trans_expr(c, block, stmt->getCond());
1401 while_node->data.while_expr.body = trans_stmt(c, block, stmt->getBody());
1402 return while_node;
1403}
1404
13891405static AstNode *trans_stmt(Context *c, AstNode *block, Stmt *stmt) {
13901406 Stmt::StmtClass sc = stmt->getStmtClass();
13911407 switch (sc) {
......@@ -1407,14 +1423,14 @@ static AstNode *trans_stmt(Context *c, AstNode *block, Stmt *stmt) {
14071423 return trans_unary_operator(c, block, (UnaryOperator *)stmt);
14081424 case Stmt::DeclStmtClass:
14091425 return trans_local_declaration(c, block, (DeclStmt *)stmt);
1426 case Stmt::WhileStmtClass:
1427 return trans_while_loop(c, block, (WhileStmt *)stmt);
14101428 case Stmt::CaseStmtClass:
14111429 zig_panic("TODO handle C CaseStmtClass");
14121430 case Stmt::DefaultStmtClass:
14131431 zig_panic("TODO handle C DefaultStmtClass");
14141432 case Stmt::SwitchStmtClass:
14151433 zig_panic("TODO handle C SwitchStmtClass");
1416 case Stmt::WhileStmtClass:
1417 zig_panic("TODO handle C WhileStmtClass");
14181434 case Stmt::NoStmtClass:
14191435 zig_panic("TODO handle C NoStmtClass");
14201436 case Stmt::GCCAsmStmtClass: