[cfe-commits] r59433 - /cfe/trunk/lib/CodeGen/CGExprConstant.cpp

Anders Carlsson andersca at mac.com
Sun Nov 16 17:58:56 PST 2008


Author: andersca
Date: Sun Nov 16 19:58:55 2008
New Revision: 59433

URL: http://llvm.org/viewvc/llvm-project?rev=59433&view=rev
Log:
More expr constant work. (Off by default).

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

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Sun Nov 16 19:58:55 2008
@@ -106,7 +106,7 @@
     unsigned i = 0;
     bool RewriteType = false;
     for (; i < NumInitableElts; ++i) {
-      llvm::Constant *C = Visit(ILE->getInit(i));
+      llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF);
       RewriteType |= (C->getType() != ElemTy);
       Elts.push_back(C);
     }
@@ -130,7 +130,7 @@
   void InsertBitfieldIntoStruct(std::vector<llvm::Constant*>& Elts,
                                 FieldDecl* Field, Expr* E) {
     // Calculate the value to insert
-    llvm::Constant *C = Visit(E);
+    llvm::Constant *C = CGM.EmitConstantExpr(E, CGF);
     llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C);
     if (!CI) {
       CGM.ErrorUnsupported(E, "bitfield initialization");
@@ -213,7 +213,7 @@
         InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(EltNo));
       } else {
         unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(curField);
-        llvm::Constant* C = Visit(ILE->getInit(EltNo));
+        llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(EltNo), CGF);
         RewriteType |= (C->getType() != Elts[FieldNo]->getType());
         Elts[FieldNo] = C;
       }
@@ -261,7 +261,7 @@
       return llvm::ConstantArray::get(RetTy, Elts);
     }
 
-    llvm::Constant *C = Visit(ILE->getInit(0));
+    llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(0), CGF);
 
     // Build a struct with the union sub-element as the first member,
     // and padded to the appropriate size
@@ -296,7 +296,7 @@
     // Copy initializer elements.
     unsigned i = 0;
     for (; i < NumInitableElts; ++i) {
-      llvm::Constant *C = Visit(ILE->getInit(i));
+      llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF);
       Elts.push_back(C);
     }
 
@@ -310,7 +310,7 @@
     if (ILE->getType()->isScalarType()) {
       // We have a scalar in braces. Just use the first element.
       if (ILE->getNumInits() > 0)
-        return Visit(ILE->getInit(0));
+        return CGM.EmitConstantExpr(ILE->getInit(0), CGF);
 
       const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType());
       return llvm::Constant::getNullValue(RetTy);
@@ -854,10 +854,19 @@
                                                       V.getLValueOffset());
       
       if (const Expr *LVBase = V.getLValueBase()) {
-        llvm::Constant *Base = 
+        llvm::Constant *C = 
           ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase));
 
-        return llvm::ConstantExpr::getGetElementPtr(Base, &Offset, 1);
+        const llvm::Type *Type = 
+          llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+        const llvm::Type *DestType = C->getType();
+        
+        // FIXME: It's a little ugly that we need to cast to a pointer,
+        // apply the GEP and then cast back.
+        C = llvm::ConstantExpr::getBitCast(C, Type);
+        C = llvm::ConstantExpr::getGetElementPtr(C, &Offset, 1);
+        
+        return llvm::ConstantExpr::getBitCast(C, DestType);
       }
       
       return llvm::ConstantExpr::getIntToPtr(Offset, 
@@ -873,6 +882,14 @@
       return C;
     case APValue::Float:
       return llvm::ConstantFP::get(V.getFloat());
+    case APValue::ComplexFloat: {
+      llvm::Constant *Complex[2];
+      
+      Complex[0] = llvm::ConstantFP::get(V.getComplexFloatReal());
+      Complex[1] = llvm::ConstantFP::get(V.getComplexFloatImag());
+      
+      return llvm::ConstantStruct::get(Complex, 2);
+    }
     }
   }
 #else





More information about the cfe-commits mailing list