Allow complex constants to be used as lvalues.
llvm-svn: 41223
diff --git a/llvm-gcc-4.2/gcc/llvm-convert.cpp b/llvm-gcc-4.2/gcc/llvm-convert.cpp
index 4c9c8d0..03b7ec3 100644
--- a/llvm-gcc-4.2/gcc/llvm-convert.cpp
+++ b/llvm-gcc-4.2/gcc/llvm-convert.cpp
@@ -1008,8 +1008,9 @@
case IMAGPART_EXPR: return EmitLV_XXXXPART_EXPR(exp, 1);
// Constants.
- case LABEL_DECL: return TreeConstantToLLVM::EmitLV_LABEL_DECL(exp);
- case STRING_CST: return LValue(TreeConstantToLLVM::EmitLV_STRING_CST(exp));
+ case LABEL_DECL: return TreeConstantToLLVM::EmitLV_LABEL_DECL(exp);
+ case COMPLEX_CST: return LValue(TreeConstantToLLVM::EmitLV_COMPLEX_CST(exp));
+ case STRING_CST: return LValue(TreeConstantToLLVM::EmitLV_STRING_CST(exp));
// Type Conversion.
case VIEW_CONVERT_EXPR: return EmitLV_VIEW_CONVERT_EXPR(exp);
@@ -5756,6 +5757,7 @@
case CONST_DECL:
case VAR_DECL: return EmitLV_Decl(exp);
case LABEL_DECL: return EmitLV_LABEL_DECL(exp);
+ case COMPLEX_CST: return EmitLV_COMPLEX_CST(exp);
case STRING_CST: return EmitLV_STRING_CST(exp);
case COMPONENT_REF: return EmitLV_COMPONENT_REF(exp);
case ARRAY_RANGE_REF:
@@ -5817,6 +5819,22 @@
return ConstantExpr::getIntToPtr(C, PointerType::get(Type::Int8Ty));
}
+Constant *TreeConstantToLLVM::EmitLV_COMPLEX_CST(tree exp) {
+ Constant *Init = TreeConstantToLLVM::ConvertCOMPLEX_CST(exp);
+
+ // Cache the constants to avoid making obvious duplicates that have to be
+ // folded by the optimizer.
+ static std::map<Constant*, GlobalVariable*> ComplexCSTCache;
+ GlobalVariable *&Slot = ComplexCSTCache[Init];
+ if (Slot) return Slot;
+
+ // Create a new complex global.
+ Slot = new GlobalVariable(Init->getType(), true,
+ GlobalVariable::InternalLinkage,
+ Init, ".cpx", TheModule);
+ return Slot;
+}
+
Constant *TreeConstantToLLVM::EmitLV_STRING_CST(tree exp) {
Constant *Init = TreeConstantToLLVM::ConvertSTRING_CST(exp);
diff --git a/llvm-gcc-4.2/gcc/llvm-internal.h b/llvm-gcc-4.2/gcc/llvm-internal.h
index 91d91c3..ac3d433 100644
--- a/llvm-gcc-4.2/gcc/llvm-internal.h
+++ b/llvm-gcc-4.2/gcc/llvm-internal.h
@@ -593,6 +593,7 @@
static Constant *EmitLV(tree_node *exp);
static Constant *EmitLV_Decl(tree_node *exp);
static Constant *EmitLV_LABEL_DECL(tree_node *exp);
+ static Constant *EmitLV_COMPLEX_CST(tree_node *exp);
static Constant *EmitLV_STRING_CST(tree_node *exp);
static Constant *EmitLV_COMPONENT_REF(tree_node *exp);
static Constant *EmitLV_ARRAY_REF(tree_node *exp);