aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprScalar.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-01-24 21:09:45 +0000
committerChris Lattner <sabre@nondot.org>2009-01-24 21:09:45 +0000
commit91daf4da934e10dcbf22697d59e2791420b1507a (patch)
tree887f25d3b7a458018bfbe9b214ac38ec1284aaf9 /lib/CodeGen/CGExprScalar.cpp
parente9feb475d72ba50dc29cec62a8c47cae721065eb (diff)
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
Diffstat (limited to 'lib/CodeGen/CGExprScalar.cpp')
-rw-r--r--lib/CodeGen/CGExprScalar.cpp38
1 files changed, 18 insertions, 20 deletions
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<uint32_t>(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<RecordDecl*>(
CGF.getContext().addRecordToClass(OI));
TypeToSize = CGF.getContext().getTagDeclType(static_cast<TagDecl*>(RD));
}
- std::pair<uint64_t, unsigned> 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));
}