From bef140c0a2710f77a4ee0e432ce2dbecf690461c Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Thu, 12 Nov 2020 10:16:57 +0100 Subject: [PATCH] stage1: Add architecture-specific clobbers to asm() We're basically following Clang's lead, add the necessary clobbers to minimize the risk of generating wrong code. --- src/stage1/codegen.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp index ff6ab2b223..f7ec3f9c19 100644 --- a/src/stage1/codegen.cpp +++ b/src/stage1/codegen.cpp @@ -4838,6 +4838,29 @@ static LLVMValueRef ir_render_asm_gen(CodeGen *g, IrExecutableGen *executable, I } } + // Add some architecture-specific clobbers. + const char *arch_clobbers = nullptr; + switch (g->zig_target->arch) { + case ZigLLVM_x86: + case ZigLLVM_x86_64: + arch_clobbers = "~{dirflag},~{fpsr},~{flags}"; + break; + case ZigLLVM_mips: + case ZigLLVM_mipsel: + case ZigLLVM_mips64: + case ZigLLVM_mips64el: + arch_clobbers = "~{$1}"; + break; + default: + break; + } + + if (arch_clobbers != nullptr) { + if (buf_len(&constraint_buf)) + buf_append_char(&constraint_buf, ','); + buf_append_str(&constraint_buf, arch_clobbers); + } + LLVMTypeRef ret_type; if (instruction->return_count == 0) { ret_type = LLVMVoidType();