diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-05-02 21:16:18 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-05-02 22:14:17 -0700 |
| commit | defda6202a5c9fd50f465b3a6a9728ba5d636a38 (patch) | |
| tree | b01179a2f3eaa544aaab15772e8d10957a7694cf /src/codegen/llvm.zig | |
| parent | 76b7f5672511be454a14b909446ed6464244c1e9 (diff) | |
| download | zig-defda6202a5c9fd50f465b3a6a9728ba5d636a38.tar.gz zig-defda6202a5c9fd50f465b3a6a9728ba5d636a38.zip | |
LLVM: insert workaround for aarch64-windows f16 CodeView crash
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 63e7eece99..d11a359bb6 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4577,6 +4577,10 @@ pub const FuncGen = struct { const operand_ty = self.air.typeOf(pl_op.operand); const name = self.air.nullTerminatedString(pl_op.payload); + if (needDbgVarWorkaround(self.dg, operand_ty)) { + return null; + } + const di_local_var = dib.createAutoVariable( self.di_scope.?, name.ptr, @@ -6147,6 +6151,10 @@ pub const FuncGen = struct { const inst_ty = self.air.typeOfIndex(inst); if (self.dg.object.di_builder) |dib| { + if (needDbgVarWorkaround(self.dg, inst_ty)) { + return arg_val; + } + const src_index = self.getSrcArgIndex(self.arg_index - 1); const func = self.dg.decl.getFunction().?; const lbrace_line = self.dg.module.declPtr(func.owner_decl).src_line + func.lbrace_line + 1; @@ -8248,3 +8256,15 @@ const AnnotatedDITypePtr = enum(usize) { }; const lt_errors_fn_name = "__zig_lt_errors_len"; + +/// Without this workaround, LLVM crashes with "unknown codeview register H1" +/// TODO use llvm-reduce and file upstream LLVM bug for this. +fn needDbgVarWorkaround(dg: *DeclGen, ty: Type) bool { + if (ty.tag() == .f16) { + const target = dg.module.getTarget(); + if (target.os.tag == .windows and target.cpu.arch == .aarch64) { + return true; + } + } + return false; +} |
