diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp | 111 |
1 files changed, 66 insertions, 45 deletions
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp index f4d6861..b508dcb 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp @@ -530,7 +530,7 @@ llvm::Constant *ConstStructBuilder::BuildStruct(CodeGenModule &CGM, ConstStructBuilder Builder(CGM, CGF); if (!Builder.Build(ILE)) - return 0; + return nullptr; return Builder.Finalize(ILE->getType()); } @@ -572,7 +572,7 @@ public: //===--------------------------------------------------------------------===// llvm::Constant *VisitStmt(Stmt *S) { - return 0; + return nullptr; } llvm::Constant *VisitParenExpr(ParenExpr *PE) { @@ -599,7 +599,7 @@ public: llvm::Constant *VisitCastExpr(CastExpr* E) { Expr *subExpr = E->getSubExpr(); llvm::Constant *C = CGM.EmitConstantExpr(subExpr, subExpr->getType(), CGF); - if (!C) return 0; + if (!C) return nullptr; llvm::Type *destType = ConvertType(E->getType()); @@ -633,6 +633,9 @@ public: return llvm::ConstantStruct::get(STy, Elts); } + case CK_AddressSpaceConversion: + return llvm::ConstantExpr::getAddrSpaceCast(C, destType); + case CK_LValueToRValue: case CK_AtomicToNonAtomic: case CK_NonAtomicToAtomic: @@ -657,7 +660,7 @@ public: case CK_ARCReclaimReturnedObject: case CK_ARCExtendBlockObject: case CK_CopyAndAutoreleaseBlockObject: - return 0; + return nullptr; // These don't need to be handled here because Evaluate knows how to // evaluate them in the cases where they can be folded. @@ -698,7 +701,7 @@ public: case CK_FloatingToBoolean: case CK_FloatingCast: case CK_ZeroToOCLEvent: - return 0; + return nullptr; } llvm_unreachable("Invalid CastKind"); } @@ -740,7 +743,7 @@ public: Expr *Init = ILE->getInit(i); llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF); if (!C) - return 0; + return nullptr; RewriteType |= (C->getType() != ElemTy); Elts.push_back(C); } @@ -753,7 +756,7 @@ public: else fillC = llvm::Constant::getNullValue(ElemTy); if (!fillC) - return 0; + return nullptr; RewriteType |= (fillC->getType() != ElemTy); Elts.resize(NumElements, fillC); @@ -786,12 +789,12 @@ public: if (ILE->getType()->isRecordType()) return EmitRecordInitialization(ILE); - return 0; + return nullptr; } llvm::Constant *VisitCXXConstructExpr(CXXConstructExpr *E) { if (!E->getConstructor()->isTrivial()) - return 0; + return nullptr; QualType Ty = E->getType(); @@ -803,8 +806,8 @@ public: // If the class doesn't have a trivial destructor, we can't emit it as a // constant expr. if (!RD->hasTrivialDestructor()) - return 0; - + return nullptr; + // Only copy and default constructors can be trivial. @@ -833,7 +836,10 @@ public: // as an inline array. std::string Str; CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str); - const ConstantArrayType *CAT = cast<ConstantArrayType>(E->getType()); + QualType T = E->getType(); + if (T->getTypeClass() == Type::TypeOfExpr) + T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType(); + const ConstantArrayType *CAT = cast<ConstantArrayType>(T); // Resize the string to the right size, adding zeros at the end, or // truncating as needed. @@ -866,7 +872,7 @@ public: return CGM.getStaticLocalDeclAddress(VD); } } - return 0; + return nullptr; } Expr *E = const_cast<Expr*>(LVBase.get<const Expr*>()); @@ -883,7 +889,7 @@ public: C = new llvm::GlobalVariable(CGM.getModule(), C->getType(), E->getType().isConstant(CGM.getContext()), llvm::GlobalValue::InternalLinkage, - C, ".compoundliteral", 0, + C, ".compoundliteral", nullptr, llvm::GlobalVariable::NotThreadLocal, CGM.getContext().getTargetAddressSpace(E->getType())); return C; @@ -917,7 +923,7 @@ public: } case Expr::CallExprClass: { CallExpr* CE = cast<CallExpr>(E); - unsigned builtin = CE->isBuiltinCall(); + unsigned builtin = CE->getBuiltinCallee(); if (builtin != Builtin::BI__builtin___CFStringMakeConstantString && builtin != @@ -964,7 +970,7 @@ public: } } - return 0; + return nullptr; } }; @@ -998,7 +1004,7 @@ llvm::Constant *CodeGenModule::EmitConstantInit(const VarDecl &D, // interprets that as the (pointer) value of the reference, rather than the // desired value of the referee. if (D.getType()->isReferenceType()) - return 0; + return nullptr; const Expr *E = D.getInit(); assert(E && "No initializer to emit"); @@ -1023,7 +1029,7 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, else Success = E->EvaluateAsRValue(Result, Context); - llvm::Constant *C = 0; + llvm::Constant *C = nullptr; if (Success && !Result.HasSideEffects) C = EmitConstantValue(Result.Val, DestType, CGF); else @@ -1039,6 +1045,25 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value, QualType DestType, CodeGenFunction *CGF) { + // For an _Atomic-qualified constant, we may need to add tail padding. + if (auto *AT = DestType->getAs<AtomicType>()) { + QualType InnerType = AT->getValueType(); + auto *Inner = EmitConstantValue(Value, InnerType, CGF); + + uint64_t InnerSize = Context.getTypeSize(InnerType); + uint64_t OuterSize = Context.getTypeSize(DestType); + if (InnerSize == OuterSize) + return Inner; + + assert(InnerSize < OuterSize && "emitted over-large constant for atomic"); + llvm::Constant *Elts[] = { + Inner, + llvm::ConstantAggregateZero::get( + llvm::ArrayType::get(Int8Ty, (OuterSize - InnerSize) / 8)) + }; + return llvm::ConstantStruct::getAnon(Elts); + } + switch (Value.getKind()) { case APValue::Uninitialized: llvm_unreachable("Constant expressions should be initialized."); @@ -1060,15 +1085,17 @@ llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value, // Apply offset if necessary. if (!Offset->isNullValue()) { - llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, Int8PtrTy); + unsigned AS = C->getType()->getPointerAddressSpace(); + llvm::Type *CharPtrTy = Int8Ty->getPointerTo(AS); + llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, CharPtrTy); Casted = llvm::ConstantExpr::getGetElementPtr(Casted, Offset); - C = llvm::ConstantExpr::getBitCast(Casted, C->getType()); + C = llvm::ConstantExpr::getPointerCast(Casted, C->getType()); } // Convert to the appropriate type; this could be an lvalue for // an integer. if (isa<llvm::PointerType>(DestTy)) - return llvm::ConstantExpr::getBitCast(C, DestTy); + return llvm::ConstantExpr::getPointerCast(C, DestTy); return llvm::ConstantExpr::getPtrToInt(C, DestTy); } else { @@ -1166,13 +1193,13 @@ llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value, Elts.reserve(NumElements); // Emit array filler, if there is one. - llvm::Constant *Filler = 0; + llvm::Constant *Filler = nullptr; if (Value.hasArrayFiller()) Filler = EmitConstantValueForMemory(Value.getArrayFiller(), CAT->getElementType(), CGF); // Emit initializer elements. - llvm::Type *CommonElementType = 0; + llvm::Type *CommonElementType = nullptr; for (unsigned I = 0; I < NumElements; ++I) { llvm::Constant *C = Filler; if (I < NumInitElts) @@ -1183,7 +1210,7 @@ llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value, if (I == 0) CommonElementType = C->getType(); else if (C->getType() != CommonElementType) - CommonElementType = 0; + CommonElementType = nullptr; Elts.push_back(C); } @@ -1222,7 +1249,7 @@ CodeGenModule::EmitConstantValueForMemory(const APValue &Value, llvm::Constant * CodeGenModule::GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E) { assert(E->isFileScope() && "not a file-scope compound literal expr"); - return ConstExprEmitter(*this, 0).EmitLValue(E); + return ConstExprEmitter(*this, nullptr).EmitLValue(E); } llvm::Constant * @@ -1265,15 +1292,14 @@ FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T, const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); // Go through all bases and fill in any null pointer to data members. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual()) { + for (const auto &I : RD->bases()) { + if (I.isVirtual()) { // Ignore virtual bases. continue; } const CXXRecordDecl *BaseDecl = - cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl()); // Ignore empty bases. if (BaseDecl->isEmpty()) @@ -1285,7 +1311,7 @@ FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T, uint64_t BaseOffset = CGM.getContext().toBits(Layout.getBaseClassOffset(BaseDecl)); - FillInNullDataMemberPointers(CGM, I->getType(), + FillInNullDataMemberPointers(CGM, I.getType(), Elements, StartOffset + BaseOffset); } @@ -1335,16 +1361,15 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM, std::vector<llvm::Constant *> elements(numElements); // Fill in all the bases. - for (CXXRecordDecl::base_class_const_iterator - I = record->bases_begin(), E = record->bases_end(); I != E; ++I) { - if (I->isVirtual()) { + for (const auto &I : record->bases()) { + if (I.isVirtual()) { // Ignore virtual bases; if we're laying out for a complete // object, we'll lay these out later. continue; } const CXXRecordDecl *base = - cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); // Ignore empty bases. if (base->isEmpty()) @@ -1356,28 +1381,24 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM, } // Fill in all the fields. - for (RecordDecl::field_iterator I = record->field_begin(), - E = record->field_end(); I != E; ++I) { - const FieldDecl *field = *I; - + for (const auto *Field : record->fields()) { // Fill in non-bitfields. (Bitfields always use a zero pattern, which we // will fill in later.) - if (!field->isBitField()) { - unsigned fieldIndex = layout.getLLVMFieldNo(field); - elements[fieldIndex] = CGM.EmitNullConstant(field->getType()); + if (!Field->isBitField()) { + unsigned fieldIndex = layout.getLLVMFieldNo(Field); + elements[fieldIndex] = CGM.EmitNullConstant(Field->getType()); } // For unions, stop after the first named field. - if (record->isUnion() && field->getDeclName()) + if (record->isUnion() && Field->getDeclName()) break; } // Fill in the virtual bases, if we're working with the complete object. if (asCompleteObject) { - for (CXXRecordDecl::base_class_const_iterator - I = record->vbases_begin(), E = record->vbases_end(); I != E; ++I) { + for (const auto &I : record->vbases()) { const CXXRecordDecl *base = - cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); // Ignore empty bases. if (base->isEmpty()) |