]> granicus.if.org Git - clang/commitdiff
CodeGen: Fix off-by-one error in CFI class identification function for MS ABI.
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 8 Jul 2015 21:08:08 +0000 (21:08 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 8 Jul 2015 21:08:08 +0000 (21:08 +0000)
We were previously ignoring classes laid out at offset zero.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241729 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MicrosoftCXXABI.cpp
test/CodeGenCXX/cfi-vcall.cpp

index d149df63c9e45e0b13a8db3b5485f62740cec747..8d8f70f199f27d7d70b9f838f95e4e8b14d66263 100644 (file)
@@ -1707,7 +1707,7 @@ static const CXXRecordDecl *getClassAtVTableLocation(ASTContext &Ctx,
   for (auto &&B : RD->bases()) {
     const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl();
     CharUnits BaseOffset = Layout.getBaseClassOffset(Base);
-    if (BaseOffset <= Offset && BaseOffset > MaxBaseOffset) {
+    if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) {
       MaxBase = Base;
       MaxBaseOffset = BaseOffset;
     }
@@ -1715,7 +1715,7 @@ static const CXXRecordDecl *getClassAtVTableLocation(ASTContext &Ctx,
   for (auto &&B : RD->vbases()) {
     const CXXRecordDecl *Base = B.getType()->getAsCXXRecordDecl();
     CharUnits BaseOffset = Layout.getVBaseClassOffset(Base);
-    if (BaseOffset <= Offset && BaseOffset > MaxBaseOffset) {
+    if (BaseOffset <= Offset && BaseOffset >= MaxBaseOffset) {
       MaxBase = Base;
       MaxBaseOffset = BaseOffset;
     }
index 333c7bd1f1604e4810d8025d8d8a5841671cf788..5cb5e02cf585084e644977a2e0b03a5c9dd38d9c 100644 (file)
@@ -134,6 +134,29 @@ void foo() {
   af(&fa);
 }
 
+namespace test2 {
+
+struct A {
+  virtual void m_fn1();
+};
+struct B {
+  virtual void m_fn2();
+};
+struct C : B, A {};
+struct D : C {
+  void m_fn1();
+};
+
+// ITANIUM: define void @_ZN5test21fEPNS_1DE
+// MS: define void @"\01?f@test2@@YAXPEAUD@1@@Z"
+void f(D *d) {
+  // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"N5test21DE")
+  // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"A@test2@@")
+  d->m_fn1();
+}
+
+}
+
 // Check for the expected number of elements (9 or 15 respectively).
 // MS: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){8}]]}
 // ITANIUM: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){14}]]}