summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp2
-rw-r--r--clang/lib/CodeGen/CGDecl.cpp2
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp26
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp2
-rw-r--r--clang/lib/CodeGen/CodeGenModule.h3
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);
OpenPOWER on IntegriCloud