mirror of
https://github.com/intel/llvm.git
synced 2026-02-02 02:00:03 +08:00
Move CGCXXABI functions to CGCXXABI.cpp
llvm-svn: 120250
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
1A2A54C50FD1DD1C00F4CE45 /* Warnings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A2A54B40FD1DD1C00F4CE45 /* Warnings.cpp */; };
|
||||
1A30A9E90B93A4C800201A91 /* ExprCXX.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1A30A9E80B93A4C800201A91 /* ExprCXX.h */; };
|
||||
1A376A2D0D4AED9B002A1C52 /* CGExprConstant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A376A2C0D4AED9B002A1C52 /* CGExprConstant.cpp */; };
|
||||
1A3D2C4E12A2CD3D0088C44A /* CGCXXABI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A3D2C4D12A2CD3D0088C44A /* CGCXXABI.cpp */; };
|
||||
1A471AB50F437BC500753CE8 /* CGBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A471AB40F437BC500753CE8 /* CGBlocks.cpp */; };
|
||||
1A4C41BF105B4C0B0047B5E7 /* CGClass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A4C41BE105B4C0B0047B5E7 /* CGClass.cpp */; };
|
||||
1A5D5E580E5E81010023C059 /* CGCXX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5D5E570E5E81010023C059 /* CGCXX.cpp */; };
|
||||
@@ -447,6 +448,7 @@
|
||||
1A30A9E80B93A4C800201A91 /* ExprCXX.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = ExprCXX.h; path = clang/AST/ExprCXX.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1A31B27210ACE6DA009E0C8B /* GlobalDecl.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = GlobalDecl.h; path = lib/CodeGen/GlobalDecl.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1A376A2C0D4AED9B002A1C52 /* CGExprConstant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = CGExprConstant.cpp; path = lib/CodeGen/CGExprConstant.cpp; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1A3D2C4D12A2CD3D0088C44A /* CGCXXABI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CGCXXABI.cpp; path = lib/CodeGen/CGCXXABI.cpp; sourceTree = "<group>"; };
|
||||
1A471AB40F437BC500753CE8 /* CGBlocks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = CGBlocks.cpp; path = lib/CodeGen/CGBlocks.cpp; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1A4C41BE105B4C0B0047B5E7 /* CGClass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = CGClass.cpp; path = lib/CodeGen/CGClass.cpp; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1A535EDB107BC47B000C3AE7 /* CanonicalType.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = CanonicalType.h; path = clang/AST/CanonicalType.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||
@@ -1573,6 +1575,7 @@
|
||||
BF9FEE301225E86C003A8B71 /* CodeGenAction.cpp */,
|
||||
BF9FEE2F1225E854003A8B71 /* CGRecordLayout.h */,
|
||||
BF9FEE2E1225E82D003A8B71 /* CGException.h */,
|
||||
1A3D2C4D12A2CD3D0088C44A /* CGCXXABI.cpp */,
|
||||
BF9FEE2D1225E80F003A8B71 /* CGCXXABI.h */,
|
||||
BF9FEE2B1225E7EA003A8B71 /* BackendUtil.cpp */,
|
||||
1A2193CB0F45EEB700C0713D /* ABIInfo.h */,
|
||||
@@ -2402,6 +2405,7 @@
|
||||
1AC1AD431299A287006FBC77 /* UnreachableCodeChecker.cpp in Sources */,
|
||||
1AC1AD441299A287006FBC77 /* ValueManager.cpp in Sources */,
|
||||
1AC1AD451299A287006FBC77 /* VLASizeChecker.cpp in Sources */,
|
||||
1A3D2C4E12A2CD3D0088C44A /* CGCXXABI.cpp in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
||||
@@ -316,160 +316,3 @@ CodeGenFunction::BuildVirtualCall(const CXXDestructorDecl *DD, CXXDtorType Type,
|
||||
return ::BuildVirtualCall(*this, VTableIndex, This, Ty);
|
||||
}
|
||||
|
||||
/// Implementation for CGCXXABI. Possibly this should be moved into
|
||||
/// the incomplete ABI implementations?
|
||||
|
||||
void CGCXXABI::_anchor() {}
|
||||
|
||||
static void ErrorUnsupportedABI(CodeGenFunction &CGF,
|
||||
llvm::StringRef S) {
|
||||
Diagnostic &Diags = CGF.CGM.getDiags();
|
||||
unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
|
||||
"cannot yet compile %1 in this ABI");
|
||||
Diags.Report(CGF.getContext().getFullLoc(CGF.CurCodeDecl->getLocation()),
|
||||
DiagID)
|
||||
<< S;
|
||||
}
|
||||
|
||||
static llvm::Constant *GetBogusMemberPointer(CodeGenModule &CGM,
|
||||
QualType T) {
|
||||
return llvm::Constant::getNullValue(CGM.getTypes().ConvertType(T));
|
||||
}
|
||||
|
||||
const llvm::Type *
|
||||
CGCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
|
||||
return CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
|
||||
llvm::Value *&This,
|
||||
llvm::Value *MemPtr,
|
||||
const MemberPointerType *MPT) {
|
||||
ErrorUnsupportedABI(CGF, "calls through member pointers");
|
||||
|
||||
const FunctionProtoType *FPT =
|
||||
MPT->getPointeeType()->getAs<FunctionProtoType>();
|
||||
const CXXRecordDecl *RD =
|
||||
cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
|
||||
const llvm::FunctionType *FTy =
|
||||
CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT),
|
||||
FPT->isVariadic());
|
||||
return llvm::Constant::getNullValue(FTy->getPointerTo());
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF,
|
||||
llvm::Value *Base,
|
||||
llvm::Value *MemPtr,
|
||||
const MemberPointerType *MPT) {
|
||||
ErrorUnsupportedABI(CGF, "loads of member pointers");
|
||||
const llvm::Type *Ty = CGF.ConvertType(MPT->getPointeeType())->getPointerTo();
|
||||
return llvm::Constant::getNullValue(Ty);
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
|
||||
const CastExpr *E,
|
||||
llvm::Value *Src) {
|
||||
ErrorUnsupportedABI(CGF, "member function pointer conversions");
|
||||
return GetBogusMemberPointer(CGM, E->getType());
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CGCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
|
||||
llvm::Value *L,
|
||||
llvm::Value *R,
|
||||
const MemberPointerType *MPT,
|
||||
bool Inequality) {
|
||||
ErrorUnsupportedABI(CGF, "member function pointer comparison");
|
||||
return CGF.Builder.getFalse();
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CGCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
|
||||
llvm::Value *MemPtr,
|
||||
const MemberPointerType *MPT) {
|
||||
ErrorUnsupportedABI(CGF, "member function pointer null testing");
|
||||
return CGF.Builder.getFalse();
|
||||
}
|
||||
|
||||
llvm::Constant *
|
||||
CGCXXABI::EmitMemberPointerConversion(llvm::Constant *C, const CastExpr *E) {
|
||||
return GetBogusMemberPointer(CGM, E->getType());
|
||||
}
|
||||
|
||||
llvm::Constant *
|
||||
CGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
|
||||
return GetBogusMemberPointer(CGM, QualType(MPT, 0));
|
||||
}
|
||||
|
||||
llvm::Constant *CGCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
|
||||
return GetBogusMemberPointer(CGM,
|
||||
CGM.getContext().getMemberPointerType(MD->getType(),
|
||||
MD->getParent()->getTypeForDecl()));
|
||||
}
|
||||
|
||||
llvm::Constant *CGCXXABI::EmitMemberPointer(const FieldDecl *FD) {
|
||||
return GetBogusMemberPointer(CGM,
|
||||
CGM.getContext().getMemberPointerType(FD->getType(),
|
||||
FD->getParent()->getTypeForDecl()));
|
||||
}
|
||||
|
||||
bool CGCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
|
||||
// Fake answer.
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGCXXABI::BuildThisParam(CodeGenFunction &CGF, FunctionArgList &Params) {
|
||||
const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
|
||||
|
||||
// FIXME: I'm not entirely sure I like using a fake decl just for code
|
||||
// generation. Maybe we can come up with a better way?
|
||||
ImplicitParamDecl *ThisDecl
|
||||
= ImplicitParamDecl::Create(CGM.getContext(), 0, MD->getLocation(),
|
||||
&CGM.getContext().Idents.get("this"),
|
||||
MD->getThisType(CGM.getContext()));
|
||||
Params.push_back(std::make_pair(ThisDecl, ThisDecl->getType()));
|
||||
getThisDecl(CGF) = ThisDecl;
|
||||
}
|
||||
|
||||
void CGCXXABI::EmitThisParam(CodeGenFunction &CGF) {
|
||||
/// Initialize the 'this' slot.
|
||||
assert(getThisDecl(CGF) && "no 'this' variable for function");
|
||||
getThisValue(CGF)
|
||||
= CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(getThisDecl(CGF)),
|
||||
"this");
|
||||
}
|
||||
|
||||
void CGCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
|
||||
RValue RV, QualType ResultType) {
|
||||
CGF.EmitReturnOfRValue(RV, ResultType);
|
||||
}
|
||||
|
||||
CharUnits CGCXXABI::GetArrayCookieSize(QualType ElementType) {
|
||||
return CharUnits::Zero();
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
|
||||
llvm::Value *NewPtr,
|
||||
llvm::Value *NumElements,
|
||||
QualType ElementType) {
|
||||
// Should never be called.
|
||||
ErrorUnsupportedABI(CGF, "array cookie initialization");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CGCXXABI::ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr,
|
||||
QualType ElementType, llvm::Value *&NumElements,
|
||||
llvm::Value *&AllocPtr, CharUnits &CookieSize) {
|
||||
ErrorUnsupportedABI(CGF, "array cookie reading");
|
||||
|
||||
// This should be enough to avoid assertions.
|
||||
NumElements = 0;
|
||||
AllocPtr = llvm::Constant::getNullValue(CGF.Builder.getInt8PtrTy());
|
||||
CookieSize = CharUnits::Zero();
|
||||
}
|
||||
|
||||
void CGCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
|
||||
const VarDecl &D,
|
||||
llvm::GlobalVariable *GV) {
|
||||
ErrorUnsupportedABI(CGF, "static local variable initialization");
|
||||
}
|
||||
|
||||
@@ -15,4 +15,159 @@
|
||||
#include "CGCXXABI.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace CodeGen;
|
||||
|
||||
void CGCXXABI::_anchor() {}
|
||||
|
||||
static void ErrorUnsupportedABI(CodeGenFunction &CGF,
|
||||
llvm::StringRef S) {
|
||||
Diagnostic &Diags = CGF.CGM.getDiags();
|
||||
unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
|
||||
"cannot yet compile %1 in this ABI");
|
||||
Diags.Report(CGF.getContext().getFullLoc(CGF.CurCodeDecl->getLocation()),
|
||||
DiagID)
|
||||
<< S;
|
||||
}
|
||||
|
||||
static llvm::Constant *GetBogusMemberPointer(CodeGenModule &CGM,
|
||||
QualType T) {
|
||||
return llvm::Constant::getNullValue(CGM.getTypes().ConvertType(T));
|
||||
}
|
||||
|
||||
const llvm::Type *
|
||||
CGCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
|
||||
return CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
|
||||
llvm::Value *&This,
|
||||
llvm::Value *MemPtr,
|
||||
const MemberPointerType *MPT) {
|
||||
ErrorUnsupportedABI(CGF, "calls through member pointers");
|
||||
|
||||
const FunctionProtoType *FPT =
|
||||
MPT->getPointeeType()->getAs<FunctionProtoType>();
|
||||
const CXXRecordDecl *RD =
|
||||
cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
|
||||
const llvm::FunctionType *FTy =
|
||||
CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT),
|
||||
FPT->isVariadic());
|
||||
return llvm::Constant::getNullValue(FTy->getPointerTo());
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF,
|
||||
llvm::Value *Base,
|
||||
llvm::Value *MemPtr,
|
||||
const MemberPointerType *MPT) {
|
||||
ErrorUnsupportedABI(CGF, "loads of member pointers");
|
||||
const llvm::Type *Ty = CGF.ConvertType(MPT->getPointeeType())->getPointerTo();
|
||||
return llvm::Constant::getNullValue(Ty);
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
|
||||
const CastExpr *E,
|
||||
llvm::Value *Src) {
|
||||
ErrorUnsupportedABI(CGF, "member function pointer conversions");
|
||||
return GetBogusMemberPointer(CGM, E->getType());
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CGCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
|
||||
llvm::Value *L,
|
||||
llvm::Value *R,
|
||||
const MemberPointerType *MPT,
|
||||
bool Inequality) {
|
||||
ErrorUnsupportedABI(CGF, "member function pointer comparison");
|
||||
return CGF.Builder.getFalse();
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CGCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
|
||||
llvm::Value *MemPtr,
|
||||
const MemberPointerType *MPT) {
|
||||
ErrorUnsupportedABI(CGF, "member function pointer null testing");
|
||||
return CGF.Builder.getFalse();
|
||||
}
|
||||
|
||||
llvm::Constant *
|
||||
CGCXXABI::EmitMemberPointerConversion(llvm::Constant *C, const CastExpr *E) {
|
||||
return GetBogusMemberPointer(CGM, E->getType());
|
||||
}
|
||||
|
||||
llvm::Constant *
|
||||
CGCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
|
||||
return GetBogusMemberPointer(CGM, QualType(MPT, 0));
|
||||
}
|
||||
|
||||
llvm::Constant *CGCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
|
||||
return GetBogusMemberPointer(CGM,
|
||||
CGM.getContext().getMemberPointerType(MD->getType(),
|
||||
MD->getParent()->getTypeForDecl()));
|
||||
}
|
||||
|
||||
llvm::Constant *CGCXXABI::EmitMemberPointer(const FieldDecl *FD) {
|
||||
return GetBogusMemberPointer(CGM,
|
||||
CGM.getContext().getMemberPointerType(FD->getType(),
|
||||
FD->getParent()->getTypeForDecl()));
|
||||
}
|
||||
|
||||
bool CGCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
|
||||
// Fake answer.
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGCXXABI::BuildThisParam(CodeGenFunction &CGF, FunctionArgList &Params) {
|
||||
const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
|
||||
|
||||
// FIXME: I'm not entirely sure I like using a fake decl just for code
|
||||
// generation. Maybe we can come up with a better way?
|
||||
ImplicitParamDecl *ThisDecl
|
||||
= ImplicitParamDecl::Create(CGM.getContext(), 0, MD->getLocation(),
|
||||
&CGM.getContext().Idents.get("this"),
|
||||
MD->getThisType(CGM.getContext()));
|
||||
Params.push_back(std::make_pair(ThisDecl, ThisDecl->getType()));
|
||||
getThisDecl(CGF) = ThisDecl;
|
||||
}
|
||||
|
||||
void CGCXXABI::EmitThisParam(CodeGenFunction &CGF) {
|
||||
/// Initialize the 'this' slot.
|
||||
assert(getThisDecl(CGF) && "no 'this' variable for function");
|
||||
getThisValue(CGF)
|
||||
= CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(getThisDecl(CGF)),
|
||||
"this");
|
||||
}
|
||||
|
||||
void CGCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF,
|
||||
RValue RV, QualType ResultType) {
|
||||
CGF.EmitReturnOfRValue(RV, ResultType);
|
||||
}
|
||||
|
||||
CharUnits CGCXXABI::GetArrayCookieSize(QualType ElementType) {
|
||||
return CharUnits::Zero();
|
||||
}
|
||||
|
||||
llvm::Value *CGCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
|
||||
llvm::Value *NewPtr,
|
||||
llvm::Value *NumElements,
|
||||
QualType ElementType) {
|
||||
// Should never be called.
|
||||
ErrorUnsupportedABI(CGF, "array cookie initialization");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CGCXXABI::ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr,
|
||||
QualType ElementType, llvm::Value *&NumElements,
|
||||
llvm::Value *&AllocPtr, CharUnits &CookieSize) {
|
||||
ErrorUnsupportedABI(CGF, "array cookie reading");
|
||||
|
||||
// This should be enough to avoid assertions.
|
||||
NumElements = 0;
|
||||
AllocPtr = llvm::Constant::getNullValue(CGF.Builder.getInt8PtrTy());
|
||||
CookieSize = CharUnits::Zero();
|
||||
}
|
||||
|
||||
void CGCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
|
||||
const VarDecl &D,
|
||||
llvm::GlobalVariable *GV) {
|
||||
ErrorUnsupportedABI(CGF, "static local variable initialization");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user