[llvm-commits] [dragonegg] r124128 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h

Duncan Sands baldrick at free.fr
Mon Jan 24 10:04:13 PST 2011


Author: baldrick
Date: Mon Jan 24 12:04:13 2011
New Revision: 124128

URL: http://llvm.org/viewvc/llvm-project?rev=124128&view=rev
Log:
Taking a VIEW_CONVERT_EXPR of a REAL_CST requires an lvalue for the REAL_CST.
Provide one rather than crashing!

Modified:
    dragonegg/trunk/llvm-convert.cpp
    dragonegg/trunk/llvm-internal.h

Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=124128&r1=124127&r2=124128&view=diff
==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Mon Jan 24 12:04:13 2011
@@ -1258,6 +1258,11 @@
     LV = LValue(Ptr, get_constant_alignment(exp) / 8);
     break;
   }
+  case REAL_CST: {
+    Value *Ptr = TreeConstantToLLVM::EmitLV_REAL_CST(exp);
+    LV = LValue(Ptr, get_constant_alignment(exp) / 8);
+    break;
+  }
   case STRING_CST: {
     Value *Ptr = TreeConstantToLLVM::EmitLV_STRING_CST(exp);
     LV = LValue(Ptr, get_constant_alignment(exp) / 8);
@@ -8717,6 +8722,9 @@
   case COMPLEX_CST:
     LV = EmitLV_COMPLEX_CST(exp);
     break;
+  case REAL_CST:
+    LV = EmitLV_REAL_CST(exp);
+    break;
   case STRING_CST:
     LV = EmitLV_STRING_CST(exp);
     break;
@@ -8796,6 +8804,21 @@
   return Slot;
 }
 
+Constant *TreeConstantToLLVM::EmitLV_REAL_CST(tree exp) {
+  Constant *Init = TreeConstantToLLVM::ConvertREAL_CST(exp);
+
+  // Cache the constants to avoid making obvious duplicates that have to be
+  // folded by the optimizer.
+  static std::map<Constant*, GlobalVariable*> RealCSTCache;
+  GlobalVariable *&Slot = RealCSTCache[Init];
+  if (Slot) return Slot;
+
+  // Create a new real global.
+  Slot = new GlobalVariable(*TheModule, Init->getType(), true,
+                            GlobalVariable::PrivateLinkage, Init, ".rl");
+  return Slot;
+}
+
 Constant *TreeConstantToLLVM::EmitLV_STRING_CST(tree exp) {
   Constant *Init = TreeConstantToLLVM::ConvertSTRING_CST(exp);
 

Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=124128&r1=124127&r2=124128&view=diff
==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Mon Jan 24 12:04:13 2011
@@ -844,6 +844,7 @@
   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_REAL_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);





More information about the llvm-commits mailing list