diff options
| -rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/cfi-speculative-vtable.cpp | 14 | 
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 8b6322a4b75..e2106342922 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -1496,7 +1496,8 @@ void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,        DC->getParent()->isTranslationUnit())      EmitFundamentalRTTIDescriptors(); -  CGM.EmitVTableBitSetEntries(VTable, VTLayout); +  if (!VTable->isDeclarationForLinker()) +    CGM.EmitVTableBitSetEntries(VTable, VTLayout);  }  bool ItaniumCXXABI::isVirtualOffsetNeededForVTableField( diff --git a/clang/test/CodeGenCXX/cfi-speculative-vtable.cpp b/clang/test/CodeGenCXX/cfi-speculative-vtable.cpp new file mode 100644 index 00000000000..490190c4afd --- /dev/null +++ b/clang/test/CodeGenCXX/cfi-speculative-vtable.cpp @@ -0,0 +1,14 @@ +// Test that we don't emit a bit set entry for a speculative (available_externally) vtable. +// This does not happen in the Microsoft ABI. +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck  %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -O1 -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -fsanitize-cfi-cross-dso -emit-llvm -o - %s | FileCheck  %s + +class A { + public: +  virtual ~A(); +}; + +A a; + +// CHECK: @_ZTV1A ={{.*}} available_externally +// CHECK-NOT: !{{.*}} = !{!{{.*}}, [4 x i8*]* @_ZTV1A, i64 16}  | 

