[cfe-commits] r62933 - /cfe/trunk/lib/CodeGen/CGExprScalar.cpp

Chris Lattner sabre at nondot.org
Sat Jan 24 13:09:45 PST 2009


Author: lattner
Date: Sat Jan 24 15:09:45 2009
New Revision: 62933

URL: http://llvm.org/viewvc/llvm-project?rev=62933&view=rev
Log:
remove a bunch of alignment handling code out of CGExprScalar, since
alignment must always be a constant.  Just let the constant folder 
do it.

Modified:
    cfe/trunk/lib/CodeGen/CGExprScalar.cpp

Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=62933&r1=62932&r2=62933&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Sat Jan 24 15:09:45 2009
@@ -673,45 +673,43 @@
 /// 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));
 }





More information about the cfe-commits mailing list