diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGDecl.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 26 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 3 |
5 files changed, 22 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 0b40ec76e80..8767eb4fb36 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -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: { diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index b8f5ca85cf5..f0822675f87 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -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. diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 51ad5b67b89..35b3a3750a3 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -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; diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 508d7ce2b6f..2c1ab1f8b59 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -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(); diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 8661d23caf6..71cfb640980 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -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); |