aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.c19
-rw-r--r--parse.h6
2 files changed, 17 insertions, 8 deletions
diff --git a/parse.c b/parse.c
index 81b5e13..408ad4b 100644
--- a/parse.c
+++ b/parse.c
@@ -939,7 +939,8 @@ struct token *expression_statement(struct token *token, struct expression **tree
return expect(token, ';', "at end of statement");
}
-static struct token *parse_asm_operands(struct token *token, struct statement *stmt)
+static struct token *parse_asm_operands(struct token *token, struct statement *stmt,
+ struct expression_list **inout)
{
struct expression *expr;
@@ -952,37 +953,39 @@ static struct token *parse_asm_operands(struct token *token, struct statement *s
match_op(token->next->next->next, ']'))
token = token->next->next->next;
token = primary_expression(token->next, &expr);
+ add_expression(inout, expr);
token = parens_expression(token, &expr, "in asm parameter");
+ add_expression(inout, expr);
} while (match_op(token, ','));
return token;
}
-static struct token *parse_asm_clobbers(struct token *token, struct statement *stmt)
+static struct token *parse_asm_clobbers(struct token *token, struct statement *stmt,
+ struct expression_list **clobbers)
{
struct expression *expr;
do {
token = primary_expression(token->next, &expr);
+ add_expression(clobbers, expr);
} while (match_op(token, ','));
return token;
}
static struct token *parse_asm(struct token *token, struct statement *stmt)
{
- struct expression *expr;
-
stmt->type = STMT_ASM;
if (match_idents(token, &__volatile___ident, &__volatile_ident, &volatile_ident, NULL)) {
token = token->next;
}
token = expect(token, '(', "after asm");
- token = parse_expression(token->next, &expr);
+ token = parse_expression(token->next, &stmt->asm_string);
if (match_op(token, ':'))
- token = parse_asm_operands(token, stmt);
+ token = parse_asm_operands(token, stmt, &stmt->asm_outputs);
if (match_op(token, ':'))
- token = parse_asm_operands(token, stmt);
+ token = parse_asm_operands(token, stmt, &stmt->asm_inputs);
if (match_op(token, ':'))
- token = parse_asm_clobbers(token, stmt);
+ token = parse_asm_clobbers(token, stmt, &stmt->asm_clobbers);
token = expect(token, ')', "after asm");
return expect(token, ';', "at end of asm-statement");
}
diff --git a/parse.h b/parse.h
index 6fe25f5..e37825b 100644
--- a/parse.h
+++ b/parse.h
@@ -92,6 +92,12 @@ struct statement {
struct expression *multi_to;
struct symbol *multi_target;
};
+ struct /* asm */ {
+ struct expression *asm_string;
+ struct expression_list *asm_outputs;
+ struct expression_list *asm_inputs;
+ struct expression_list *asm_clobbers;
+ };
};
};