Author: johannes Date: Tue Jan 8 18:16:55 2008 New Revision: 45765 URL: http://llvm.org/viewvc/llvm-project?rev=45765&view=rev Log: Watch out for overflow rounding up sizes of large objects.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=45765&r1=45764&r2=45765&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Tue Jan 8 18:16:55 2008 @@ -1706,14 +1706,25 @@ // compensated as far as LLVM's translation code is concerned; now we // have fixed that, and have to fix the size also. if (TYPE_SIZE (type) && TREE_CODE(TYPE_SIZE(type)) == INTEGER_CST) { - TYPE_SIZE(type) = build_int_cst( - TREE_TYPE(TYPE_SIZE(type)), - (TREE_INT_CST_LOW(TYPE_SIZE(type))+TYPE_ALIGN(type)-1) & - ~(TYPE_ALIGN(type)-1)); - TYPE_SIZE_UNIT(type) = build_int_cst( - TREE_TYPE(TYPE_SIZE_UNIT(type)), - (TREE_INT_CST_LOW(TYPE_SIZE_UNIT(type))+TYPE_ALIGN_UNIT(type)-1) & - ~(TYPE_ALIGN_UNIT(type)-1)); + // This computes (size+align-1) & ~(align-1) + // NB "sizetype" is #define'd in one of the gcc headers. Gotcha! + tree size_type = TREE_TYPE(TYPE_SIZE(type)); + tree alignm1 = fold_build2(PLUS_EXPR, size_type, + build_int_cst(size_type, TYPE_ALIGN(type)), + fold_build1(NEGATE_EXPR, size_type, + build_int_cst(size_type, 1))); + tree lhs = fold_build2(PLUS_EXPR, size_type, TYPE_SIZE(type), alignm1); + tree rhs = fold_build1(BIT_NOT_EXPR, size_type, alignm1); + TYPE_SIZE(type) = fold_build2(BIT_AND_EXPR, size_type, lhs, rhs); + + size_type = TREE_TYPE(TYPE_SIZE_UNIT(type)); + alignm1 = fold_build2(PLUS_EXPR, size_type, + build_int_cst(size_type, TYPE_ALIGN_UNIT(type)), + fold_build1(NEGATE_EXPR, size_type, + build_int_cst(size_type, 1))); + lhs = fold_build2(PLUS_EXPR, size_type, TYPE_SIZE_UNIT(type), alignm1); + rhs = fold_build1(BIT_NOT_EXPR, size_type, alignm1); + TYPE_SIZE_UNIT(type) = fold_build2(BIT_AND_EXPR, size_type, lhs, rhs); } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits