[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