[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