From: Chris Lattner Date: Sat, 24 Jan 2009 21:09:45 +0000 (+0000) Subject: remove a bunch of alignment handling code out of CGExprScalar, since X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91daf4da934e10dcbf22697d59e2791420b1507a;p=clang remove a bunch of alignment handling code out of CGExprScalar, since alignment must always be a constant. Just let the constant folder do it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62933 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index fc87726a21..b1150cb2d1 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -673,45 +673,43 @@ Value *ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *E) { /// argument of the sizeof expression as an integer. Value * ScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { + // Handle alignof with the constant folding logic. alignof always produces a + // constant. + if (!E->isSizeOf()) { + Expr::EvalResult Result; + E->Evaluate(Result, CGF.getContext()); + return llvm::ConstantInt::get(Result.Val.getInt()); + } + QualType RetType = E->getType(); assert(RetType->isIntegerType() && "Result type must be an integer!"); uint32_t ResultWidth = static_cast(CGF.getContext().getTypeSize(RetType)); - + + // sizeof(void) and sizeof(function) = 1 as a strange gcc extension. QualType TypeToSize = E->getTypeOfArgument(); - // sizeof(void) and __alignof__(void) = 1 as a gcc extension. Also - // for function types. - // FIXME: what is alignof a function type in gcc? if (TypeToSize->isVoidType() || TypeToSize->isFunctionType()) return llvm::ConstantInt::get(llvm::APInt(ResultWidth, 1)); if (const VariableArrayType *VAT = CGF.getContext().getAsVariableArrayType(TypeToSize)) { - if (E->isSizeOf()) { - if (E->isArgumentType()) { - // sizeof(type) - make sure to emit the VLA size. - CGF.EmitVLASize(TypeToSize); - } - return CGF.GetVLASize(VAT); + if (E->isArgumentType()) { + // sizeof(type) - make sure to emit the VLA size. + CGF.EmitVLASize(TypeToSize); } - - // alignof - QualType BaseType = CGF.getContext().getBaseElementType(VAT); - uint64_t Align = CGF.getContext().getTypeAlign(BaseType); - - Align /= 8; // Return alignment in bytes, not bits. - return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Align)); + return CGF.GetVLASize(VAT); } + if (TypeToSize->isObjCInterfaceType()) { ObjCInterfaceDecl *OI = TypeToSize->getAsObjCInterfaceType()->getDecl(); RecordDecl *RD = const_cast( CGF.getContext().addRecordToClass(OI)); TypeToSize = CGF.getContext().getTagDeclType(static_cast(RD)); } - std::pair Info = CGF.getContext().getTypeInfo(TypeToSize); - uint64_t Val = E->isSizeOf() ? Info.first : Info.second; - Val /= 8; // Return size in bytes, not bits. + uint64_t Val = CGF.getContext().getTypeSize(TypeToSize); + // Return size in bytes, not bits. + Val /= CGF.getContext().Target.getCharWidth(); return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); }