Use the correct function info for constructors when applying function attributes. Fixes PR6245.
llvm-svn: 95474
This commit is contained in:
parent
0a741b7258
commit
6710c5351e
|
@ -167,6 +167,19 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const ObjCMethodDecl *MD) {
|
|||
/*NoReturn*/ false);
|
||||
}
|
||||
|
||||
const CGFunctionInfo &CodeGenTypes::getFunctionInfo(GlobalDecl GD) {
|
||||
// FIXME: Do we need to handle ObjCMethodDecl?
|
||||
const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
|
||||
|
||||
if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
|
||||
return getFunctionInfo(CD, GD.getCtorType());
|
||||
|
||||
if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD))
|
||||
return getFunctionInfo(DD, GD.getDtorType());
|
||||
|
||||
return getFunctionInfo(FD);
|
||||
}
|
||||
|
||||
const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
|
||||
const CallArgList &Args,
|
||||
CallingConv CC,
|
||||
|
|
|
@ -409,11 +409,13 @@ void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
|
|||
SetCommonAttributes(D, F);
|
||||
}
|
||||
|
||||
void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
|
||||
void CodeGenModule::SetFunctionAttributes(GlobalDecl GD,
|
||||
llvm::Function *F,
|
||||
bool IsIncompleteFunction) {
|
||||
const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
|
||||
|
||||
if (!IsIncompleteFunction)
|
||||
SetLLVMFunctionAttributes(FD, getTypes().getFunctionInfo(FD), F);
|
||||
SetLLVMFunctionAttributes(FD, getTypes().getFunctionInfo(GD), F);
|
||||
|
||||
// Only a few attributes are set on declarations; these may later be
|
||||
// overridden by a definition.
|
||||
|
@ -732,8 +734,7 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(const char *MangledName,
|
|||
"", &getModule());
|
||||
F->setName(MangledName);
|
||||
if (D.getDecl())
|
||||
SetFunctionAttributes(cast<FunctionDecl>(D.getDecl()), F,
|
||||
IsIncompleteFunction);
|
||||
SetFunctionAttributes(D, F, IsIncompleteFunction);
|
||||
Entry = F;
|
||||
|
||||
// This is the first use or definition of a mangled name. If there is a
|
||||
|
|
|
@ -451,7 +451,7 @@ private:
|
|||
|
||||
/// SetFunctionAttributes - Set function attributes for a function
|
||||
/// declaration.
|
||||
void SetFunctionAttributes(const FunctionDecl *FD,
|
||||
void SetFunctionAttributes(GlobalDecl GD,
|
||||
llvm::Function *F,
|
||||
bool IsIncompleteFunction);
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include <vector>
|
||||
|
||||
#include "CGCall.h"
|
||||
#include "CGCXX.h"
|
||||
#include "GlobalDecl.h"
|
||||
|
||||
namespace llvm {
|
||||
class FunctionType;
|
||||
|
@ -190,6 +190,8 @@ private:
|
|||
|
||||
public:
|
||||
/// getFunctionInfo - Get the function info for the specified function decl.
|
||||
const CGFunctionInfo &getFunctionInfo(GlobalDecl GD);
|
||||
|
||||
const CGFunctionInfo &getFunctionInfo(const FunctionDecl *FD);
|
||||
const CGFunctionInfo &getFunctionInfo(const CXXMethodDecl *MD);
|
||||
const CGFunctionInfo &getFunctionInfo(const ObjCMethodDecl *MD);
|
||||
|
|
|
@ -15,6 +15,10 @@
|
|||
#ifndef CLANG_CODEGEN_GLOBALDECL_H
|
||||
#define CLANG_CODEGEN_GLOBALDECL_H
|
||||
|
||||
#include "CGCXX.h"
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
#include "clang/AST/DeclObjC.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
namespace CodeGen {
|
||||
|
|
|
@ -15,3 +15,11 @@ struct B : virtual A {
|
|||
// CHECK: define void @_ZN1BC1Ev(%struct.B* %this)
|
||||
// CHECK: define void @_ZN1BC2Ev(%struct.B* %this, i8** %vtt)
|
||||
B::B() { }
|
||||
|
||||
struct C : virtual A {
|
||||
C(bool);
|
||||
};
|
||||
|
||||
// CHECK: define void @_ZN1CC1Eb(%struct.B* %this, i1 zeroext)
|
||||
// CHECK: define void @_ZN1CC2Eb(%struct.B* %this, i8** %vtt, i1 zeroext)
|
||||
C::C(bool) { }
|
||||
|
|
Loading…
Reference in New Issue