[compiler-rt] r277795 - CFI: add XFAIL test for a future optimization of two vcalls.

Ivan Krasin via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 4 18:45:55 PDT 2016


Author: krasin
Date: Thu Aug  4 20:45:54 2016
New Revision: 277795

URL: http://llvm.org/viewvc/llvm-project?rev=277795&view=rev
Log:
CFI: add XFAIL test for a future optimization of two vcalls.

Summary:
Often, a code will call multiple virtual methods of a given object.
If they go in a linear block, it should be possible to check vtable
before the first call, then store vtable pointer and reuse it for
the second vcall without any additional checks.

This is expected to have a positive performance impact on a hot
path in Blink, see https://crbug.com/634139.

Reviewers: kcc

Differential Revision: https://reviews.llvm.org/D23151

Added:
    compiler-rt/trunk/test/cfi/two-vcalls.cpp

Added: compiler-rt/trunk/test/cfi/two-vcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/cfi/two-vcalls.cpp?rev=277795&view=auto
==============================================================================
--- compiler-rt/trunk/test/cfi/two-vcalls.cpp (added)
+++ compiler-rt/trunk/test/cfi/two-vcalls.cpp Thu Aug  4 20:45:54 2016
@@ -0,0 +1,60 @@
+// RUN: %clangxx_cfi_diag -o %t %s
+// RUN: %t 2>&1 | FileCheck %s
+
+// This test checks that we don't generate two type checks,
+// if two virtual calls are in the same function.
+
+// UNSUPPORTED: win32
+// REQUIRES: cxxabi
+
+// TODO(krasin): implement the optimization to not emit two type checks.
+// XFAIL: *
+#include <stdio.h>
+
+class Base {
+ public:
+  virtual void Foo() {
+    fprintf(stderr, "Base::Foo\n");
+  }
+
+  virtual void Bar() {
+    fprintf(stderr, "Base::Bar\n");
+  }
+};
+
+class Derived : public Base {
+ public:
+  void Foo() override {
+    fprintf(stderr, "Derived::Foo\n");
+  }
+
+  void Bar() override {
+    printf("Derived::Bar\n");
+  }
+};
+
+__attribute__((noinline)) void print(Base* ptr) {
+  ptr->Foo();
+  // Corrupt the vtable pointer. We expect that the optimization will
+  // check vtable before the first vcall then store it in a local
+  // variable, and reuse it for the second vcall. With no optimization,
+  // CFI will complain about the virtual table being corrupted.
+  *reinterpret_cast<void**>(ptr) = 0;
+  ptr->Bar();
+}
+
+
+int main() {
+  Base b;
+  Derived d;
+  // CHECK: Base::Foo
+  // CHECK: Base::Bar
+  print(&b);
+
+  // CHECK: Derived::Foo
+  // CHECK-NOT: runtime error
+  // CHECK: Derived::Bar
+  print(&d);
+
+  return 0;
+}




More information about the llvm-commits mailing list