aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-03-20 19:00:23 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-03-20 19:00:23 -0400
commit15c316b0d8152c0a1ad5b4b26efdf3fdc8cfb4c0 (patch)
tree0bd91c0ba2a63ed3495e94385fbedaa1e3a6fde0 /src/codegen.cpp
parent3c7555cb679492f3f1c0ce320cbdf4a3769e56db (diff)
downloadzig-15c316b0d8152c0a1ad5b4b26efdf3fdc8cfb4c0.tar.gz
zig-15c316b0d8152c0a1ad5b4b26efdf3fdc8cfb4c0.zip
add docs for assembly and fix global assembly parsing
Previously, global assembly was parsed expecting it to have the template syntax. However global assembly has no inputs, outputs, or clobbers, and thus does not have template syntax. This is now fixed. This commit also adds a compile error for using volatile on global assembly, since it is meaningless. closes #1515
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 08006224c1..cfd26af461 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -3793,8 +3793,8 @@ static LLVMValueRef ir_render_union_field_ptr(CodeGen *g, IrExecutable *executab
return bitcasted_union_field_ptr;
}
-static size_t find_asm_index(CodeGen *g, AstNode *node, AsmToken *tok) {
- const char *ptr = buf_ptr(node->data.asm_expr.asm_template) + tok->start + 2;
+static size_t find_asm_index(CodeGen *g, AstNode *node, AsmToken *tok, Buf *src_template) {
+ const char *ptr = buf_ptr(src_template) + tok->start + 2;
size_t len = tok->end - tok->start - 2;
size_t result = 0;
for (size_t i = 0; i < node->data.asm_expr.output_list.length; i += 1, result += 1) {
@@ -3817,13 +3817,13 @@ static LLVMValueRef ir_render_asm(CodeGen *g, IrExecutable *executable, IrInstru
assert(asm_node->type == NodeTypeAsmExpr);
AstNodeAsmExpr *asm_expr = &asm_node->data.asm_expr;
- Buf *src_template = asm_expr->asm_template;
+ Buf *src_template = instruction->asm_template;
Buf llvm_template = BUF_INIT;
buf_resize(&llvm_template, 0);
- for (size_t token_i = 0; token_i < asm_expr->token_list.length; token_i += 1) {
- AsmToken *asm_token = &asm_expr->token_list.at(token_i);
+ for (size_t token_i = 0; token_i < instruction->token_list_len; token_i += 1) {
+ AsmToken *asm_token = &instruction->token_list[token_i];
switch (asm_token->id) {
case AsmTokenIdTemplate:
for (size_t offset = asm_token->start; offset < asm_token->end; offset += 1) {
@@ -3840,7 +3840,7 @@ static LLVMValueRef ir_render_asm(CodeGen *g, IrExecutable *executable, IrInstru
break;
case AsmTokenIdVar:
{
- size_t index = find_asm_index(g, asm_node, asm_token);
+ size_t index = find_asm_index(g, asm_node, asm_token, src_template);
assert(index < SIZE_MAX);
buf_appendf(&llvm_template, "$%" ZIG_PRI_usize "", index);
break;
@@ -3937,7 +3937,7 @@ static LLVMValueRef ir_render_asm(CodeGen *g, IrExecutable *executable, IrInstru
}
LLVMTypeRef function_type = LLVMFunctionType(ret_type, param_types, (unsigned)input_and_output_count, false);
- bool is_volatile = asm_expr->is_volatile || (asm_expr->output_list.length == 0);
+ bool is_volatile = instruction->has_side_effects || (asm_expr->output_list.length == 0);
LLVMValueRef asm_fn = LLVMGetInlineAsm(function_type, buf_ptr(&llvm_template), buf_len(&llvm_template),
buf_ptr(&constraint_buf), buf_len(&constraint_buf), is_volatile, false, LLVMInlineAsmDialectATT);
@@ -5480,6 +5480,7 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
case IrInstructionIdCmpxchgSrc:
case IrInstructionIdLoadPtr:
case IrInstructionIdBitCast:
+ case IrInstructionIdGlobalAsm:
zig_unreachable();
case IrInstructionIdDeclVarGen: