https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/179631
Backport 90c632ab48748808e95d9bb8cd4f3028888dc1b0 Requested by: @nikic >From bc6c27ac7e7f3d84418ded3903775676818ce738 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Wed, 4 Feb 2026 10:21:07 +0100 Subject: [PATCH] [PowerPC] Only set QualName symbol on first section switch (#179253) We were setting it every time when switching to the section. This caused problems when the debug_aranges emission performed a switch at the end of the section, resulting in symbols incorrectly pointing to the end instead of the start of the function. (cherry picked from commit 90c632ab48748808e95d9bb8cd4f3028888dc1b0) --- llvm/lib/MC/MCXCOFFStreamer.cpp | 8 ++++-- .../test/CodeGen/PowerPC/aix-debug-aranges.ll | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/PowerPC/aix-debug-aranges.ll diff --git a/llvm/lib/MC/MCXCOFFStreamer.cpp b/llvm/lib/MC/MCXCOFFStreamer.cpp index 4bf14c11068cb..b459b26045ae7 100644 --- a/llvm/lib/MC/MCXCOFFStreamer.cpp +++ b/llvm/lib/MC/MCXCOFFStreamer.cpp @@ -45,8 +45,12 @@ void MCXCOFFStreamer::changeSection(MCSection *Section, uint32_t Subsection) { // sections because we don't have other cases that hit this problem yet. // if (IsDwarfSec || CsectProp->MappingClass == XCOFF::XMC_PR) // QualName->setFragment(F); - if (Sec->isDwarfSect() || Sec->getMappingClass() == XCOFF::XMC_PR) - Sec->getQualNameSymbol()->setFragment(CurFrag); + if (Sec->isDwarfSect() || Sec->getMappingClass() == XCOFF::XMC_PR) { + MCSymbol *QualNameSymbol = Sec->getQualNameSymbol(); + // Only set the fragment the first time we're switching to the section. + if (!QualNameSymbol->isInSection()) + QualNameSymbol->setFragment(CurFrag); + } } bool MCXCOFFStreamer::emitSymbolAttribute(MCSymbol *Sym, diff --git a/llvm/test/CodeGen/PowerPC/aix-debug-aranges.ll b/llvm/test/CodeGen/PowerPC/aix-debug-aranges.ll new file mode 100644 index 0000000000000..7b850b6f2a2d0 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-debug-aranges.ll @@ -0,0 +1,28 @@ +; RUN: llc -filetype=obj -function-sections -generate-arange-section < %s | \ +; RUN: llvm-objdump -dr - | FileCheck %s + +; Make sure that enabling debug_arange does not corrupt branches. + +target triple = "powerpc64-ibm-aix" + +define i64 @fn1() { +; CHECK-LABEL: <.fn1>: +; CHECK: bl {{.*}} <.fn2> +; CHECK-NEXT: R_RBR .fn2 + %1 = call i64 @fn2() + ret i64 %1 +} + +define i64 @fn2() !dbg !4 { + ret i64 0 +} + +!llvm.module.flags = !{!0} +!llvm.dbg.cu = !{!1} + +!0 = !{i32 2, !"Debug Info Version", i32 3} +!1 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !2, producer: "clang LLVM (rustc version 1.95.0-dev)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !3, globals: !3, splitDebugInlining: false, nameTableKind: None) +!2 = !DIFile(filename: "foo", directory: "") +!3 = !{} +!4 = distinct !DISubprogram(name: "fn2", file: !2, line: 277, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !1, templateParams: !3, retainedNodes: !3) +!5 = !DISubroutineType(types: !3) _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
