[llvm] r296839 - ThinLTOBitcodeWriter: Do not follow operand edges of type GlobalValue when looking for virtual functions.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 2 15:10:17 PST 2017


Author: pcc
Date: Thu Mar  2 17:10:17 2017
New Revision: 296839

URL: http://llvm.org/viewvc/llvm-project?rev=296839&view=rev
Log:
ThinLTOBitcodeWriter: Do not follow operand edges of type GlobalValue when looking for virtual functions.

Such edges may otherwise result in infinite recursion if a pointer to a vtable
is reachable from the vtable itself. This can happen in practice if a TU
defines the ABI types used to implement RTTI, and is itself compiled with RTTI.

Fixes PR32121.

Added:
    llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/circular-reference.ll
Modified:
    llvm/trunk/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp

Modified: llvm/trunk/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp?rev=296839&r1=296838&r2=296839&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp Thu Mar  2 17:10:17 2017
@@ -241,6 +241,8 @@ void filterModule(
 void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) {
   if (auto *F = dyn_cast<Function>(C))
     return Fn(F);
+  if (isa<GlobalValue>(C))
+    return;
   for (Value *Op : C->operands())
     forEachVirtualFunction(cast<Constant>(Op), Fn);
 }

Added: llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/circular-reference.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/circular-reference.ll?rev=296839&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/circular-reference.ll (added)
+++ llvm/trunk/test/Transforms/ThinLTOBitcodeWriter/circular-reference.ll Thu Mar  2 17:10:17 2017
@@ -0,0 +1,9 @@
+; RUN: opt -thinlto-bc -o %t %s
+; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s
+; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s
+
+; M0: @g = external constant
+; M1: @g = constant
+ at g = constant i8* bitcast (i8** @g to i8*), !type !0
+
+!0 = !{i32 0, !"typeid"}




More information about the llvm-commits mailing list