IR: add assembly instruction

This commit is contained in:
Andrew Kelley
2016-11-13 21:07:30 -05:00
parent 04c047463b
commit 2edc6c1a3f
5 changed files with 368 additions and 229 deletions

View File

@@ -407,13 +407,19 @@ static void render_node(AstRender *ar, AstNode *node) {
break;
}
case NodeTypeBlock:
if (node->data.block.statements.length == 0) {
fprintf(ar->f, "{}");
break;
}
fprintf(ar->f, "{\n");
ar->indent += ar->indent_size;
for (size_t i = 0; i < node->data.block.statements.length; i += 1) {
AstNode *statement = node->data.block.statements.at(i);
print_indent(ar);
render_node(ar, statement);
fprintf(ar->f, ";\n");
if (i != node->data.block.statements.length - 1)
fprintf(ar->f, ";");
fprintf(ar->f, "\n");
}
ar->indent -= ar->indent_size;
print_indent(ar);
@@ -598,6 +604,60 @@ static void render_node(AstRender *ar, AstNode *node) {
case NodeTypeVarLiteral:
fprintf(ar->f, "var");
break;
case NodeTypeAsmExpr:
{
AstNodeAsmExpr *asm_expr = &node->data.asm_expr;
const char *volatile_str = asm_expr->is_volatile ? " volatile" : "";
fprintf(ar->f, "asm%s (\"%s\"\n", volatile_str, buf_ptr(asm_expr->asm_template));
print_indent(ar);
fprintf(ar->f, ": ");
for (size_t i = 0; i < asm_expr->output_list.length; i += 1) {
AsmOutput *asm_output = asm_expr->output_list.at(i);
if (i != 0) {
fprintf(ar->f, ",\n");
print_indent(ar);
}
fprintf(ar->f, "[%s] \"%s\" (",
buf_ptr(asm_output->asm_symbolic_name),
buf_ptr(asm_output->constraint));
if (asm_output->return_type) {
fprintf(ar->f, "-> ");
render_node(ar, asm_output->return_type);
} else {
fprintf(ar->f, "%s", buf_ptr(asm_output->variable_name));
}
fprintf(ar->f, ")");
}
fprintf(ar->f, "\n");
print_indent(ar);
fprintf(ar->f, ": ");
for (size_t i = 0; i < asm_expr->input_list.length; i += 1) {
AsmInput *asm_input = asm_expr->input_list.at(i);
if (i != 0) {
fprintf(ar->f, ",\n");
print_indent(ar);
}
fprintf(ar->f, "[%s] \"%s\" (",
buf_ptr(asm_input->asm_symbolic_name),
buf_ptr(asm_input->constraint));
render_node(ar, asm_input->expr);
fprintf(ar->f, ")");
}
fprintf(ar->f, "\n");
print_indent(ar);
fprintf(ar->f, ": ");
for (size_t i = 0; i < asm_expr->clobber_list.length; i += 1) {
Buf *reg_name = asm_expr->clobber_list.at(i);
if (i != 0) fprintf(ar->f, ", ");
fprintf(ar->f, "\"%s\"", buf_ptr(reg_name));
}
fprintf(ar->f, ")");
break;
}
case NodeTypeFnDecl:
case NodeTypeParamDecl:
case NodeTypeErrorValueDecl:
@@ -621,7 +681,6 @@ static void render_node(AstRender *ar, AstNode *node) {
case NodeTypeGoto:
case NodeTypeBreak:
case NodeTypeContinue:
case NodeTypeAsmExpr:
zig_panic("TODO more ast rendering");
}
}