aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 124daf6a3e..99be090e8e 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -4095,18 +4095,28 @@ static TypeTableEntry *ir_analyze_instruction_asm(IrAnalyze *ira, IrInstructionA
AstNodeAsmExpr *asm_expr = &asm_instruction->base.source_node->data.asm_expr;
+ IrInstruction **input_list = allocate<IrInstruction *>(asm_expr->input_list.length);
+ IrInstruction **output_types = allocate<IrInstruction *>(asm_expr->output_list.length);
+
TypeTableEntry *return_type = ira->codegen->builtin_types.entry_void;
for (size_t i = 0; i < asm_expr->output_list.length; i += 1) {
AsmOutput *asm_output = asm_expr->output_list.at(i);
if (asm_output->return_type) {
- return_type = ir_resolve_type(ira, asm_instruction->output_types[i]);
+ output_types[i] = asm_instruction->output_types[i]->other;
+ return_type = ir_resolve_type(ira, output_types[i]);
if (return_type->id == TypeTableEntryIdInvalid)
return ira->codegen->builtin_types.entry_invalid;
}
}
- ir_build_asm_from(&ira->new_irb, &asm_instruction->base, asm_instruction->input_list,
- asm_instruction->output_types, asm_instruction->return_count, asm_instruction->has_side_effects);
+ for (size_t i = 0; i < asm_expr->input_list.length; i += 1) {
+ input_list[i] = asm_instruction->input_list[i]->other;
+ if (input_list[i]->type_entry->id == TypeTableEntryIdInvalid)
+ return ira->codegen->builtin_types.entry_invalid;
+ }
+
+ ir_build_asm_from(&ira->new_irb, &asm_instruction->base, input_list, output_types,
+ asm_instruction->return_count, asm_instruction->has_side_effects);
return return_type;
}