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

Duncan Sands baldrick at free.fr
Sun Nov 15 09:18:35 PST 2009


Author: baldrick
Date: Sun Nov 15 11:18:35 2009
New Revision: 88854

URL: http://llvm.org/viewvc/llvm-project?rev=88854&view=rev
Log:
Add some additional sanity checking.

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

Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=88854&r1=88853&r2=88854&view=diff

==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Sun Nov 15 11:18:35 2009
@@ -2159,8 +2159,11 @@
   assert(is_gimple_reg_type(TREE_TYPE(reg)) && "Not of register type!");
 
   DenseMap<tree, AssertingVH<> >::iterator I = SSANames.find(reg);
-  if (I != SSANames.end())
+  if (I != SSANames.end()) {
+    assert(I->second->getType() == ConvertType(TREE_TYPE(reg)) &&
+           "SSA name has wrong type!");
     return I->second;
+  }
 
   // This SSA name is the default definition for the underlying symbol.
   assert(SSA_NAME_IS_DEFAULT_DEF(reg) && "SSA name used before being defined!");
@@ -2172,6 +2175,8 @@
   // If the variable is itself an ssa name, use its LLVM value.
   if (TREE_CODE (var) == SSA_NAME) {
     Value *Val = EmitSSA_NAME(var);
+    assert(Val->getType() == ConvertType(TREE_TYPE(reg)) &&
+           "SSA name has wrong type!");
     return SSANames[reg] = Val;
   }
 
@@ -2241,6 +2246,8 @@
   if (SavedInsertBB != EntryBlock)
     Builder.SetInsertPoint(SavedInsertBB, SavedInsertPoint);
 
+  assert(Address->getType() == ConvertType(TREE_TYPE(reg)) &&
+         "Invariant address has wrong type!");
   return Address;
 }
 
@@ -2248,22 +2255,32 @@
 Constant *TreeToLLVM::EmitGimpleConstant(tree reg) {
   assert(is_gimple_constant(reg) && "Not a gimple constant!");
   assert(is_gimple_reg_type(TREE_TYPE(reg)) && "Not of register type!");
+
+  Constant *C;
   switch (TREE_CODE(reg)) {
   default:
     debug_tree(reg);
     llvm_unreachable("Unhandled GIMPLE constant!");
 
   case INTEGER_CST:
-    return TreeConstantToLLVM::ConvertINTEGER_CST(reg);
+    C = TreeConstantToLLVM::ConvertINTEGER_CST(reg);
+    break;
   case REAL_CST:
-    return TreeConstantToLLVM::ConvertREAL_CST(reg);
+    C = TreeConstantToLLVM::ConvertREAL_CST(reg);
+    break;
   case COMPLEX_CST:
-    return TreeConstantToLLVM::ConvertCOMPLEX_CST(reg);
+    C = TreeConstantToLLVM::ConvertCOMPLEX_CST(reg);
+    break;
   case VECTOR_CST:
-    return TreeConstantToLLVM::ConvertVECTOR_CST(reg);
+    C = TreeConstantToLLVM::ConvertVECTOR_CST(reg);
+    break;
   case CONSTRUCTOR:
-    return TreeConstantToLLVM::ConvertCONSTRUCTOR(reg);
+    C = TreeConstantToLLVM::ConvertCONSTRUCTOR(reg);
+    break;
   }
+  assert(C->getType() == ConvertType(TREE_TYPE(reg)) &&
+         "Constant has wrong type!");
+  return C;
 }
 
 Value *TreeToLLVM::EmitGimpleAssignRHS(gimple stmt, const MemRef *DestLoc) {

Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=88854&r1=88853&r2=88854&view=diff

==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Sun Nov 15 11:18:35 2009
@@ -500,17 +500,21 @@
   /// EmitGimpleMinInvariant - The given value is constant in this function.
   /// Return the corresponding LLVM value. Only creates code in the entry block.
   Value *EmitGimpleMinInvariant(tree_node *reg) {
-    if (TREE_CODE(reg) == ADDR_EXPR)
-      return EmitGimpleInvariantAddress(reg);
-    return EmitGimpleConstant(reg);
+    Value *V = (TREE_CODE(reg) == ADDR_EXPR) ?
+      EmitGimpleInvariantAddress(reg) : EmitGimpleConstant(reg);
+    assert(V->getType() == ConvertType(TREE_TYPE(reg)) &&
+           "Gimple min invariant has wrong type!");
+    return V;
   }
 
   /// EmitGimpleReg - Convert the specified gimple register or local constant of
   /// register type to an LLVM value.  Only creates code in the entry block.
   Value *EmitGimpleReg(tree_node *reg) {
-    if (TREE_CODE(reg) == SSA_NAME)
-      return EmitSSA_NAME(reg);
-    return EmitGimpleMinInvariant(reg);
+    Value *V = (TREE_CODE(reg) == SSA_NAME) ?
+      EmitSSA_NAME(reg) : EmitGimpleMinInvariant(reg);
+    assert(V->getType() == ConvertType(TREE_TYPE(reg)) &&
+           "Gimple register has wrong type!");
+    return V;
   }
 
   /// Emit - Convert the specified tree node to LLVM code.  If the node is an

Modified: dragonegg/trunk/llvm-types.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-types.cpp?rev=88854&r1=88853&r2=88854&view=diff

==============================================================================
--- dragonegg/trunk/llvm-types.cpp (original)
+++ dragonegg/trunk/llvm-types.cpp Sun Nov 15 11:18:35 2009
@@ -69,6 +69,34 @@
 
 const Type *llvm_set_type(tree Tr, const Type *Ty) {
   assert(TYPE_P(Tr) && "Expected a gcc type!");
+
+  // Check that the LLVM and GCC types have the same size, or, if the type has
+  // variable size, that the LLVM type is not bigger than any possible value of
+  // the GCC type.
+#ifndef NDEBUG
+  if (TYPE_SIZE(Tr) && Ty->isSized()) {
+    if (isInt64(TYPE_SIZE(Tr), true)) {
+      // Type with constant (and not humongous) size.  Sizes must be equal.
+      assert(getInt64(TYPE_SIZE(Tr), true) ==
+             getTargetData().getTypeAllocSizeInBits(Ty) &&
+             "LLVM type size doesn't match GCC type size!");
+    } else {
+      // Type with variable or humongous size.  LLVM size must be smaller or
+      // equal to the GCC size.
+      // TODO: Implement an effective check here.  Size expressions can be too
+      // complicated for "fold" to simplify effectively; this mostly seems to be
+      // due to Ada's size type and bitsize types being signed (meaning that the
+      // folder can't always tell that values are non-negative).
+//TODO      tree LLVMSize = build_int_cst(TREE_TYPE(TYPE_SIZE(Tr)),
+//TODO                                    getTargetData().getTypeAllocSizeInBits(Ty));
+//TODO      tree isSmaller = fold_build2(LE_EXPR, boolean_type_node, LLVMSize,
+//TODO                                   TYPE_SIZE(Tr));
+//TODO      assert(integer_onep(isSmaller) &&
+//TODO             "LLVM type may be larger than GCC type!");
+    }
+  }
+#endif
+
   return (const Type *)llvm_set_cached(Tr, Ty);
 }
 





More information about the llvm-commits mailing list