mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-25 13:05:04 +00:00
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:
parent
4cfc33b8b5
commit
dbdd6372b7
@ -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
|
||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user