[llvm] [MC] Fix line table assertion failure after inline asm error (PR #228742)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 3 10:59:00 PDT 2026


https://github.com/MaskRay updated https://github.com/llvm/llvm-project/pull/228742

>From a8242199cd7210727205b466ea504859a87257e4 Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sat, 3 Oct 2026 09:32:37 -0700
Subject: [PATCH] [MC] Fix line table assertion failure after inline asm error

An inline asm `.file 3 "b"` without files 1 and 2 is diagnosed as
"unassigned file number", but code generation continues, and
MCObjectStreamer::finishImpl emits the line table with empty file
entries, which asserts.

Fix #228061: Set MCContext::HadError for errors reported through
MCContext::diagnose, and skip line table emission when an error has been
reported.
---
 llvm/lib/MC/MCContext.cpp                     |  2 ++
 llvm/lib/MC/MCObjectStreamer.cpp              |  7 ++++--
 .../DebugInfo/X86/inline-asm-file-error.ll    | 23 +++++++++++++++++++
 .../riscv-lmul-instrument-no-data-is-err.s    |  2 +-
 .../riscv-sew-instrument-no-data-is-err.s     |  2 +-
 .../SiFiveX280/unknown-instrument-is-err.s    |  2 +-
 .../RISCV/SiFiveX280/unknown-lmul-is-err.s    |  2 +-
 .../RISCV/SiFiveX280/unknown-sew-is-err.s     |  2 +-
 8 files changed, 35 insertions(+), 7 deletions(-)
 create mode 100644 llvm/test/DebugInfo/X86/inline-asm-file-error.ll

diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index cea521debe71a1..935b0888bf6939 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -1081,6 +1081,8 @@ CodeViewContext &MCContext::getCVContext() {
 
 void MCContext::diagnose(const SMDiagnostic &SMD) {
   assert(DiagHandler && "MCContext::DiagHandler is not set");
+  if (SMD.getKind() == SourceMgr::DK_Error)
+    HadError = true;
   bool UseInlineSrcMgr = false;
   const SourceMgr *SMP = nullptr;
   if (SrcMgr) {
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index 7a64fbbd667129..8fb2d7bc90c524 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -807,8 +807,11 @@ void MCObjectStreamer::finishImpl() {
   if (getContext().getGenDwarfForAssembly())
     MCGenDwarfInfo::Emit(this);
 
-  // Dump out the dwarf file & directory tables and line tables.
-  MCDwarfLineTable::emit(this, getAssembler().getDWARFLinetableParams());
+  // Dump out the dwarf file & directory tables and line tables. Suppress in
+  // case of errors (e.g. an unassigned file number in inline asm may leave hole
+  // in the file table).
+  if (!getContext().hadError())
+    MCDwarfLineTable::emit(this, getAssembler().getDWARFLinetableParams());
 
   // Emit pseudo probes for the current module.
   MCPseudoProbeTable::emit(this);
diff --git a/llvm/test/DebugInfo/X86/inline-asm-file-error.ll b/llvm/test/DebugInfo/X86/inline-asm-file-error.ll
new file mode 100644
index 00000000000000..5e73184a9684a7
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/inline-asm-file-error.ll
@@ -0,0 +1,23 @@
+;; An unassigned file number leaves a hole in the file table. Don't emit the
+;; line table after the error.
+; RUN: not llc -mtriple=x86_64 -filetype=obj %s -o /dev/null 2>&1 | FileCheck %s
+
+; CHECK: warning: inconsistent use of MD5 checksums
+; CHECK: error: unassigned file number: 1 for .file directives
+; CHECK: error: unassigned file number: 2 for .file directives
+
+define void @f() !dbg !4 {
+  call void asm sideeffect ".file 3 \22b\22", ""(), !dbg !5
+  ret void, !dbg !5
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2, !3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, emissionKind: FullDebug)
+!1 = !DIFile(filename: "a.c", directory: "/tmp", checksumkind: CSK_MD5, checksum: "00000000000000000000000000000000")
+!2 = !{i32 7, !"Dwarf Version", i32 5}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !6, spFlags: DISPFlagDefinition, unit: !0)
+!5 = !DILocation(line: 1, scope: !4)
+!6 = !DISubroutineType(types: !{})
diff --git a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-lmul-instrument-no-data-is-err.s b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-lmul-instrument-no-data-is-err.s
index ac5b0f8ead0a2d..b12f6d634e435b 100644
--- a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-lmul-instrument-no-data-is-err.s
+++ b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-lmul-instrument-no-data-is-err.s
@@ -7,4 +7,4 @@ vadd.vv v12, v12, v12
 # CHECK: error: Failed to create RISCV-LMUL instrument with no data
 # CHECK: # LLVM-MCA-RISCV-LMUL
 # CHECK:  ^
-# CHECK: error: There was an error parsing comments.
+# CHECK: error: Assembly input parsing had errors
diff --git a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-sew-instrument-no-data-is-err.s b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-sew-instrument-no-data-is-err.s
index 7076f9202e132c..1a2fed2372877d 100644
--- a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-sew-instrument-no-data-is-err.s
+++ b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/riscv-sew-instrument-no-data-is-err.s
@@ -7,4 +7,4 @@ vdiv.vv v8, v8, v12
 # CHECK: error: Failed to create RISCV-SEW instrument with no data
 # CHECK: # LLVM-MCA-RISCV-SEW
 # CHECK:  ^
-# CHECK: error: There was an error parsing comments.
+# CHECK: error: Assembly input parsing had errors
diff --git a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-instrument-is-err.s b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-instrument-is-err.s
index 90675462d4740d..44ea854471c4a2 100644
--- a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-instrument-is-err.s
+++ b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-instrument-is-err.s
@@ -7,4 +7,4 @@ vadd.vv v12, v12, v12
 # CHECK: error: Unknown instrumentation type in LLVM-MCA comment: UNKNOWN
 # CHECK: # LLVM-MCA-UNKNOWN M1
 # CHECK:  ^
-# CHECK:  error: There was an error parsing comments.
+# CHECK:  error: Assembly input parsing had errors
diff --git a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-lmul-is-err.s b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-lmul-is-err.s
index 3a996e9431b4be..612b87e9b39cf5 100644
--- a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-lmul-is-err.s
+++ b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-lmul-is-err.s
@@ -7,4 +7,4 @@ vadd.vv v12, v12, v12
 # CHECK: error: Failed to create RISCV-LMUL instrument with data: MF9
 # CHECK: # LLVM-MCA-RISCV-LMUL MF9
 # CHECK:  ^
-# CHECK:  error: There was an error parsing comments.
+# CHECK:  error: Assembly input parsing had errors
diff --git a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-sew-is-err.s b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-sew-is-err.s
index 0a75eb46af4553..2748e4b8c6910c 100644
--- a/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-sew-is-err.s
+++ b/llvm/test/tools/llvm-mca/RISCV/SiFiveX280/unknown-sew-is-err.s
@@ -7,4 +7,4 @@ vdiv.vv v8, v8, v12
 # CHECK: error: Failed to create RISCV-SEW instrument with data: E99
 # CHECK: # LLVM-MCA-RISCV-SEW E99
 # CHECK:  ^
-# CHECK:  error: There was an error parsing comments.
+# CHECK:  error: Assembly input parsing had errors



More information about the llvm-commits mailing list