[PATCH] D118412: Fix a fragment overflow problem when composing super-registers
Adrian Prantl via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 27 15:46:04 PST 2022
aprantl created this revision.
aprantl added reviewers: JDevlieghere, markus.
aprantl added a project: debug-info.
Herald added a subscriber: hiraditya.
aprantl requested review of this revision.
Herald added a project: LLVM.
Addresses https://github.com/llvm/llvm-project/issues/53342
https://reviews.llvm.org/D118412
Files:
llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
llvm/test/DebugInfo/MIR/AArch64/subreg-fragment-overflow.mir
Index: llvm/test/DebugInfo/MIR/AArch64/subreg-fragment-overflow.mir
===================================================================
--- /dev/null
+++ llvm/test/DebugInfo/MIR/AArch64/subreg-fragment-overflow.mir
@@ -0,0 +1,34 @@
+# RUN: llc -mtriple aarch64-linux-gnu -start-after=livedebugvalues -filetype=obj -o - %s \
+# RUN: | llvm-dwarfdump - | FileCheck %s
+# The value needs to be composed of sub-registers, but the
+# sub-registers cross the fragment boundary.
+# CHECK: DW_OP_piece 0x8, DW_OP_regx B16, DW_OP_piece 0x8
+--- |
+ target triple = "aarch64-none-linux-android21"
+ define linkonce_odr dso_local void @_f() !dbg !1590 {
+ entry:
+ ret void, !dbg !1809
+ }
+ declare i32 @__gxx_personality_v0(...)
+ !llvm.dbg.cu = !{!0}
+ !llvm.module.flags = !{!1586,!1587}
+ !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
+ !1 = !DIFile(filename: "bug.cpp", directory: "/")
+ !1586 = !{i32 2, !"Debug Info Version", i32 3}
+ !1587 = !{i32 7, !"frame-pointer", i32 1}
+ !1590 = distinct !DISubprogram(name: "f", scope: !0, file: !1, line: 278, type: !1591, scopeLine: 279, flags: DIFlagPrototyped, unit: !0, declaration: !1593)
+ !1591 = !DISubroutineType(types: !1592)
+ !1592 = !{null }
+ !1593 = !DISubprogram(name: "f", linkageName: "_f", scope: !0, file: !1, line: 195, type: !1591, scopeLine: 195, flags:
+ DIFlagProtected
+ , spFlags: DISPFlagOptimized)
+ !1694 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "uint8x8x3_t", file: !1, line: 235, size: 192, flags: DIFlagTypePassByValue, elements: !1695, identifier: "_ZTS11uint8x8x3_t")
+ !1695 = !{}
+ !1715 = !DILocalVariable(name: "__ret", scope: !1590, file: !1, line: 379, type: !1694)
+ !1809 = !DILocation(line: 0, scope: !1590 )
+---
+name: _f
+body: |
+ bb.0.entry:
+ renamable $d16_d17_d18 = LD3Threev8b killed renamable $x15, debug-location !1809
+ DBG_VALUE $d16_d17_d18, $noreg, !1715, !DIExpression(DW_OP_LLVM_fragment, 64, 64), debug-location !1809
Index: llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
===================================================================
--- llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
+++ llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
@@ -287,9 +287,17 @@
// expression representing a value, rather than a location.
if ((!isParameterValue() && !isMemoryLocation() && !HasComplexExpression) ||
isEntryValue()) {
+ auto FragmentInfo = ExprCursor.getFragmentInfo();
+ unsigned RegSize = 0;
for (auto &Reg : DwarfRegs) {
+ RegSize += Reg.SubRegSize;
if (Reg.DwarfRegNo >= 0)
addReg(Reg.DwarfRegNo, Reg.Comment);
+ if (FragmentInfo)
+ if (RegSize > FragmentInfo->SizeInBits)
+ // If the register is larger than the current fragment stop
+ // once the fragment is covered.
+ break;
addOpPiece(Reg.SubRegSize);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118412.403822.patch
Type: text/x-patch
Size: 2999 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220127/7caeef4e/attachment.bin>
More information about the llvm-commits
mailing list