[PATCH] D52933: Fix incorrect Twine usage in CFGPrinter

Marcin Copik via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 5 06:01:36 PDT 2018


mcopik created this revision.
mcopik added a reviewer: grosser.
Herald added a subscriber: llvm-commits.

CFGPrinter (-view-cfg, -dot-cfg) invokes an undefined behaviour (dangling pointer to rvalue) on IR files with branch weights. This patch fixes the problem caused by Twine initialization and string conversion split into two statements.


Repository:
  rL LLVM

https://reviews.llvm.org/D52933

Files:
  include/llvm/Analysis/CFGPrinter.h
  test/Other/cfg-printer-branch-weights.ll


Index: test/Other/cfg-printer-branch-weights.ll
===================================================================
--- /dev/null
+++ test/Other/cfg-printer-branch-weights.ll
@@ -0,0 +1,19 @@
+;RUN: opt < %s -analyze -dot-cfg 2>/dev/null
+;RUN: FileCheck %s -input-file=cfg.f.dot
+
+define void @f(i32) {
+entry:
+  %check = icmp sgt i32 %0, 0
+  br i1 %check, label %if, label %exit, !prof !0
+
+; CHECK: label="W:1"
+; CHECK-NOT: ["];
+if:                     ; preds = %entry
+  br label %exit
+; CHECK: label="W:200"
+; CHECK-NOT: ["];
+exit:                   ; preds = %entry, %if
+  ret void
+}
+
+!0 = !{!"branch_weights", i32 1, i32 200}
Index: include/llvm/Analysis/CFGPrinter.h
===================================================================
--- include/llvm/Analysis/CFGPrinter.h
+++ include/llvm/Analysis/CFGPrinter.h
@@ -172,8 +172,8 @@
 
     // Prepend a 'W' to indicate that this is a weight rather than the actual
     // profile count (due to scaling).
-    Twine Attrs = "label=\"W:" + Twine(Weight->getZExtValue()) + "\"";
-    return Attrs.str();
+    // Evaluate in a single statement to avoid dangling pointers in a Twine.
+    return ("label=\"W:" + Twine(Weight->getZExtValue()) + "\"").str();
   }
 };
 } // End llvm namespace


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52933.168461.patch
Type: text/x-patch
Size: 1258 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181005/1eba8374/attachment.bin>


More information about the llvm-commits mailing list