aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-05-02 21:16:18 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-05-02 22:14:17 -0700
commitdefda6202a5c9fd50f465b3a6a9728ba5d636a38 (patch)
treeb01179a2f3eaa544aaab15772e8d10957a7694cf /src/codegen/llvm.zig
parent76b7f5672511be454a14b909446ed6464244c1e9 (diff)
downloadzig-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.zig20
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;
+}