Revert "[ABI] [C++20] [Modules] Don't generate vtable if the class is defined in other module unit"

Breaks check-clang on win and mac, see comments on https://reviews.llvm.org/D150023

This reverts commit d8a36b00d198fdc2ea866ea5da449628db07070f.

Also revert follow-up "[NFC] skip the test modules-vtable.cppm on windows"
This reverts commit baf0b12ca6c624b2a59aa6f2fd0310c72d35ac56.
This commit is contained in:
Nico Weber 2023-06-14 16:17:31 -07:00
parent 4cfc33b8b5
commit dbdd6372b7
2 changed files with 1 additions and 106 deletions

View File

@ -1172,16 +1172,9 @@ bool CodeGenVTables::isVTableExternal(const CXXRecordDecl *RD) {
if (!keyFunction)
return false;
const FunctionDecl *Def;
// Otherwise, if we don't have a definition of the key function, the
// vtable must be defined somewhere else.
if (!keyFunction->hasBody(Def))
return true;
assert(Def && "The body of the key function is not assigned to Def?");
// If the non-inline key function comes from another module unit, the vtable
// must be defined there.
return Def->isInAnotherModuleUnit() && !Def->isInlineSpecified();
return !keyFunction->hasBody();
}
/// Given that we're currently at the end of the translation unit, and

View File

@ -1,98 +0,0 @@
// REQUIRES: !system-windows
// RUN: rm -rf %t
// RUN: split-file %s %t
// RUN: cd %t
//
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-module-interface \
// RUN: %t/Mod.cppm -o %t/Mod.pcm
//
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 %t/Mod.pcm \
// RUN: -emit-llvm -o - | FileCheck %t/Mod.cppm
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fmodule-file=Mod=%t/Mod.pcm \
// RUN: %t/Use.cpp -emit-llvm -o - | FileCheck %t/Use.cpp
//
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-module-interface \
// RUN: %t/Mod.cppm -o %t/Mod.pcm -DKEY_FUNCTION_INLINE
//
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 %t/Mod.pcm \
// RUN: -emit-llvm -o - | FileCheck %t/Mod.cppm -check-prefix=CHECK-INLINE
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fmodule-file=Mod=%t/Mod.pcm \
// RUN: %t/Use.cpp -emit-llvm -o - | FileCheck %t/Use.cpp -check-prefix=CHECK-INLINE
//
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-module-interface \
// RUN: %t/M-A.cppm -o %t/M-A.pcm
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fmodule-file=M:A=%t/M-A.pcm \
// RUN: %t/M-B.cppm -emit-llvm -o - | FileCheck %t/M-B.cppm
//--- Mod.cppm
export module Mod;
export class Base {
public:
virtual ~Base();
};
#ifdef KEY_FUNCTION_INLINE
inline
#endif
Base::~Base() {}
// CHECK: @_ZTVW3Mod4Base = unnamed_addr constant
// CHECK: @_ZTSW3Mod4Base = constant
// CHECK: @_ZTIW3Mod4Base = constant
// CHECK-INLINE: @_ZTVW3Mod4Base = linkonce_odr unnamed_addr constant
// CHECK-INLINE: @_ZTSW3Mod4Base = linkonce_odr constant
// CHECK-INLINE: @_ZTIW3Mod4Base = linkonce_odr constant
module :private;
int private_use() {
Base base;
return 43;
}
//--- Use.cpp
import Mod;
int use() {
Base* base = new Base();
return 43;
}
// CHECK-NOT: @_ZTSW3Mod4Base = constant
// CHECK-NOT: @_ZTIW3Mod4Base = constant
// CHECK: @_ZTVW3Mod4Base = external unnamed_addr
// CHECK-INLINE: @_ZTVW3Mod4Base = linkonce_odr unnamed_addr constant
// CHECK-INLINE: @_ZTSW3Mod4Base = linkonce_odr constant
// CHECK-INLINE: @_ZTIW3Mod4Base = linkonce_odr constant
// Check the case that the declaration of the key function comes from another
// module unit but the definition of the key function comes from the current
// mdoule unit.
//--- M-A.cppm
export module M:A;
export class C {
public:
virtual ~C();
};
int a_use() {
C c;
return 43;
}
//--- M-B.cppm
export module M:B;
import :A;
C::~C() {}
int b_use() {
C c;
return 43;
}
// CHECK: @_ZTVW1M1C = unnamed_addr constant
// CHECK: @_ZTSW1M1C = constant
// CHECK: @_ZTIW1M1C = constant