mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Revert 124768.
This reopens PR99114, but that one at least can be avoided with an #include. PR9130 cannot. llvm-svn: 124780
This commit is contained in:
@@ -227,8 +227,7 @@ CodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D,
|
||||
const llvm::FunctionType *FTy =
|
||||
getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type),
|
||||
FPT->isVariadic());
|
||||
return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, GD,
|
||||
/*ForVTable=*/false));
|
||||
return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, GD));
|
||||
}
|
||||
|
||||
void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
|
||||
@@ -285,8 +284,7 @@ CodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D,
|
||||
const llvm::FunctionType *FTy =
|
||||
getTypes().GetFunctionType(getTypes().getFunctionInfo(D, Type), false);
|
||||
|
||||
return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, GD,
|
||||
/*ForVTable=*/false));
|
||||
return cast<llvm::Function>(GetOrCreateLLVMFunction(Name, FTy, GD));
|
||||
}
|
||||
|
||||
static llvm::Value *BuildVirtualCall(CodeGenFunction &CGF, uint64_t VTableIndex,
|
||||
|
||||
@@ -2463,7 +2463,7 @@ llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
|
||||
getCXXABI().getMangleContext().mangleThunk(MD, Thunk, Name);
|
||||
|
||||
const llvm::Type *Ty = getTypes().GetFunctionTypeForVTable(GD);
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GD, /*ForVTable=*/false);
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GD);
|
||||
}
|
||||
|
||||
static llvm::Value *PerformTypeAdjustment(CodeGenFunction &CGF,
|
||||
@@ -2918,7 +2918,7 @@ CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD,
|
||||
} else {
|
||||
const llvm::Type *Ty = CGM.getTypes().GetFunctionTypeForVTable(GD);
|
||||
|
||||
Init = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
|
||||
Init = CGM.GetAddrOfFunction(GD, Ty);
|
||||
}
|
||||
|
||||
Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy);
|
||||
|
||||
@@ -650,8 +650,7 @@ llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
|
||||
|
||||
llvm::Constant *Aliasee;
|
||||
if (isa<llvm::FunctionType>(DeclTy))
|
||||
Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GlobalDecl(),
|
||||
/*ForVTable=*/false);
|
||||
Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GlobalDecl());
|
||||
else
|
||||
Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
|
||||
llvm::PointerType::getUnqual(DeclTy), 0);
|
||||
@@ -783,7 +782,7 @@ void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {
|
||||
llvm::Constant *
|
||||
CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
||||
const llvm::Type *Ty,
|
||||
GlobalDecl D, bool ForVTable) {
|
||||
GlobalDecl D) {
|
||||
// Lookup the entry, lazily creating it if necessary.
|
||||
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
|
||||
if (Entry) {
|
||||
@@ -841,11 +840,7 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
||||
// - special member functions with implicit definitions
|
||||
// If we ever change our AST traversal to walk into class methods,
|
||||
// this will be unnecessary.
|
||||
//
|
||||
// We also don't emit a definition for a function if it's going to be an entry
|
||||
// in a vtable, unless it's already marked as used.
|
||||
} else if (getLangOptions().CPlusPlus && D.getDecl() &&
|
||||
!(ForVTable && !D.getDecl()->isUsed())) {
|
||||
} else if (getLangOptions().CPlusPlus && D.getDecl()) {
|
||||
// Look for a declaration that's lexically in a record.
|
||||
const FunctionDecl *FD = cast<FunctionDecl>(D.getDecl());
|
||||
do {
|
||||
@@ -877,14 +872,13 @@ CodeGenModule::GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
||||
/// non-null, then this function will use the specified type if it has to
|
||||
/// create it (this occurs when we see a definition of the function).
|
||||
llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
|
||||
const llvm::Type *Ty,
|
||||
bool ForVTable) {
|
||||
const llvm::Type *Ty) {
|
||||
// If there was no specific requested type, just convert it now.
|
||||
if (!Ty)
|
||||
Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType());
|
||||
|
||||
llvm::StringRef MangledName = getMangledName(GD);
|
||||
return GetOrCreateLLVMFunction(MangledName, Ty, GD, ForVTable);
|
||||
return GetOrCreateLLVMFunction(MangledName, Ty, GD);
|
||||
}
|
||||
|
||||
/// CreateRuntimeFunction - Create a new runtime function with the specified
|
||||
@@ -892,7 +886,7 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
|
||||
llvm::Constant *
|
||||
CodeGenModule::CreateRuntimeFunction(const llvm::FunctionType *FTy,
|
||||
llvm::StringRef Name) {
|
||||
return GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false);
|
||||
return GetOrCreateLLVMFunction(Name, FTy, GlobalDecl());
|
||||
}
|
||||
|
||||
static bool DeclIsConstantGlobal(ASTContext &Context, const VarDecl *D) {
|
||||
@@ -1451,8 +1445,7 @@ void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) {
|
||||
// if a deferred decl.
|
||||
llvm::Constant *Aliasee;
|
||||
if (isa<llvm::FunctionType>(DeclTy))
|
||||
Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GlobalDecl(),
|
||||
/*ForVTable=*/false);
|
||||
Aliasee = GetOrCreateLLVMFunction(AA->getAliasee(), DeclTy, GlobalDecl());
|
||||
else
|
||||
Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
|
||||
llvm::PointerType::getUnqual(DeclTy), 0);
|
||||
@@ -1518,7 +1511,7 @@ llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
|
||||
const llvm::FunctionType *Ty =
|
||||
cast<llvm::FunctionType>(getTypes().ConvertType(FD->getType()));
|
||||
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GlobalDecl(FD), /*ForVTable=*/false);
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GlobalDecl(FD));
|
||||
}
|
||||
|
||||
llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys,
|
||||
|
||||
@@ -317,8 +317,7 @@ public:
|
||||
/// non-null, then this function will use the specified type if it has to
|
||||
/// create it.
|
||||
llvm::Constant *GetAddrOfFunction(GlobalDecl GD,
|
||||
const llvm::Type *Ty = 0,
|
||||
bool ForVTable = false);
|
||||
const llvm::Type *Ty = 0);
|
||||
|
||||
/// GetAddrOfRTTIDescriptor - Get the address of the RTTI descriptor
|
||||
/// for the given type.
|
||||
@@ -542,8 +541,7 @@ private:
|
||||
|
||||
llvm::Constant *GetOrCreateLLVMFunction(llvm::StringRef MangledName,
|
||||
const llvm::Type *Ty,
|
||||
GlobalDecl D,
|
||||
bool ForVTable);
|
||||
GlobalDecl D);
|
||||
llvm::Constant *GetOrCreateLLVMGlobal(llvm::StringRef MangledName,
|
||||
const llvm::PointerType *PTy,
|
||||
const VarDecl *D,
|
||||
|
||||
@@ -7118,6 +7118,13 @@ bool Sema::DefineUsedVTables() {
|
||||
switch (KeyFunction->getTemplateSpecializationKind()) {
|
||||
case TSK_Undeclared:
|
||||
case TSK_ExplicitSpecialization:
|
||||
// The key function is in another translation unit. Mark all of the
|
||||
// virtual members of this class as referenced so that we can build a
|
||||
// vtable anyway (in order to do devirtualization when optimizations
|
||||
// are turned on for example.
|
||||
MarkVirtualMembersReferenced(Loc, Class);
|
||||
continue;
|
||||
|
||||
case TSK_ExplicitInstantiationDeclaration:
|
||||
// The key function is in another translation unit.
|
||||
continue;
|
||||
|
||||
@@ -53,51 +53,3 @@ namespace Test2 {
|
||||
|
||||
void A::f() { }
|
||||
}
|
||||
|
||||
// Test that we don't assert on this test.
|
||||
namespace Test3 {
|
||||
|
||||
struct A {
|
||||
virtual void f();
|
||||
virtual ~A() { }
|
||||
};
|
||||
|
||||
struct B : A {
|
||||
B();
|
||||
virtual void f();
|
||||
};
|
||||
|
||||
B::B() { }
|
||||
|
||||
void g(A* a) {
|
||||
a->f();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
// PR9114, test that we don't try to emit a definition of
|
||||
namespace Test4 {
|
||||
|
||||
template <class T> struct RefPtr {
|
||||
T* p;
|
||||
~RefPtr() {
|
||||
p->deref();
|
||||
}
|
||||
};
|
||||
|
||||
struct A {
|
||||
virtual ~A();
|
||||
};
|
||||
|
||||
struct Node;
|
||||
|
||||
struct B : A {
|
||||
virtual void deref();
|
||||
RefPtr<Node> m;
|
||||
};
|
||||
|
||||
void f() {
|
||||
RefPtr<B> b;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user