diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-08-29 07:30:22 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-08-29 07:51:34 -0400 |
| commit | c5c9d98065890eaeb9070cba20e5a1ed48b392af (patch) | |
| tree | 46ad520853066174a22ad5eb6e3ac81e51f11d16 /src/ast_render.cpp | |
| parent | b8ed0cb3741533e036ee05faa165d2f0c49064f4 (diff) | |
| download | zig-c5c9d98065890eaeb9070cba20e5a1ed48b392af.tar.gz zig-c5c9d98065890eaeb9070cba20e5a1ed48b392af.zip | |
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
Diffstat (limited to 'src/ast_render.cpp')
| -rw-r--r-- | src/ast_render.cpp | 38 |
1 files changed, 34 insertions, 4 deletions
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) { |
