zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit bef140c0a2710f77a4ee0e432ce2dbecf690461c (tree)
parent 1e1a490600346490fabb69f67964e1ef62ee5e5f
Author: LemonBoy <thatlemon@gmail.com>
Date:   Thu, 12 Nov 2020 10:16:57 +0100

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.

Diffstat:
Msrc/stage1/codegen.cpp | 23+++++++++++++++++++++++
1 file changed, 23 insertions(+), 0 deletions(-)

diff --git 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();