[llvm] LoongArch: Register a null target streamer (PR #226497)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 25 06:48:14 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
Emitting a TLS variable's debug location calls into the target streamer,
which was only registered for asm and object output. -filetype=null
therefore null dereferenced.
Co-Authored-By: Claude Opus 5 <noreply@<!-- -->anthropic.com>
---
Full diff: https://github.com/llvm/llvm-project/pull/226497.diff
2 Files Affected:
- (modified) llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp (+6)
- (added) llvm/test/CodeGen/LoongArch/null-streamer.ll (+20)
``````````diff
diff --git a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp
index 741bc27eff386d..10b3ddafcbe9f8 100644
--- a/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp
+++ b/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCTargetDesc.cpp
@@ -93,6 +93,10 @@ createLoongArchAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS,
return new LoongArchTargetAsmStreamer(S, OS);
}
+static MCTargetStreamer *createLoongArchNullTargetStreamer(MCStreamer &S) {
+ return new LoongArchTargetStreamer(S);
+}
+
namespace {
class LoongArchMCInstrAnalysis : public MCInstrAnalysis {
@@ -301,5 +305,7 @@ LLVMInitializeLoongArchTargetMC() {
*T, createLoongArchObjectTargetStreamer);
TargetRegistry::RegisterAsmTargetStreamer(*T,
createLoongArchAsmTargetStreamer);
+ TargetRegistry::RegisterNullTargetStreamer(
+ *T, createLoongArchNullTargetStreamer);
}
}
diff --git a/llvm/test/CodeGen/LoongArch/null-streamer.ll b/llvm/test/CodeGen/LoongArch/null-streamer.ll
new file mode 100644
index 00000000000000..0a1d65af0c33b3
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/null-streamer.ll
@@ -0,0 +1,20 @@
+; Check the MCNullStreamer operates correctly. The TLS debug
+; expression below reaches the target streamer
+;
+; RUN: llc -O0 -mtriple=loongarch32 -filetype=null %s
+; RUN: llc -O0 -mtriple=loongarch64 -filetype=null %s
+
+ at x = thread_local global i32 5, align 4, !dbg !0
+
+!llvm.dbg.cu = !{!2}
+!llvm.module.flags = !{!7, !8}
+
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "x", scope: !2, file: !3, line: 1, type: !6, isLocal: false, isDefinition: true)
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)
+!3 = !DIFile(filename: "tls.c", directory: "/tmp")
+!4 = !{}
+!5 = !{!0}
+!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!7 = !{i32 2, !"Dwarf Version", i32 4}
+!8 = !{i32 2, !"Debug Info Version", i32 3}
``````````
</details>
https://github.com/llvm/llvm-project/pull/226497
More information about the llvm-commits
mailing list