From cf390658222b7fe7b6d7fc6ff5aece2d145d4c00 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Wed, 25 Feb 2015 00:18:22 +0000 Subject: [PATCH] Revert r230314, "Fix codegen for virtual methods that are (re-) exported from multiple modules." It crashes for targeting (i686|x86_64)-win32. clang: clang/lib/AST/VTableBuilder.cpp:142: {anonymous}::FinalOverriders::OverriderInfo {anonymous}::FinalOverriders::getOverrider(const clang::CXXMethodDecl*, clang::CharUnits) const: Assertion `OverridersMap.count(std::make_pair(MD, BaseOffset)) && "Did not find overrider!"' failed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@230406 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/VTableBuilder.cpp | 6 +---- test/Modules/Inputs/merge-vtable-codegen/a.h | 8 ------- test/Modules/Inputs/merge-vtable-codegen/b.h | 17 ------------- test/Modules/Inputs/merge-vtable-codegen/c.h | 6 ----- .../merge-vtable-codegen.modulemap | 11 --------- test/Modules/merge-vtable-codegen.cpp | 24 ------------------- 6 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 test/Modules/Inputs/merge-vtable-codegen/a.h delete mode 100644 test/Modules/Inputs/merge-vtable-codegen/b.h delete mode 100644 test/Modules/Inputs/merge-vtable-codegen/c.h delete mode 100644 test/Modules/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap delete mode 100644 test/Modules/merge-vtable-codegen.cpp diff --git a/lib/AST/VTableBuilder.cpp b/lib/AST/VTableBuilder.cpp index c0777e08c9..ddb1f057ac 100644 --- a/lib/AST/VTableBuilder.cpp +++ b/lib/AST/VTableBuilder.cpp @@ -411,8 +411,7 @@ void FinalOverriders::dump(raw_ostream &Out, BaseSubobject Base, for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; - MD = MD->getCanonicalDecl(); - + OverriderInfo Overrider = getOverrider(MD, Base.getBaseOffset()); Out << " "; @@ -696,7 +695,6 @@ void VCallAndVBaseOffsetBuilder::AddVCallOffsets(BaseSubobject Base, for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; - MD = MD->getCanonicalDecl(); CharUnits OffsetOffset = getCurrentOffsetOffset(); @@ -1516,7 +1514,6 @@ void ItaniumVTableBuilder::AddMethods( for (const auto *MD : RD->methods()) { if (!MD->isVirtual()) continue; - MD = MD->getCanonicalDecl(); // Get the final overrider. FinalOverriders::OverriderInfo Overrider = @@ -2199,7 +2196,6 @@ void ItaniumVTableBuilder::dumpLayout(raw_ostream &Out) { // We only want virtual member functions. if (!MD->isVirtual()) continue; - MD = MD->getCanonicalDecl(); std::string MethodName = PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual, diff --git a/test/Modules/Inputs/merge-vtable-codegen/a.h b/test/Modules/Inputs/merge-vtable-codegen/a.h deleted file mode 100644 index c2885379aa..0000000000 --- a/test/Modules/Inputs/merge-vtable-codegen/a.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef A_H -#define A_H - -struct A { - virtual void x(); -}; - -#endif diff --git a/test/Modules/Inputs/merge-vtable-codegen/b.h b/test/Modules/Inputs/merge-vtable-codegen/b.h deleted file mode 100644 index 770e46077f..0000000000 --- a/test/Modules/Inputs/merge-vtable-codegen/b.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef B_H -#define B_H - -#include "a.h" - -class B : virtual public A { - virtual void x() {} -}; - -void b(A* p) { - p->x(); - // Instantiating a class that virtually inherits 'A' - // triggers calculation of the vtable offsets in 'A'. - B b; -} - -#endif diff --git a/test/Modules/Inputs/merge-vtable-codegen/c.h b/test/Modules/Inputs/merge-vtable-codegen/c.h deleted file mode 100644 index 40cbbb047c..0000000000 --- a/test/Modules/Inputs/merge-vtable-codegen/c.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef C_H -#define C_H - -#include "a.h" - -#endif diff --git a/test/Modules/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap b/test/Modules/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap deleted file mode 100644 index 1edaa07101..0000000000 --- a/test/Modules/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap +++ /dev/null @@ -1,11 +0,0 @@ -module "a" { - textual header "a.h" -} - -module "b" { - header "b.h" -} - -module "c" { - header "c.h" -} diff --git a/test/Modules/merge-vtable-codegen.cpp b/test/Modules/merge-vtable-codegen.cpp deleted file mode 100644 index 7372073891..0000000000 --- a/test/Modules/merge-vtable-codegen.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// RUN: rm -rf %t - -// First, build two modules that both re-export the same header. -// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-name=b -o %t/b.pcm -fmodule-maps \ -// RUN: -emit-module %S/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap \ -// RUN: -I %S/Inputs/merge-vtable-codegen -// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-name=c -o %t/c.pcm -fmodule-maps \ -// RUN: -emit-module %S/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap \ -// RUN: -I %S/Inputs/merge-vtable-codegen - -// Use the two modules in a single compile. -// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodule-file=%t/b.pcm -fmodule-file=%t/c.pcm \ -// RUN: -fmodule-map-file=%S/Inputs/merge-vtable-codegen/merge-vtable-codegen.modulemap \ -// RUN: -emit-llvm -o %t/test.o %s - -// Note that order is important: -// Module 'c' just reexports A, while module 'b' defines a method that uses a -// virtual method of A. -#include "Inputs/merge-vtable-codegen/c.h" -#include "Inputs/merge-vtable-codegen/b.h" - -void t() { - b(nullptr); -} -- 2.40.0