From c5c9d98065890eaeb9070cba20e5a1ed48b392af Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 29 Aug 2017 07:30:22 -0400 Subject: introduce align keyword * remove `@setGlobalAlign` * add align keyword for setting alignment on functions and variables. * loads and stores use alignment from pointer * memcpy, memset use alignment from pointer * add syntax for pointer alignment * slices can have volatile * add u2, i2 primitives * ignore preferred align and use abi align everywhere * back to only having alignOf builtin. preferredAlignOf is too tricky to be useful. See #432. Partial revert of e726925e802eddab53cbfd9aacbc5eefe95c356f. See #37 --- src/ast_render.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'src/ast_render.cpp') diff --git a/src/ast_render.cpp b/src/ast_render.cpp index 23a83fadd0..b053a4e8af 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -65,10 +65,6 @@ static const char *prefix_op_str(PrefixOp prefix_op) { case PrefixOpNegationWrap: return "-%"; case PrefixOpBoolNot: return "!"; case PrefixOpBinNot: return "~"; - case PrefixOpAddressOf: return "&"; - case PrefixOpConstAddressOf: return "&const "; - case PrefixOpVolatileAddressOf: return "&volatile "; - case PrefixOpConstVolatileAddressOf: return "&const volatile "; case PrefixOpDereference: return "*"; case PrefixOpMaybe: return "?"; case PrefixOpError: return "%"; @@ -192,6 +188,8 @@ static const char *node_type_str(NodeType node_type) { return "Symbol"; case NodeTypePrefixOpExpr: return "PrefixOpExpr"; + case NodeTypeAddrOfExpr: + return "AddrOfExpr"; case NodeTypeUse: return "Use"; case NodeTypeBoolLiteral: @@ -583,6 +581,38 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) { render_node_ungrouped(ar, node->data.prefix_op_expr.primary_expr); break; } + case NodeTypeAddrOfExpr: + { + fprintf(ar->f, "&"); + if (node->data.addr_of_expr.align_expr != nullptr) { + fprintf(ar->f, "align "); + render_node_grouped(ar, node->data.addr_of_expr.align_expr); + if (node->data.addr_of_expr.bit_offset_start != nullptr) { + assert(node->data.addr_of_expr.bit_offset_end != nullptr); + + Buf offset_start_buf = BUF_INIT; + buf_resize(&offset_start_buf, 0); + bigint_append_buf(&offset_start_buf, node->data.addr_of_expr.bit_offset_start, 10); + + Buf offset_end_buf = BUF_INIT; + buf_resize(&offset_end_buf, 0); + bigint_append_buf(&offset_end_buf, node->data.addr_of_expr.bit_offset_end, 10); + + fprintf(ar->f, ":%s:%s ", buf_ptr(&offset_start_buf), buf_ptr(&offset_end_buf)); + } else { + fprintf(ar->f, " "); + } + } + if (node->data.addr_of_expr.is_const) { + fprintf(ar->f, "const "); + } + if (node->data.addr_of_expr.is_volatile) { + fprintf(ar->f, "volatile "); + } + + render_node_ungrouped(ar, node->data.addr_of_expr.op_expr); + break; + } case NodeTypeFnCallExpr: { if (node->data.fn_call_expr.is_builtin) { -- cgit v1.2.3