forked from OSchip/llvm-project
parent
53a52215b5
commit
ae86c19e68
|
@ -501,7 +501,7 @@ BlockModule::GetAddrOfGlobalBlock(const BlockExpr *BE, const char * n) {
|
||||||
llvm::Constant *DescriptorFields[2];
|
llvm::Constant *DescriptorFields[2];
|
||||||
|
|
||||||
// Reserved
|
// Reserved
|
||||||
DescriptorFields[0] = llvm::Constant::getNullValue(UnsignedLongTy);
|
DescriptorFields[0] = getModule().getContext().getNullValue(UnsignedLongTy);
|
||||||
|
|
||||||
// Block literal size. For global blocks we just use the size of the generic
|
// Block literal size. For global blocks we just use the size of the generic
|
||||||
// block literal struct.
|
// block literal struct.
|
||||||
|
@ -542,7 +542,7 @@ BlockModule::GetAddrOfGlobalBlock(const BlockExpr *BE, const char * n) {
|
||||||
llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL | BLOCK_HAS_DESCRIPTOR);
|
llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL | BLOCK_HAS_DESCRIPTOR);
|
||||||
|
|
||||||
// Reserved
|
// Reserved
|
||||||
LiteralFields[2] = llvm::Constant::getNullValue(IntTy);
|
LiteralFields[2] = getModule().getContext().getNullValue(IntTy);
|
||||||
|
|
||||||
// Function
|
// Function
|
||||||
LiteralFields[3] = Fn;
|
LiteralFields[3] = Fn;
|
||||||
|
|
|
@ -103,7 +103,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
||||||
|
|
||||||
Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
|
Value *NegOp = Builder.CreateNeg(ArgValue, "neg");
|
||||||
Value *CmpResult =
|
Value *CmpResult =
|
||||||
Builder.CreateICmpSGE(ArgValue, Constant::getNullValue(ArgValue->getType()),
|
Builder.CreateICmpSGE(ArgValue,
|
||||||
|
getLLVMContext().getNullValue(ArgValue->getType()),
|
||||||
"abscond");
|
"abscond");
|
||||||
Value *Result =
|
Value *Result =
|
||||||
Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
|
Builder.CreateSelect(CmpResult, ArgValue, NegOp, "abs");
|
||||||
|
@ -150,7 +151,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
||||||
const llvm::Type *ResultType = ConvertType(E->getType());
|
const llvm::Type *ResultType = ConvertType(E->getType());
|
||||||
Value *Tmp = Builder.CreateAdd(Builder.CreateCall(F, ArgValue, "tmp"),
|
Value *Tmp = Builder.CreateAdd(Builder.CreateCall(F, ArgValue, "tmp"),
|
||||||
ConstantInt::get(ArgType, 1), "tmp");
|
ConstantInt::get(ArgType, 1), "tmp");
|
||||||
Value *Zero = llvm::Constant::getNullValue(ArgType);
|
Value *Zero = getLLVMContext().getNullValue(ArgType);
|
||||||
Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
|
Value *IsZero = Builder.CreateICmpEQ(ArgValue, Zero, "iszero");
|
||||||
Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
|
Value *Result = Builder.CreateSelect(IsZero, Zero, Tmp, "ffs");
|
||||||
if (Result->getType() != ResultType)
|
if (Result->getType() != ResultType)
|
||||||
|
@ -505,7 +506,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
||||||
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
Value *Ptr = EmitScalarExpr(E->getArg(0));
|
||||||
const llvm::Type *ElTy =
|
const llvm::Type *ElTy =
|
||||||
cast<llvm::PointerType>(Ptr->getType())->getElementType();
|
cast<llvm::PointerType>(Ptr->getType())->getElementType();
|
||||||
Builder.CreateStore(llvm::Constant::getNullValue(ElTy), Ptr, true);
|
Builder.CreateStore(getLLVMContext().getNullValue(ElTy), Ptr, true);
|
||||||
return RValue::get(0);
|
return RValue::get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ CodeGenFunction::GenerateStaticCXXBlockVarDeclInit(const VarDecl &D,
|
||||||
llvm::GlobalValue *GuardV =
|
llvm::GlobalValue *GuardV =
|
||||||
new llvm::GlobalVariable(CGM.getModule(), llvm::Type::Int64Ty, false,
|
new llvm::GlobalVariable(CGM.getModule(), llvm::Type::Int64Ty, false,
|
||||||
GV->getLinkage(),
|
GV->getLinkage(),
|
||||||
llvm::Constant::getNullValue(llvm::Type::Int64Ty),
|
getLLVMContext().getNullValue(llvm::Type::Int64Ty),
|
||||||
GuardVName.c_str());
|
GuardVName.c_str());
|
||||||
|
|
||||||
// Load the first byte of the guard variable.
|
// Load the first byte of the guard variable.
|
||||||
|
@ -49,7 +49,7 @@ CodeGenFunction::GenerateStaticCXXBlockVarDeclInit(const VarDecl &D,
|
||||||
"tmp");
|
"tmp");
|
||||||
|
|
||||||
// Compare it against 0.
|
// Compare it against 0.
|
||||||
llvm::Value *nullValue = llvm::Constant::getNullValue(llvm::Type::Int8Ty);
|
llvm::Value *nullValue = getLLVMContext().getNullValue(llvm::Type::Int8Ty);
|
||||||
llvm::Value *ICmp = Builder.CreateICmpEQ(V, nullValue , "tobool");
|
llvm::Value *ICmp = Builder.CreateICmpEQ(V, nullValue , "tobool");
|
||||||
|
|
||||||
llvm::BasicBlock *InitBlock = createBasicBlock("init");
|
llvm::BasicBlock *InitBlock = createBasicBlock("init");
|
||||||
|
@ -267,7 +267,7 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||||
|
|
||||||
llvm::Value *IsNull =
|
llvm::Value *IsNull =
|
||||||
Builder.CreateICmpEQ(NewPtr,
|
Builder.CreateICmpEQ(NewPtr,
|
||||||
llvm::Constant::getNullValue(NewPtr->getType()),
|
getLLVMContext().getNullValue(NewPtr->getType()),
|
||||||
"isnull");
|
"isnull");
|
||||||
|
|
||||||
Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
|
Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
|
||||||
|
@ -308,7 +308,7 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||||
llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
|
llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
|
||||||
PHI->reserveOperandSpace(2);
|
PHI->reserveOperandSpace(2);
|
||||||
PHI->addIncoming(NewPtr, NewNotNull);
|
PHI->addIncoming(NewPtr, NewNotNull);
|
||||||
PHI->addIncoming(llvm::Constant::getNullValue(NewPtr->getType()), NewNull);
|
PHI->addIncoming(getLLVMContext().getNullValue(NewPtr->getType()), NewNull);
|
||||||
|
|
||||||
NewPtr = PHI;
|
NewPtr = PHI;
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ CodeGenFunction::CreateStaticBlockVarDecl(const VarDecl &D,
|
||||||
const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
|
const llvm::Type *LTy = CGM.getTypes().ConvertTypeForMem(Ty);
|
||||||
return new llvm::GlobalVariable(CGM.getModule(), LTy,
|
return new llvm::GlobalVariable(CGM.getModule(), LTy,
|
||||||
Ty.isConstant(getContext()), Linkage,
|
Ty.isConstant(getContext()), Linkage,
|
||||||
llvm::Constant::getNullValue(LTy), Name,
|
getLLVMContext().getNullValue(LTy), Name,
|
||||||
0, D.isThreadSpecified(),
|
0, D.isThreadSpecified(),
|
||||||
Ty.getAddressSpace());
|
Ty.getAddressSpace());
|
||||||
}
|
}
|
||||||
|
|
|
@ -360,7 +360,7 @@ void AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV) {
|
||||||
void AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) {
|
void AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) {
|
||||||
if (!CGF.hasAggregateLLVMType(T)) {
|
if (!CGF.hasAggregateLLVMType(T)) {
|
||||||
// For non-aggregates, we can store zero
|
// For non-aggregates, we can store zero
|
||||||
llvm::Value *Null = llvm::Constant::getNullValue(CGF.ConvertType(T));
|
llvm::Value *Null = CGF.getLLVMContext().getNullValue(CGF.ConvertType(T));
|
||||||
CGF.EmitStoreThroughLValue(RValue::get(Null), LV, T);
|
CGF.EmitStoreThroughLValue(RValue::get(Null), LV, T);
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, just memset the whole thing to zero. This is legal
|
// Otherwise, just memset the whole thing to zero. This is legal
|
||||||
|
|
|
@ -181,13 +181,15 @@ public:
|
||||||
ComplexPairTy VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
|
ComplexPairTy VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
|
||||||
assert(E->getType()->isAnyComplexType() && "Expected complex type!");
|
assert(E->getType()->isAnyComplexType() && "Expected complex type!");
|
||||||
QualType Elem = E->getType()->getAsComplexType()->getElementType();
|
QualType Elem = E->getType()->getAsComplexType()->getElementType();
|
||||||
llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
|
llvm::Constant *Null =
|
||||||
|
CGF.getLLVMContext().getNullValue(CGF.ConvertType(Elem));
|
||||||
return ComplexPairTy(Null, Null);
|
return ComplexPairTy(Null, Null);
|
||||||
}
|
}
|
||||||
ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
|
ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
|
||||||
assert(E->getType()->isAnyComplexType() && "Expected complex type!");
|
assert(E->getType()->isAnyComplexType() && "Expected complex type!");
|
||||||
QualType Elem = E->getType()->getAsComplexType()->getElementType();
|
QualType Elem = E->getType()->getAsComplexType()->getElementType();
|
||||||
llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
|
llvm::Constant *Null =
|
||||||
|
CGF.getLLVMContext().getNullValue(CGF.ConvertType(Elem));
|
||||||
return ComplexPairTy(Null, Null);
|
return ComplexPairTy(Null, Null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +314,8 @@ ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
|
||||||
ComplexPairTy ComplexExprEmitter::
|
ComplexPairTy ComplexExprEmitter::
|
||||||
VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
|
VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
|
||||||
llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
|
llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
|
||||||
return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
|
return
|
||||||
|
ComplexPairTy(CGF.getLLVMContext().getNullValue(Imag->getType()), Imag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -359,7 +362,7 @@ ComplexPairTy ComplexExprEmitter::EmitCast(Expr *Op, QualType DestTy) {
|
||||||
Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
|
Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
|
||||||
|
|
||||||
// Return (realval, 0).
|
// Return (realval, 0).
|
||||||
return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
|
return ComplexPairTy(Elt, CGF.getLLVMContext().getNullValue(Elt->getType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ComplexPairTy ComplexExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
|
ComplexPairTy ComplexExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
|
||||||
|
@ -694,7 +697,7 @@ ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
|
||||||
// Empty init list intializes to null
|
// Empty init list intializes to null
|
||||||
QualType Ty = E->getType()->getAsComplexType()->getElementType();
|
QualType Ty = E->getType()->getAsComplexType()->getElementType();
|
||||||
const llvm::Type* LTy = CGF.ConvertType(Ty);
|
const llvm::Type* LTy = CGF.ConvertType(Ty);
|
||||||
llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
|
llvm::Value* zeroConstant = CGF.getLLVMContext().getNullValue(LTy);
|
||||||
return ComplexPairTy(zeroConstant, zeroConstant);
|
return ComplexPairTy(zeroConstant, zeroConstant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ public:
|
||||||
// Initialize remaining array elements.
|
// Initialize remaining array elements.
|
||||||
// FIXME: This doesn't handle member pointers correctly!
|
// FIXME: This doesn't handle member pointers correctly!
|
||||||
for (; i < NumElements; ++i)
|
for (; i < NumElements; ++i)
|
||||||
Elts.push_back(llvm::Constant::getNullValue(ElemTy));
|
Elts.push_back(CGM.getLLVMContext().getNullValue(ElemTy));
|
||||||
|
|
||||||
if (RewriteType) {
|
if (RewriteType) {
|
||||||
// FIXME: Try to avoid packing the array
|
// FIXME: Try to avoid packing the array
|
||||||
|
@ -193,7 +193,7 @@ public:
|
||||||
// FIXME: This doesn't handle member pointers correctly!
|
// FIXME: This doesn't handle member pointers correctly!
|
||||||
for (unsigned i = 0; i < SType->getNumElements(); ++i) {
|
for (unsigned i = 0; i < SType->getNumElements(); ++i) {
|
||||||
const llvm::Type *FieldTy = SType->getElementType(i);
|
const llvm::Type *FieldTy = SType->getElementType(i);
|
||||||
Elts.push_back(llvm::Constant::getNullValue(FieldTy));
|
Elts.push_back(CGM.getLLVMContext().getNullValue(FieldTy));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy initializer elements. Skip padding fields.
|
// Copy initializer elements. Skip padding fields.
|
||||||
|
@ -242,7 +242,7 @@ public:
|
||||||
unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType());
|
unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType());
|
||||||
unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty);
|
unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty);
|
||||||
while (CurSize < TotalSize) {
|
while (CurSize < TotalSize) {
|
||||||
Elts.push_back(llvm::Constant::getNullValue(llvm::Type::Int8Ty));
|
Elts.push_back(CGM.getLLVMContext().getNullValue(llvm::Type::Int8Ty));
|
||||||
Types.push_back(llvm::Type::Int8Ty);
|
Types.push_back(llvm::Type::Int8Ty);
|
||||||
CurSize++;
|
CurSize++;
|
||||||
}
|
}
|
||||||
|
@ -268,13 +268,14 @@ public:
|
||||||
Field != FieldEnd; ++Field)
|
Field != FieldEnd; ++Field)
|
||||||
assert(Field->isUnnamedBitfield() && "Only unnamed bitfields allowed");
|
assert(Field->isUnnamedBitfield() && "Only unnamed bitfields allowed");
|
||||||
#endif
|
#endif
|
||||||
return llvm::Constant::getNullValue(Ty);
|
return CGM.getLLVMContext().getNullValue(Ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curField->isBitField()) {
|
if (curField->isBitField()) {
|
||||||
// Create a dummy struct for bit-field insertion
|
// Create a dummy struct for bit-field insertion
|
||||||
unsigned NumElts = CGM.getTargetData().getTypeAllocSize(Ty);
|
unsigned NumElts = CGM.getTargetData().getTypeAllocSize(Ty);
|
||||||
llvm::Constant* NV = llvm::Constant::getNullValue(llvm::Type::Int8Ty);
|
llvm::Constant* NV =
|
||||||
|
CGM.getLLVMContext().getNullValue(llvm::Type::Int8Ty);
|
||||||
std::vector<llvm::Constant*> Elts(NumElts, NV);
|
std::vector<llvm::Constant*> Elts(NumElts, NV);
|
||||||
|
|
||||||
InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(0));
|
InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(0));
|
||||||
|
@ -314,7 +315,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; i < NumElements; ++i)
|
for (; i < NumElements; ++i)
|
||||||
Elts.push_back(llvm::Constant::getNullValue(ElemTy));
|
Elts.push_back(CGM.getLLVMContext().getNullValue(ElemTy));
|
||||||
|
|
||||||
return llvm::ConstantVector::get(VType, Elts);
|
return llvm::ConstantVector::get(VType, Elts);
|
||||||
}
|
}
|
||||||
|
@ -582,5 +583,5 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
|
||||||
llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
|
llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
|
||||||
// Always return an LLVM null constant for now; this will change when we
|
// Always return an LLVM null constant for now; this will change when we
|
||||||
// get support for IRGen of member pointers.
|
// get support for IRGen of member pointers.
|
||||||
return llvm::Constant::getNullValue(getTypes().ConvertType(T));
|
return getLLVMContext().getNullValue(getTypes().ConvertType(T));
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,10 +119,10 @@ public:
|
||||||
return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
|
return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue());
|
||||||
}
|
}
|
||||||
Value *VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
|
Value *VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) {
|
||||||
return llvm::Constant::getNullValue(ConvertType(E->getType()));
|
return CGF.getLLVMContext().getNullValue(ConvertType(E->getType()));
|
||||||
}
|
}
|
||||||
Value *VisitGNUNullExpr(const GNUNullExpr *E) {
|
Value *VisitGNUNullExpr(const GNUNullExpr *E) {
|
||||||
return llvm::Constant::getNullValue(ConvertType(E->getType()));
|
return CGF.getLLVMContext().getNullValue(ConvertType(E->getType()));
|
||||||
}
|
}
|
||||||
Value *VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
|
Value *VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) {
|
||||||
return llvm::ConstantInt::get(ConvertType(E->getType()),
|
return llvm::ConstantInt::get(ConvertType(E->getType()),
|
||||||
|
@ -211,7 +211,7 @@ public:
|
||||||
// Emit remaining default initializers
|
// Emit remaining default initializers
|
||||||
for (/* Do not initialize i*/; i < NumVectorElements; ++i) {
|
for (/* Do not initialize i*/; i < NumVectorElements; ++i) {
|
||||||
Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i);
|
Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i);
|
||||||
llvm::Value *NewV = llvm::Constant::getNullValue(ElementType);
|
llvm::Value *NewV = CGF.getLLVMContext().getNullValue(ElementType);
|
||||||
V = Builder.CreateInsertElement(V, NewV, Idx);
|
V = Builder.CreateInsertElement(V, NewV, Idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
|
Value *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) {
|
||||||
return llvm::Constant::getNullValue(ConvertType(E->getType()));
|
return CGF.getLLVMContext().getNullValue(ConvertType(E->getType()));
|
||||||
}
|
}
|
||||||
Value *VisitImplicitCastExpr(const ImplicitCastExpr *E);
|
Value *VisitImplicitCastExpr(const ImplicitCastExpr *E);
|
||||||
Value *VisitCastExpr(const CastExpr *E) {
|
Value *VisitCastExpr(const CastExpr *E) {
|
||||||
|
@ -385,7 +385,7 @@ Value *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) {
|
||||||
|
|
||||||
if (SrcType->isRealFloatingType()) {
|
if (SrcType->isRealFloatingType()) {
|
||||||
// Compare against 0.0 for fp scalars.
|
// Compare against 0.0 for fp scalars.
|
||||||
llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
|
llvm::Value *Zero = CGF.getLLVMContext().getNullValue(Src->getType());
|
||||||
return Builder.CreateFCmpUNE(Src, Zero, "tobool");
|
return Builder.CreateFCmpUNE(Src, Zero, "tobool");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ Value *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compare against an integer or pointer null.
|
// Compare against an integer or pointer null.
|
||||||
llvm::Value *Zero = llvm::Constant::getNullValue(Src->getType());
|
llvm::Value *Zero = CGF.getLLVMContext().getNullValue(Src->getType());
|
||||||
return Builder.CreateICmpNE(Src, Zero, "tobool");
|
return Builder.CreateICmpNE(Src, Zero, "tobool");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,7 +808,7 @@ Value *ScalarExprEmitter::VisitUnaryImag(const UnaryOperator *E) {
|
||||||
CGF.EmitLValue(Op);
|
CGF.EmitLValue(Op);
|
||||||
else
|
else
|
||||||
CGF.EmitScalarExpr(Op, true);
|
CGF.EmitScalarExpr(Op, true);
|
||||||
return llvm::Constant::getNullValue(ConvertType(E->getType()));
|
return CGF.getLLVMContext().getNullValue(ConvertType(E->getType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Value *ScalarExprEmitter::VisitUnaryOffsetOf(const UnaryOperator *E)
|
Value *ScalarExprEmitter::VisitUnaryOffsetOf(const UnaryOperator *E)
|
||||||
|
@ -1279,7 +1279,7 @@ Value *ScalarExprEmitter::VisitBinLAnd(const BinaryOperator *E) {
|
||||||
|
|
||||||
// 0 && RHS: If it is safe, just elide the RHS, and return 0.
|
// 0 && RHS: If it is safe, just elide the RHS, and return 0.
|
||||||
if (!CGF.ContainsLabel(E->getRHS()))
|
if (!CGF.ContainsLabel(E->getRHS()))
|
||||||
return llvm::Constant::getNullValue(CGF.LLVMIntTy);
|
return CGF.getLLVMContext().getNullValue(CGF.LLVMIntTy);
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::BasicBlock *ContBlock = CGF.createBasicBlock("land.end");
|
llvm::BasicBlock *ContBlock = CGF.createBasicBlock("land.end");
|
||||||
|
|
|
@ -488,7 +488,7 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
|
||||||
llvm::BasicBlock *SetStartMutations = createBasicBlock("setstartmutations");
|
llvm::BasicBlock *SetStartMutations = createBasicBlock("setstartmutations");
|
||||||
|
|
||||||
llvm::Value *Limit = Builder.CreateLoad(LimitPtr);
|
llvm::Value *Limit = Builder.CreateLoad(LimitPtr);
|
||||||
llvm::Value *Zero = llvm::Constant::getNullValue(UnsignedLongLTy);
|
llvm::Value *Zero = getLLVMContext().getNullValue(UnsignedLongLTy);
|
||||||
|
|
||||||
llvm::Value *IsZero = Builder.CreateICmpEQ(Limit, Zero, "iszero");
|
llvm::Value *IsZero = Builder.CreateICmpEQ(Limit, Zero, "iszero");
|
||||||
Builder.CreateCondBr(IsZero, NoElements, SetStartMutations);
|
Builder.CreateCondBr(IsZero, NoElements, SetStartMutations);
|
||||||
|
@ -618,7 +618,7 @@ void CodeGenFunction::EmitObjCForCollectionStmt(const ObjCForCollectionStmt &S){
|
||||||
LValue LV = EmitLValue(cast<Expr>(S.getElement()));
|
LValue LV = EmitLValue(cast<Expr>(S.getElement()));
|
||||||
|
|
||||||
// Set the value to null.
|
// Set the value to null.
|
||||||
Builder.CreateStore(llvm::Constant::getNullValue(ConvertType(ElementTy)),
|
Builder.CreateStore(getLLVMContext().getNullValue(ConvertType(ElementTy)),
|
||||||
LV.getAddress());
|
LV.getAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1049,7 +1049,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
|
||||||
llvm::ArrayType::get(StaticsListPtrTy, 2);
|
llvm::ArrayType::get(StaticsListPtrTy, 2);
|
||||||
Elements.clear();
|
Elements.clear();
|
||||||
Elements.push_back(Statics);
|
Elements.push_back(Statics);
|
||||||
Elements.push_back(llvm::Constant::getNullValue(StaticsListPtrTy));
|
Elements.push_back(TheModule.getContext().getNullValue(StaticsListPtrTy));
|
||||||
Statics = MakeGlobal(StaticsListArrayTy, Elements, ".objc_statics_ptr");
|
Statics = MakeGlobal(StaticsListArrayTy, Elements, ".objc_statics_ptr");
|
||||||
Statics = llvm::ConstantExpr::getBitCast(Statics, PtrTy);
|
Statics = llvm::ConstantExpr::getBitCast(Statics, PtrTy);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "clang/Basic/LangOptions.h"
|
#include "clang/Basic/LangOptions.h"
|
||||||
|
|
||||||
#include "llvm/Intrinsics.h"
|
#include "llvm/Intrinsics.h"
|
||||||
|
#include "llvm/LLVMContext.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/ADT/DenseSet.h"
|
#include "llvm/ADT/DenseSet.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
|
@ -764,6 +765,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CodeGen::CodeGenModule &CGM;
|
CodeGen::CodeGenModule &CGM;
|
||||||
|
llvm::LLVMContext &VMContext;
|
||||||
// FIXME! May not be needing this after all.
|
// FIXME! May not be needing this after all.
|
||||||
unsigned ObjCABI;
|
unsigned ObjCABI;
|
||||||
|
|
||||||
|
@ -925,7 +927,8 @@ protected:
|
||||||
virtual void MergeMetadataGlobals(std::vector<llvm::Constant*> &UsedArray);
|
virtual void MergeMetadataGlobals(std::vector<llvm::Constant*> &UsedArray);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CGObjCCommonMac(CodeGen::CodeGenModule &cgm) : CGM(cgm)
|
CGObjCCommonMac(CodeGen::CodeGenModule &cgm) :
|
||||||
|
CGM(cgm), VMContext(cgm.getLLVMContext())
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual llvm::Constant *GenerateConstantString(const ObjCStringLiteral *SL);
|
virtual llvm::Constant *GenerateConstantString(const ObjCStringLiteral *SL);
|
||||||
|
@ -1718,7 +1721,7 @@ CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
|
||||||
// Return null if no extension bits are used.
|
// Return null if no extension bits are used.
|
||||||
if (Values[1]->isNullValue() && Values[2]->isNullValue() &&
|
if (Values[1]->isNullValue() && Values[2]->isNullValue() &&
|
||||||
Values[3]->isNullValue())
|
Values[3]->isNullValue())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
|
return VMContext.getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
|
||||||
|
|
||||||
llvm::Constant *Init =
|
llvm::Constant *Init =
|
||||||
llvm::ConstantStruct::get(ObjCTypes.ProtocolExtensionTy, Values);
|
llvm::ConstantStruct::get(ObjCTypes.ProtocolExtensionTy, Values);
|
||||||
|
@ -1747,14 +1750,14 @@ CGObjCMac::EmitProtocolList(const std::string &Name,
|
||||||
|
|
||||||
// Just return null for empty protocol lists
|
// Just return null for empty protocol lists
|
||||||
if (ProtocolRefs.empty())
|
if (ProtocolRefs.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
|
return VMContext.getNullValue(ObjCTypes.ProtocolListPtrTy);
|
||||||
|
|
||||||
// This list is null terminated.
|
// This list is null terminated.
|
||||||
ProtocolRefs.push_back(llvm::Constant::getNullValue(ObjCTypes.ProtocolPtrTy));
|
ProtocolRefs.push_back(VMContext.getNullValue(ObjCTypes.ProtocolPtrTy));
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(3);
|
std::vector<llvm::Constant*> Values(3);
|
||||||
// This field is only used by the runtime.
|
// This field is only used by the runtime.
|
||||||
Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
|
Values[0] = VMContext.getNullValue(ObjCTypes.ProtocolListPtrTy);
|
||||||
Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
|
Values[1] = llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1);
|
||||||
Values[2] =
|
Values[2] =
|
||||||
llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolPtrTy,
|
llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolPtrTy,
|
||||||
|
@ -1796,7 +1799,7 @@ llvm::Constant *CGObjCCommonMac::EmitPropertyList(const std::string &Name,
|
||||||
|
|
||||||
// Return null for empty list.
|
// Return null for empty list.
|
||||||
if (Properties.empty())
|
if (Properties.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
|
return VMContext.getNullValue(ObjCTypes.PropertyListPtrTy);
|
||||||
|
|
||||||
unsigned PropertySize =
|
unsigned PropertySize =
|
||||||
CGM.getTargetData().getTypeAllocSize(ObjCTypes.PropertyTy);
|
CGM.getTargetData().getTypeAllocSize(ObjCTypes.PropertyTy);
|
||||||
|
@ -1838,7 +1841,7 @@ llvm::Constant *CGObjCMac::EmitMethodDescList(const std::string &Name,
|
||||||
const ConstantVector &Methods) {
|
const ConstantVector &Methods) {
|
||||||
// Return null for empty list.
|
// Return null for empty list.
|
||||||
if (Methods.empty())
|
if (Methods.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
|
return VMContext.getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(2);
|
std::vector<llvm::Constant*> Values(2);
|
||||||
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
|
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
|
||||||
|
@ -1907,7 +1910,7 @@ void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
|
||||||
Category->protocol_begin(),
|
Category->protocol_begin(),
|
||||||
Category->protocol_end());
|
Category->protocol_end());
|
||||||
} else {
|
} else {
|
||||||
Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
|
Values[4] = VMContext.getNullValue(ObjCTypes.ProtocolListPtrTy);
|
||||||
}
|
}
|
||||||
Values[5] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
|
Values[5] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
|
||||||
|
|
||||||
|
@ -1916,7 +1919,7 @@ void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
|
||||||
Values[6] = EmitPropertyList(std::string("\01l_OBJC_$_PROP_LIST_") + ExtName,
|
Values[6] = EmitPropertyList(std::string("\01l_OBJC_$_PROP_LIST_") + ExtName,
|
||||||
OCD, Category, ObjCTypes);
|
OCD, Category, ObjCTypes);
|
||||||
} else {
|
} else {
|
||||||
Values[6] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
|
Values[6] = VMContext.getNullValue(ObjCTypes.PropertyListPtrTy);
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.CategoryTy,
|
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.CategoryTy,
|
||||||
|
@ -2016,7 +2019,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
|
||||||
llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
|
llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
|
||||||
ObjCTypes.ClassPtrTy);
|
ObjCTypes.ClassPtrTy);
|
||||||
} else {
|
} else {
|
||||||
Values[ 1] = llvm::Constant::getNullValue(ObjCTypes.ClassPtrTy);
|
Values[ 1] = VMContext.getNullValue(ObjCTypes.ClassPtrTy);
|
||||||
}
|
}
|
||||||
Values[ 2] = GetClassName(ID->getIdentifier());
|
Values[ 2] = GetClassName(ID->getIdentifier());
|
||||||
// Version is always 0.
|
// Version is always 0.
|
||||||
|
@ -2029,7 +2032,7 @@ void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
|
||||||
"__OBJC,__inst_meth,regular,no_dead_strip",
|
"__OBJC,__inst_meth,regular,no_dead_strip",
|
||||||
InstanceMethods);
|
InstanceMethods);
|
||||||
// cache is always NULL.
|
// cache is always NULL.
|
||||||
Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.CachePtrTy);
|
Values[ 8] = VMContext.getNullValue(ObjCTypes.CachePtrTy);
|
||||||
Values[ 9] = Protocols;
|
Values[ 9] = Protocols;
|
||||||
Values[10] = BuildIvarLayout(ID, true);
|
Values[10] = BuildIvarLayout(ID, true);
|
||||||
Values[11] = EmitClassExtension(ID);
|
Values[11] = EmitClassExtension(ID);
|
||||||
|
@ -2068,7 +2071,7 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
|
||||||
llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
|
llvm::ConstantExpr::getBitCast(GetClassName(Super->getIdentifier()),
|
||||||
ObjCTypes.ClassPtrTy);
|
ObjCTypes.ClassPtrTy);
|
||||||
} else {
|
} else {
|
||||||
Values[ 1] = llvm::Constant::getNullValue(ObjCTypes.ClassPtrTy);
|
Values[ 1] = VMContext.getNullValue(ObjCTypes.ClassPtrTy);
|
||||||
}
|
}
|
||||||
Values[ 2] = GetClassName(ID->getIdentifier());
|
Values[ 2] = GetClassName(ID->getIdentifier());
|
||||||
// Version is always 0.
|
// Version is always 0.
|
||||||
|
@ -2081,12 +2084,12 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
|
||||||
"__OBJC,__cls_meth,regular,no_dead_strip",
|
"__OBJC,__cls_meth,regular,no_dead_strip",
|
||||||
Methods);
|
Methods);
|
||||||
// cache is always NULL.
|
// cache is always NULL.
|
||||||
Values[ 8] = llvm::Constant::getNullValue(ObjCTypes.CachePtrTy);
|
Values[ 8] = VMContext.getNullValue(ObjCTypes.CachePtrTy);
|
||||||
Values[ 9] = Protocols;
|
Values[ 9] = Protocols;
|
||||||
// ivar_layout for metaclass is always NULL.
|
// ivar_layout for metaclass is always NULL.
|
||||||
Values[10] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
|
Values[10] = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
|
||||||
// The class extension is always unused for metaclasses.
|
// The class extension is always unused for metaclasses.
|
||||||
Values[11] = llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
|
Values[11] = VMContext.getNullValue(ObjCTypes.ClassExtensionPtrTy);
|
||||||
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
|
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassTy,
|
||||||
Values);
|
Values);
|
||||||
|
|
||||||
|
@ -2157,7 +2160,7 @@ CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID) {
|
||||||
|
|
||||||
// Return null if no extension bits are used.
|
// Return null if no extension bits are used.
|
||||||
if (Values[1]->isNullValue() && Values[2]->isNullValue())
|
if (Values[1]->isNullValue() && Values[2]->isNullValue())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
|
return VMContext.getNullValue(ObjCTypes.ClassExtensionPtrTy);
|
||||||
|
|
||||||
llvm::Constant *Init =
|
llvm::Constant *Init =
|
||||||
llvm::ConstantStruct::get(ObjCTypes.ClassExtensionTy, Values);
|
llvm::ConstantStruct::get(ObjCTypes.ClassExtensionTy, Values);
|
||||||
|
@ -2188,7 +2191,7 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
|
||||||
// the cleanest solution would be to make up an ObjCInterfaceDecl
|
// the cleanest solution would be to make up an ObjCInterfaceDecl
|
||||||
// for the class.
|
// for the class.
|
||||||
if (ForClass)
|
if (ForClass)
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
|
return VMContext.getNullValue(ObjCTypes.IvarListPtrTy);
|
||||||
|
|
||||||
ObjCInterfaceDecl *OID =
|
ObjCInterfaceDecl *OID =
|
||||||
const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
|
const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
|
||||||
|
@ -2210,7 +2213,7 @@ llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
|
||||||
|
|
||||||
// Return null for empty list.
|
// Return null for empty list.
|
||||||
if (Ivars.empty())
|
if (Ivars.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
|
return VMContext.getNullValue(ObjCTypes.IvarListPtrTy);
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(2);
|
std::vector<llvm::Constant*> Values(2);
|
||||||
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
|
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size());
|
||||||
|
@ -2269,10 +2272,10 @@ llvm::Constant *CGObjCMac::EmitMethodList(const std::string &Name,
|
||||||
const ConstantVector &Methods) {
|
const ConstantVector &Methods) {
|
||||||
// Return null for empty list.
|
// Return null for empty list.
|
||||||
if (Methods.empty())
|
if (Methods.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.MethodListPtrTy);
|
return VMContext.getNullValue(ObjCTypes.MethodListPtrTy);
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(3);
|
std::vector<llvm::Constant*> Values(3);
|
||||||
Values[0] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
|
Values[0] = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
|
||||||
Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
|
Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size());
|
||||||
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
|
llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy,
|
||||||
Methods.size());
|
Methods.size());
|
||||||
|
@ -2889,11 +2892,11 @@ llvm::Constant *CGObjCMac::EmitModuleSymbols() {
|
||||||
|
|
||||||
// Return null if no symbols were defined.
|
// Return null if no symbols were defined.
|
||||||
if (!NumClasses && !NumCategories)
|
if (!NumClasses && !NumCategories)
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
|
return VMContext.getNullValue(ObjCTypes.SymtabPtrTy);
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(5);
|
std::vector<llvm::Constant*> Values(5);
|
||||||
Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
|
Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0);
|
||||||
Values[1] = llvm::Constant::getNullValue(ObjCTypes.SelectorPtrTy);
|
Values[1] = VMContext.getNullValue(ObjCTypes.SelectorPtrTy);
|
||||||
Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
|
Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses);
|
||||||
Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories);
|
Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories);
|
||||||
|
|
||||||
|
@ -2973,7 +2976,7 @@ llvm::Constant *CGObjCCommonMac::GetClassName(IdentifierInfo *Ident) {
|
||||||
/// ivar layout bitmap.
|
/// ivar layout bitmap.
|
||||||
llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
|
llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
|
||||||
const ObjCCommonTypesHelper &ObjCTypes) {
|
const ObjCCommonTypesHelper &ObjCTypes) {
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
|
return VMContext.getNullValue(ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QualType::GCAttrTypes GetGCAttrTypeForType(ASTContext &Ctx,
|
static QualType::GCAttrTypes GetGCAttrTypeForType(ASTContext &Ctx,
|
||||||
|
@ -3178,7 +3181,7 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout(
|
||||||
unsigned int WordsToScan, WordsToSkip;
|
unsigned int WordsToScan, WordsToSkip;
|
||||||
const llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
|
const llvm::Type *PtrTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
|
||||||
if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC)
|
if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC)
|
||||||
return llvm::Constant::getNullValue(PtrTy);
|
return VMContext.getNullValue(PtrTy);
|
||||||
|
|
||||||
llvm::SmallVector<FieldDecl*, 32> RecFields;
|
llvm::SmallVector<FieldDecl*, 32> RecFields;
|
||||||
const ObjCInterfaceDecl *OI = OMD->getClassInterface();
|
const ObjCInterfaceDecl *OI = OMD->getClassInterface();
|
||||||
|
@ -3191,14 +3194,14 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout(
|
||||||
RecFields.push_back(cast<FieldDecl>(Ivars[k]));
|
RecFields.push_back(cast<FieldDecl>(Ivars[k]));
|
||||||
|
|
||||||
if (RecFields.empty())
|
if (RecFields.empty())
|
||||||
return llvm::Constant::getNullValue(PtrTy);
|
return VMContext.getNullValue(PtrTy);
|
||||||
|
|
||||||
SkipIvars.clear();
|
SkipIvars.clear();
|
||||||
IvarsInfo.clear();
|
IvarsInfo.clear();
|
||||||
|
|
||||||
BuildAggrIvarLayout(OMD, 0, 0, RecFields, 0, ForStrongLayout, hasUnion);
|
BuildAggrIvarLayout(OMD, 0, 0, RecFields, 0, ForStrongLayout, hasUnion);
|
||||||
if (IvarsInfo.empty())
|
if (IvarsInfo.empty())
|
||||||
return llvm::Constant::getNullValue(PtrTy);
|
return VMContext.getNullValue(PtrTy);
|
||||||
|
|
||||||
// Sort on byte position in case we encounterred a union nested in
|
// Sort on byte position in case we encounterred a union nested in
|
||||||
// the ivar list.
|
// the ivar list.
|
||||||
|
@ -3339,7 +3342,7 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout(
|
||||||
// if ivar_layout bitmap is all 1 bits (nothing skipped) then use NULL as
|
// if ivar_layout bitmap is all 1 bits (nothing skipped) then use NULL as
|
||||||
// final layout.
|
// final layout.
|
||||||
if (ForStrongLayout && !BytesSkipped)
|
if (ForStrongLayout && !BytesSkipped)
|
||||||
return llvm::Constant::getNullValue(PtrTy);
|
return VMContext.getNullValue(PtrTy);
|
||||||
llvm::GlobalVariable * Entry = CreateMetadataVar("\01L_OBJC_CLASS_NAME_",
|
llvm::GlobalVariable * Entry = CreateMetadataVar("\01L_OBJC_CLASS_NAME_",
|
||||||
llvm::ConstantArray::get(BitMap.c_str()),
|
llvm::ConstantArray::get(BitMap.c_str()),
|
||||||
"__TEXT,__cstring,cstring_literals",
|
"__TEXT,__cstring,cstring_literals",
|
||||||
|
@ -3464,11 +3467,11 @@ void CGObjCMac::FinishModule() {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(5);
|
std::vector<llvm::Constant*> Values(5);
|
||||||
Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
|
Values[0] = VMContext.getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
|
||||||
Values[1] = GetClassName(i->first);
|
Values[1] = GetClassName(i->first);
|
||||||
Values[2] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
|
Values[2] = VMContext.getNullValue(ObjCTypes.ProtocolListPtrTy);
|
||||||
Values[3] = Values[4] =
|
Values[3] = Values[4] =
|
||||||
llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
|
VMContext.getNullValue(ObjCTypes.MethodDescriptionListPtrTy);
|
||||||
i->second->setLinkage(llvm::GlobalValue::InternalLinkage);
|
i->second->setLinkage(llvm::GlobalValue::InternalLinkage);
|
||||||
i->second->setInitializer(llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
|
i->second->setInitializer(llvm::ConstantStruct::get(ObjCTypes.ProtocolTy,
|
||||||
Values));
|
Values));
|
||||||
|
@ -4241,13 +4244,13 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
|
||||||
OID->protocol_end());
|
OID->protocol_end());
|
||||||
|
|
||||||
if (flags & CLS_META)
|
if (flags & CLS_META)
|
||||||
Values[ 7] = llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
|
Values[ 7] = VMContext.getNullValue(ObjCTypes.IvarListnfABIPtrTy);
|
||||||
else
|
else
|
||||||
Values[ 7] = EmitIvarList(ID);
|
Values[ 7] = EmitIvarList(ID);
|
||||||
Values[ 8] = (flags & CLS_META) ? GetIvarLayoutName(0, ObjCTypes)
|
Values[ 8] = (flags & CLS_META) ? GetIvarLayoutName(0, ObjCTypes)
|
||||||
: BuildIvarLayout(ID, false);
|
: BuildIvarLayout(ID, false);
|
||||||
if (flags & CLS_META)
|
if (flags & CLS_META)
|
||||||
Values[ 9] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
|
Values[ 9] = VMContext.getNullValue(ObjCTypes.PropertyListPtrTy);
|
||||||
else
|
else
|
||||||
Values[ 9] =
|
Values[ 9] =
|
||||||
EmitPropertyList(
|
EmitPropertyList(
|
||||||
|
@ -4289,7 +4292,7 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassMetaData(
|
||||||
Values[0] = IsAGV;
|
Values[0] = IsAGV;
|
||||||
Values[1] = SuperClassGV
|
Values[1] = SuperClassGV
|
||||||
? SuperClassGV
|
? SuperClassGV
|
||||||
: llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy);
|
: VMContext.getNullValue(ObjCTypes.ClassnfABIPtrTy);
|
||||||
Values[2] = ObjCEmptyCacheVar; // &ObjCEmptyCacheVar
|
Values[2] = ObjCEmptyCacheVar; // &ObjCEmptyCacheVar
|
||||||
Values[3] = ObjCEmptyVtableVar; // &ObjCEmptyVtableVar
|
Values[3] = ObjCEmptyVtableVar; // &ObjCEmptyVtableVar
|
||||||
Values[4] = ClassRoGV; // &CLASS_RO_GV
|
Values[4] = ClassRoGV; // &CLASS_RO_GV
|
||||||
|
@ -4524,8 +4527,8 @@ void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
|
||||||
OCD, Category, ObjCTypes);
|
OCD, Category, ObjCTypes);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
|
Values[4] = VMContext.getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
|
||||||
Values[5] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
|
Values[5] = VMContext.getNullValue(ObjCTypes.PropertyListPtrTy);
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Constant *Init =
|
llvm::Constant *Init =
|
||||||
|
@ -4580,7 +4583,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitMethodList(
|
||||||
const ConstantVector &Methods) {
|
const ConstantVector &Methods) {
|
||||||
// Return null for empty list.
|
// Return null for empty list.
|
||||||
if (Methods.empty())
|
if (Methods.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
|
return VMContext.getNullValue(ObjCTypes.MethodListnfABIPtrTy);
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(3);
|
std::vector<llvm::Constant*> Values(3);
|
||||||
// sizeof(struct _objc_method)
|
// sizeof(struct _objc_method)
|
||||||
|
@ -4709,7 +4712,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
|
||||||
}
|
}
|
||||||
// Return null for empty list.
|
// Return null for empty list.
|
||||||
if (Ivars.empty())
|
if (Ivars.empty())
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
|
return VMContext.getNullValue(ObjCTypes.IvarListnfABIPtrTy);
|
||||||
std::vector<llvm::Constant*> Values(3);
|
std::vector<llvm::Constant*> Values(3);
|
||||||
unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.IvarnfABITy);
|
unsigned Size = CGM.getTargetData().getTypeAllocSize(ObjCTypes.IvarnfABITy);
|
||||||
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
|
Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
|
||||||
|
@ -4807,7 +4810,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(10);
|
std::vector<llvm::Constant*> Values(10);
|
||||||
// isa is NULL
|
// isa is NULL
|
||||||
Values[0] = llvm::Constant::getNullValue(ObjCTypes.ObjectPtrTy);
|
Values[0] = VMContext.getNullValue(ObjCTypes.ObjectPtrTy);
|
||||||
Values[1] = GetClassName(PD->getIdentifier());
|
Values[1] = GetClassName(PD->getIdentifier());
|
||||||
Values[2] = EmitProtocolList(
|
Values[2] = EmitProtocolList(
|
||||||
"\01l_OBJC_$_PROTOCOL_REFS_" + PD->getNameAsString(),
|
"\01l_OBJC_$_PROTOCOL_REFS_" + PD->getNameAsString(),
|
||||||
|
@ -4835,7 +4838,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
|
||||||
uint32_t Size =
|
uint32_t Size =
|
||||||
CGM.getTargetData().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
|
CGM.getTargetData().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
|
||||||
Values[8] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
|
Values[8] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size);
|
||||||
Values[9] = llvm::Constant::getNullValue(ObjCTypes.IntTy);
|
Values[9] = VMContext.getNullValue(ObjCTypes.IntTy);
|
||||||
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolnfABITy,
|
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolnfABITy,
|
||||||
Values);
|
Values);
|
||||||
|
|
||||||
|
@ -4888,7 +4891,7 @@ CGObjCNonFragileABIMac::EmitProtocolList(const std::string &Name,
|
||||||
|
|
||||||
// Just return null for empty protocol lists
|
// Just return null for empty protocol lists
|
||||||
if (begin == end)
|
if (begin == end)
|
||||||
return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
|
return VMContext.getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
|
||||||
|
|
||||||
// FIXME: We shouldn't need to do this lookup here, should we?
|
// FIXME: We shouldn't need to do this lookup here, should we?
|
||||||
llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
|
llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
|
||||||
|
@ -4900,7 +4903,7 @@ CGObjCNonFragileABIMac::EmitProtocolList(const std::string &Name,
|
||||||
ProtocolRefs.push_back(GetProtocolRef(*begin)); // Implemented???
|
ProtocolRefs.push_back(GetProtocolRef(*begin)); // Implemented???
|
||||||
|
|
||||||
// This list is null terminated.
|
// This list is null terminated.
|
||||||
ProtocolRefs.push_back(llvm::Constant::getNullValue(
|
ProtocolRefs.push_back(VMContext.getNullValue(
|
||||||
ObjCTypes.ProtocolnfABIPtrTy));
|
ObjCTypes.ProtocolnfABIPtrTy));
|
||||||
|
|
||||||
std::vector<llvm::Constant*> Values(2);
|
std::vector<llvm::Constant*> Values(2);
|
||||||
|
@ -4937,7 +4940,7 @@ CGObjCNonFragileABIMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) {
|
||||||
ObjCTypes.SelectorPtrTy);
|
ObjCTypes.SelectorPtrTy);
|
||||||
Desc[1] = GetMethodVarType(MD);
|
Desc[1] = GetMethodVarType(MD);
|
||||||
// Protocol methods have no implementation. So, this entry is always NULL.
|
// Protocol methods have no implementation. So, this entry is always NULL.
|
||||||
Desc[2] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
|
Desc[2] = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
|
||||||
return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Desc);
|
return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5439,7 +5442,7 @@ CGObjCNonFragileABIMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
|
||||||
// catch(...) always matches.
|
// catch(...) always matches.
|
||||||
if (!CatchDecl) {
|
if (!CatchDecl) {
|
||||||
// Use i8* null here to signal this is a catch all, not a cleanup.
|
// Use i8* null here to signal this is a catch all, not a cleanup.
|
||||||
llvm::Value *Null = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
|
llvm::Value *Null = VMContext.getNullValue(ObjCTypes.Int8PtrTy);
|
||||||
SelectorArgs.push_back(Null);
|
SelectorArgs.push_back(Null);
|
||||||
HasCatchAll = true;
|
HasCatchAll = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -414,7 +414,7 @@ void CodeGenFunction::EmitMemSetToZero(llvm::Value *DestPtr, QualType Ty) {
|
||||||
const llvm::Type *IntPtr = llvm::IntegerType::get(LLVMPointerWidth);
|
const llvm::Type *IntPtr = llvm::IntegerType::get(LLVMPointerWidth);
|
||||||
|
|
||||||
Builder.CreateCall4(CGM.getMemSetFn(), DestPtr,
|
Builder.CreateCall4(CGM.getMemSetFn(), DestPtr,
|
||||||
llvm::ConstantInt::getNullValue(llvm::Type::Int8Ty),
|
getLLVMContext().getNullValue(llvm::Type::Int8Ty),
|
||||||
// TypeInfo.first describes size in bits.
|
// TypeInfo.first describes size in bits.
|
||||||
llvm::ConstantInt::get(IntPtr, TypeInfo.first/8),
|
llvm::ConstantInt::get(IntPtr, TypeInfo.first/8),
|
||||||
llvm::ConstantInt::get(llvm::Type::Int32Ty,
|
llvm::ConstantInt::get(llvm::Type::Int32Ty,
|
||||||
|
@ -579,7 +579,7 @@ CodeGenFunction::CleanupBlockInfo CodeGenFunction::PopCleanupBlock()
|
||||||
|
|
||||||
// If we had a current basic block, we also need to emit an instruction
|
// If we had a current basic block, we also need to emit an instruction
|
||||||
// to initialize the cleanup destination.
|
// to initialize the cleanup destination.
|
||||||
Builder.CreateStore(llvm::Constant::getNullValue(llvm::Type::Int32Ty),
|
Builder.CreateStore(getLLVMContext().getNullValue(llvm::Type::Int32Ty),
|
||||||
DestCodePtr);
|
DestCodePtr);
|
||||||
} else
|
} else
|
||||||
Builder.ClearInsertionPoint();
|
Builder.ClearInsertionPoint();
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/Support/ValueHandle.h"
|
#include "llvm/Support/ValueHandle.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include "CodeGenModule.h"
|
||||||
#include "CGBlocks.h"
|
#include "CGBlocks.h"
|
||||||
#include "CGBuilder.h"
|
#include "CGBuilder.h"
|
||||||
#include "CGCall.h"
|
#include "CGCall.h"
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class BasicBlock;
|
class BasicBlock;
|
||||||
|
class LLVMContext;
|
||||||
class Module;
|
class Module;
|
||||||
class SwitchInst;
|
class SwitchInst;
|
||||||
class Value;
|
class Value;
|
||||||
|
@ -292,6 +294,8 @@ public:
|
||||||
llvm::BasicBlock *getInvokeDest() { return InvokeDest; }
|
llvm::BasicBlock *getInvokeDest() { return InvokeDest; }
|
||||||
void setInvokeDest(llvm::BasicBlock *B) { InvokeDest = B; }
|
void setInvokeDest(llvm::BasicBlock *B) { InvokeDest = B; }
|
||||||
|
|
||||||
|
llvm::LLVMContext &getLLVMContext() { return CGM.getLLVMContext(); }
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// Objective-C
|
// Objective-C
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
|
|
|
@ -804,7 +804,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
|
||||||
// exists. A use may still exists, however, so we still may need
|
// exists. A use may still exists, however, so we still may need
|
||||||
// to do a RAUW.
|
// to do a RAUW.
|
||||||
assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
|
assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
|
||||||
Init = llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(ASTTy));
|
Init = getLLVMContext().getNullValue(getTypes().ConvertTypeForMem(ASTTy));
|
||||||
} else {
|
} else {
|
||||||
Init = EmitConstantExpr(D->getInit(), D->getType());
|
Init = EmitConstantExpr(D->getInit(), D->getType());
|
||||||
if (!Init) {
|
if (!Init) {
|
||||||
|
@ -1184,7 +1184,7 @@ static void appendFieldAndPadding(CodeGenModule &CGM,
|
||||||
// Append padding
|
// Append padding
|
||||||
for (int i = StructFieldNo + 1; i < NextStructFieldNo; i++) {
|
for (int i = StructFieldNo + 1; i < NextStructFieldNo; i++) {
|
||||||
llvm::Constant *C =
|
llvm::Constant *C =
|
||||||
llvm::Constant::getNullValue(STy->getElementType(StructFieldNo + 1));
|
CGM.getLLVMContext().getNullValue(STy->getElementType(StructFieldNo + 1));
|
||||||
|
|
||||||
Fields.push_back(C);
|
Fields.push_back(C);
|
||||||
}
|
}
|
||||||
|
@ -1232,7 +1232,7 @@ GetAddrOfConstantCFString(const StringLiteral *Literal) {
|
||||||
if (llvm::Constant *C = Entry.getValue())
|
if (llvm::Constant *C = Entry.getValue())
|
||||||
return C;
|
return C;
|
||||||
|
|
||||||
llvm::Constant *Zero = llvm::Constant::getNullValue(llvm::Type::Int32Ty);
|
llvm::Constant *Zero = getLLVMContext().getNullValue(llvm::Type::Int32Ty);
|
||||||
llvm::Constant *Zeros[] = { Zero, Zero };
|
llvm::Constant *Zeros[] = { Zero, Zero };
|
||||||
|
|
||||||
if (!CFConstantStringClassRef) {
|
if (!CFConstantStringClassRef) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "CGCall.h"
|
#include "CGCall.h"
|
||||||
#include "CGCXX.h"
|
#include "CGCXX.h"
|
||||||
#include "CodeGenTypes.h"
|
#include "CodeGenTypes.h"
|
||||||
|
#include "llvm/Module.h"
|
||||||
#include "llvm/ADT/DenseMap.h"
|
#include "llvm/ADT/DenseMap.h"
|
||||||
#include "llvm/ADT/StringMap.h"
|
#include "llvm/ADT/StringMap.h"
|
||||||
#include "llvm/ADT/StringSet.h"
|
#include "llvm/ADT/StringSet.h"
|
||||||
|
@ -34,6 +35,7 @@ namespace llvm {
|
||||||
class GlobalValue;
|
class GlobalValue;
|
||||||
class TargetData;
|
class TargetData;
|
||||||
class FunctionType;
|
class FunctionType;
|
||||||
|
class LLVMContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace clang {
|
namespace clang {
|
||||||
|
@ -202,6 +204,7 @@ public:
|
||||||
CodeGenTypes &getTypes() { return Types; }
|
CodeGenTypes &getTypes() { return Types; }
|
||||||
Diagnostic &getDiags() const { return Diags; }
|
Diagnostic &getDiags() const { return Diags; }
|
||||||
const llvm::TargetData &getTargetData() const { return TheTargetData; }
|
const llvm::TargetData &getTargetData() const { return TheTargetData; }
|
||||||
|
llvm::LLVMContext &getLLVMContext() { return TheModule.getContext(); }
|
||||||
|
|
||||||
/// getDeclVisibilityMode - Compute the visibility of the decl \arg D.
|
/// getDeclVisibilityMode - Compute the visibility of the decl \arg D.
|
||||||
LangOptions::VisibilityMode getDeclVisibilityMode(const Decl *D) const;
|
LangOptions::VisibilityMode getDeclVisibilityMode(const Decl *D) const;
|
||||||
|
|
Loading…
Reference in New Issue