]> granicus.if.org Git - clang/commitdiff
Add a destination type argument to EmitConstantExpr. This will be used for when the...
authorAnders Carlsson <andersca@mac.com>
Wed, 8 Apr 2009 04:48:15 +0000 (04:48 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 8 Apr 2009 04:48:15 +0000 (04:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68593 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBuiltin.cpp
lib/CodeGen/CGDecl.cpp
lib/CodeGen/CGExprConstant.cpp
lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h

index 0b40ec76e80e39450144fa4b1ad1739ae4d041d3..8767eb4fb363be4364833c1ebd02b02dc3c918e5 100644 (file)
@@ -66,7 +66,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
   switch (BuiltinID) {
   default: break;  // Handle intrinsics and libm functions below.
   case Builtin::BI__builtin___CFStringMakeConstantString:
-    return RValue::get(CGM.EmitConstantExpr(E, 0));
+    return RValue::get(CGM.EmitConstantExpr(E, E->getType(), 0));
   case Builtin::BI__builtin_stdarg_start:
   case Builtin::BI__builtin_va_start:
   case Builtin::BI__builtin_va_end: {
index b8f5ca85cf56982c3ad26a0ec06f75f77fe67c0e..f0822675f8772b1be4873d2e733279a4562b8730 100644 (file)
@@ -121,7 +121,7 @@ void CodeGenFunction::EmitStaticBlockVarDecl(const VarDecl &D) {
   DMEntry = GV;
 
   if (D.getInit()) {
-    llvm::Constant *Init = CGM.EmitConstantExpr(D.getInit(), this);
+    llvm::Constant *Init = CGM.EmitConstantExpr(D.getInit(), D.getType(), this);
 
     // If constant emission failed, then this should be a C++ static
     // initializer.
index 51ad5b67b89c72b055bc8c303c9288226cac76cd..35b3a3750a391bea276bc4b5fa014695cbe48834 100644 (file)
@@ -55,7 +55,9 @@ public:
     // GCC cast to union extension
     if (E->getType()->isUnionType()) {
       const llvm::Type *Ty = ConvertType(E->getType());
-      return EmitUnion(CGM.EmitConstantExpr(E->getSubExpr(), CGF), Ty);
+      Expr *SubExpr = E->getSubExpr();
+      return EmitUnion(CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF), 
+                       Ty);
     }
     if (CGM.getContext().getCanonicalType(E->getSubExpr()->getType()) ==
         CGM.getContext().getCanonicalType(E->getType())) {
@@ -91,7 +93,8 @@ public:
     unsigned i = 0;
     bool RewriteType = false;
     for (; i < NumInitableElts; ++i) {
-      llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF);
+      Expr *Init = ILE->getInit(i);
+      llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
       if (!C)
         return 0;
       RewriteType |= (C->getType() != ElemTy);
@@ -117,7 +120,7 @@ public:
   void InsertBitfieldIntoStruct(std::vector<llvm::Constant*>& Elts,
                                 FieldDecl* Field, Expr* E) {
     // Calculate the value to insert
-    llvm::Constant *C = CGM.EmitConstantExpr(E, CGF);
+    llvm::Constant *C = CGM.EmitConstantExpr(E, Field->getType(), CGF);
     if (!C)
       return;
 
@@ -204,7 +207,8 @@ public:
         InsertBitfieldIntoStruct(Elts, *Field, ILE->getInit(EltNo));
       } else {
         unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(*Field);
-        llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(EltNo), CGF);
+        llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(EltNo), 
+                                                 Field->getType(), CGF);
         if (!C) return 0;
         RewriteType |= (C->getType() != Elts[FieldNo]->getType());
         Elts[FieldNo] = C;
@@ -283,7 +287,8 @@ public:
       return llvm::ConstantArray::get(RetTy, Elts);
     }
 
-    return EmitUnion(CGM.EmitConstantExpr(ILE->getInit(0), CGF), Ty);
+    Expr *Init = ILE->getInit(0);
+    return EmitUnion(CGM.EmitConstantExpr(Init, Init->getType(), CGF), Ty);
   }
 
   llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) {
@@ -299,7 +304,8 @@ public:
     // Copy initializer elements.
     unsigned i = 0;
     for (; i < NumInitableElts; ++i) {
-      llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF);
+      Expr *Init = ILE->getInit(i);
+      llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
       if (!C)
         return 0;
       Elts.push_back(C);
@@ -319,9 +325,10 @@ public:
   llvm::Constant *VisitInitListExpr(InitListExpr *ILE) {
     if (ILE->getType()->isScalarType()) {
       // We have a scalar in braces. Just use the first element.
-      if (ILE->getNumInits() > 0)
-        return CGM.EmitConstantExpr(ILE->getInit(0), CGF);
-
+      if (ILE->getNumInits() > 0) {
+        Expr *Init = ILE->getInit(0);
+        return CGM.EmitConstantExpr(Init, Init->getType(), CGF);
+      }
       const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType());
       return llvm::Constant::getNullValue(RetTy);
     }
@@ -463,6 +470,7 @@ public:
 }  // end anonymous namespace.
 
 llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
+                                                QualType DestType,
                                                 CodeGenFunction *CGF) {
   Expr::EvalResult Result;
   
index 508d7ce2b6f302ff52ec1b6a86604c7326b6947c..2c1ab1f8b59b82d0adad24312cd414c05da2986d 100644 (file)
@@ -693,7 +693,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
     }
     Init = llvm::Constant::getNullValue(InitTy);
   } else {
-    Init = EmitConstantExpr(D->getInit());
+    Init = EmitConstantExpr(D->getInit(), D->getType());
     if (!Init) {
       ErrorUnsupported(D, "static initializer");
       QualType T = D->getInit()->getType();
index 8661d23caf6a6236c7c3ff7d1ed366b25c30fdc0..71cfb6409803f1b981cd875f3612e1b0b8472b0f 100644 (file)
@@ -256,7 +256,8 @@ public:
   /// EmitConstantExpr - Try to emit the given expression as a
   /// constant; returns 0 if the expression cannot be emitted as a
   /// constant.
-  llvm::Constant *EmitConstantExpr(const Expr *E, CodeGenFunction *CGF = 0);
+  llvm::Constant *EmitConstantExpr(const Expr *E, QualType DestType,
+                                   CodeGenFunction *CGF = 0);
 
   llvm::Constant *EmitAnnotateAttr(llvm::GlobalValue *GV,
                                    const AnnotateAttr *AA, unsigned LineNo);