[llvm] [IR] Fix range-based for loop over MDOperands bug (PR #80737)

Shubham Sandeep Rastogi via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 5 12:11:14 PST 2024


https://github.com/rastogishubham created https://github.com/llvm/llvm-project/pull/80737

With e8512786fedbfa6ddba70ceddc29d7122173ba5e the for loop that iterates over MDNode operands was changed to a range-based for loop. This change surfaces a bug where if the result of MD->operands() is an ArrayRef that has a size of 0, then iterating over that ArrayRef leads to a segmentation fault, due to accessing invalid addresses. This patch fixes that issue.

@kazutakahirata Please let me know if this patch works.

>From f257a3b14165c44bdab03c92056a0b7a2219fab2 Mon Sep 17 00:00:00 2001
From: Shubham Sandeep Rastogi <srastogi22 at apple.com>
Date: Mon, 5 Feb 2024 12:04:59 -0800
Subject: [PATCH] [IR] Fix range-based for loop over MDOperands bug

With e8512786fedbfa6ddba70ceddc29d7122173ba5e the for loop that iterates
over MDNode operands was changed to a range-based for loop. This change
surfaces a bug where if the result of MD->operands() is an ArrayRef that
has a size of 0, then iterating over that ArrayRef leads to a
segmentation fault, due to accessing invalid addresses. This patch fixes
that issue.
---
 llvm/lib/IR/Verifier.cpp                      |  8 +++--
 .../DebugInfo/verify-dwarf-no-operands.ll     | 29 +++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)
 create mode 100644 llvm/test/DebugInfo/verify-dwarf-no-operands.ll

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 8d992c232ca7c..54da5b299f1c9 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -2912,9 +2912,11 @@ void Verifier::visitFunction(const Function &F) {
     for (auto &I : BB) {
       VisitDebugLoc(I, I.getDebugLoc().getAsMDNode());
       // The llvm.loop annotations also contain two DILocations.
-      if (auto MD = I.getMetadata(LLVMContext::MD_loop))
-        for (const MDOperand &MDO : llvm::drop_begin(MD->operands()))
-          VisitDebugLoc(I, dyn_cast_or_null<MDNode>(MDO));
+      if (auto MD = I.getMetadata(LLVMContext::MD_loop)) {
+        if (MD->getNumOperands())
+          for (const MDOperand &MDO : llvm::drop_begin(MD->operands()))
+            VisitDebugLoc(I, dyn_cast_or_null<MDNode>(MDO));
+      }
       if (BrokenDebugInfo)
         return;
     }
diff --git a/llvm/test/DebugInfo/verify-dwarf-no-operands.ll b/llvm/test/DebugInfo/verify-dwarf-no-operands.ll
new file mode 100644
index 0000000000000..c655289e9ee61
--- /dev/null
+++ b/llvm/test/DebugInfo/verify-dwarf-no-operands.ll
@@ -0,0 +1,29 @@
+%"class.llvm::StringRef" = type { ptr, i64 }
+define internal void @_ZL30tokenizeWindowsCommandLineImplN4llvm9StringRefERNS_11StringSaverENS_12function_refIFvS0_EEEbNS3_IFvvEEEb() #0 !dbg !12 {
+  %7 = alloca %"class.llvm::StringRef", align 8
+  %21 = call noundef i64 @_ZNK4llvm9StringRef4sizeEv(ptr noundef nonnull align 8 dereferenceable(16) %7), !dbg !264
+  br label %22, !dbg !265
+  br label %22, !llvm.loop !284
+}
+define linkonce_odr noundef i64 @_ZNK4llvm9StringRef4sizeEv() #0 align 2 !dbg !340 {
+  %2 = alloca ptr, align 8
+  %3 = load ptr, ptr %2, align 8
+  %4 = getelementptr inbounds %"class.llvm::StringRef", ptr %3, !dbg !344
+  %5 = load i64, ptr %4, !dbg !344
+  ret i64 %5, !dbg !345
+}
+!llvm.module.flags = !{!2, !6}
+!llvm.dbg.cu = !{!7}
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!6 = !{i32 7, !"frame-pointer", i32 1}
+!7 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !8, sdk: "MacOSX14.0.sdk")
+!8 = !DIFile(filename: "file.cpp", directory: "/Users/Dev", checksumkind: CSK_MD5, checksum: "ed7ae158f20f7914bc5fb843291e80da")
+!12 = distinct !DISubprogram(unit: !7, retainedNodes: !36)
+!36 = !{}
+!260 = distinct !DILexicalBlock(scope: !12, line: 412, column: 3)
+!264 = !DILocation(scope: !260)
+!265 = !DILocation(scope: !260, column: 20)
+!284 = distinct !{}
+!340 = distinct !DISubprogram(unit: !7, retainedNodes: !36)
+!344 = !DILocation(scope: !340)
+!345 = !DILocation(scope: !340)



More information about the llvm-commits mailing list