aboutsummaryrefslogtreecommitdiff
path: root/src/ast_render.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-08-29 07:30:22 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-08-29 07:51:34 -0400
commitc5c9d98065890eaeb9070cba20e5a1ed48b392af (patch)
tree46ad520853066174a22ad5eb6e3ac81e51f11d16 /src/ast_render.cpp
parentb8ed0cb3741533e036ee05faa165d2f0c49064f4 (diff)
downloadzig-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.cpp38
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) {