[llvm-commits] [llvm-gcc-4.2] r47180 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-internal.h llvm-types.cpp
Dale Johannesen
dalej at apple.com
Fri Feb 15 14:02:23 PST 2008
Author: johannes
Date: Fri Feb 15 16:02:22 2008
New Revision: 47180
URL: http://llvm.org/viewvc/llvm-project?rev=47180&view=rev
Log:
Put back fixed version of code to avoid copying
padding within structs (sometimes).
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-internal.h
llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=47180&r1=47179&r2=47180&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Feb 15 16:02:22 2008
@@ -1229,7 +1229,8 @@
/// CopyAggregate - Recursively traverse the potientially aggregate src/dest
/// ptrs, copying all of the elements.
-static void CopyAggregate(MemRef DestLoc, MemRef SrcLoc, LLVMBuilder &Builder) {
+static void CopyAggregate(MemRef DestLoc, MemRef SrcLoc, LLVMBuilder &Builder,
+ tree gccType) {
assert(DestLoc.Ptr->getType() == SrcLoc.Ptr->getType() &&
"Cannot copy between two pointers of different type!");
const Type *ElTy =
@@ -1246,6 +1247,8 @@
const StructLayout *SL = getTargetData().getStructLayout(STy);
Constant *Zero = ConstantInt::get(Type::Int32Ty, 0);
for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
+ if (gccType && isPaddingElement(gccType, i))
+ continue;
Constant *Idx = ConstantInt::get(Type::Int32Ty, i);
Value *Idxs[2] = { Zero, Idx };
Value *DElPtr = Builder.CreateGEP(DestLoc.Ptr, Idxs, Idxs + 2, "tmp");
@@ -1253,7 +1256,7 @@
unsigned Align = MinAlign(Alignment, SL->getElementOffset(i));
CopyAggregate(MemRef(DElPtr, Align, DestLoc.Volatile),
MemRef(SElPtr, Align, SrcLoc.Volatile),
- Builder);
+ Builder, 0);
}
} else {
const ArrayType *ATy = cast<ArrayType>(ElTy);
@@ -1267,7 +1270,7 @@
unsigned Align = MinAlign(Alignment, i * EltSize);
CopyAggregate(MemRef(DElPtr, Align, DestLoc.Volatile),
MemRef(SElPtr, Align, SrcLoc.Volatile),
- Builder);
+ Builder, 0);
}
}
}
@@ -1311,7 +1314,7 @@
CountAggregateElements(LLVMTy) <= 8) {
DestLoc.Ptr = BitCastToType(DestLoc.Ptr, PointerType::getUnqual(LLVMTy));
SrcLoc.Ptr = BitCastToType(SrcLoc.Ptr, PointerType::getUnqual(LLVMTy));
- CopyAggregate(DestLoc, SrcLoc, Builder);
+ CopyAggregate(DestLoc, SrcLoc, Builder, type);
return;
}
}
Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=47180&r1=47179&r2=47180&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Fri Feb 15 16:02:22 2008
@@ -116,7 +116,7 @@
/// Return true if and only if field no. N from struct type T is a padding
/// element added to match llvm struct type size and gcc struct type size.
-bool isPaddingElement(const Type *T, unsigned N);
+bool isPaddingElement(union tree_node*, unsigned N);
/// TypeConverter - Implement the converter from GCC types to LLVM types.
///
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=47180&r1=47179&r2=47180&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Fri Feb 15 16:02:22 2008
@@ -1577,13 +1577,13 @@
}
}
-std::map<const Type *, StructTypeConversionInfo *> StructTypeInfoMap;
+std::map<tree, StructTypeConversionInfo *> StructTypeInfoMap;
/// Return true if and only if field no. N from struct type T is a padding
/// element added to match llvm struct type size and gcc struct type size.
-bool isPaddingElement(const Type *Ty, unsigned index) {
+bool isPaddingElement(tree type, unsigned index) {
- StructTypeConversionInfo *Info = StructTypeInfoMap[Ty];
+ StructTypeConversionInfo *Info = StructTypeInfoMap[type];
// If info is not available then be conservative and return false.
if (!Info)
@@ -1600,10 +1600,10 @@
/// structs then adjust their PaddingElement bits. Padding
/// field in one struct may not be a padding field in another
/// struct.
-void adjustPaddingElement(const Type *OldTy, const Type *NewTy) {
+void adjustPaddingElement(tree oldtree, tree newtree) {
- StructTypeConversionInfo *OldInfo = StructTypeInfoMap[OldTy];
- StructTypeConversionInfo *NewInfo = StructTypeInfoMap[NewTy];
+ StructTypeConversionInfo *OldInfo = StructTypeInfoMap[oldtree];
+ StructTypeConversionInfo *NewInfo = StructTypeInfoMap[newtree];
if (!OldInfo || !NewInfo)
return;
@@ -2084,7 +2084,7 @@
RestoreBaseClassFields(type);
const Type *ResultTy = Info->getLLVMType();
- StructTypeInfoMap[ResultTy] = Info;
+ StructTypeInfoMap[type] = Info;
const OpaqueType *OldTy = cast_or_null<OpaqueType>(GET_TYPE_LLVM(type));
TypeDB.setType(type, ResultTy);
@@ -2148,6 +2148,7 @@
// match union size.
const TargetData &TD = getTargetData();
const Type *UnionTy = 0;
+ tree GccUnionTy = 0;
unsigned MaxSize = 0, MaxAlign = 0;
for (tree Field = TYPE_FIELDS(type); Field; Field = TREE_CHAIN(Field)) {
if (TREE_CODE(Field) != FIELD_DECL) continue;
@@ -2161,16 +2162,18 @@
integer_zerop(DECL_QUALIFIER(Field)))
continue;
- const Type *TheTy = ConvertType(TREE_TYPE(Field));
+ tree TheGccTy = TREE_TYPE(Field);
+ const Type *TheTy = ConvertType(TheGccTy);
unsigned Size = TD.getABITypeSize(TheTy);
unsigned Align = TD.getABITypeAlignment(TheTy);
- adjustPaddingElement(UnionTy, TheTy);
+ adjustPaddingElement(GccUnionTy, TheGccTy);
// Select TheTy as union type if it meets one of the following criteria
// 1) UnionTy is 0
// 2) TheTy alignment is more then UnionTy
- // 3) TheTy size is greater than UnionTy size and TheTy alignment is equal to UnionTy
+ // 3) TheTy size is greater than UnionTy size and TheTy alignment is
+ // equal to UnionTy
// 4) TheTy size is greater then UnionTy size and TheTy is packed
bool useTheTy = false;
if (UnionTy == 0)
@@ -2184,6 +2187,7 @@
if (useTheTy) {
UnionTy = TheTy;
+ GccUnionTy = TheGccTy;
MaxSize = MAX(MaxSize, Size);
MaxAlign = Align;
}
More information about the llvm-commits
mailing list