// Register the default SparcV9 implementation...
RegisterPass<TargetData> X("targetdata", "Target Data Layout");
}
+char TargetData::ID = 0;
//===----------------------------------------------------------------------===//
// Support for StructLayout
while (!temp.empty()) {
std::string token = getToken(temp, "-");
-
std::string arg0 = getToken(token, ":");
const char *p = arg0.c_str();
- AlignTypeEnum align_type;
- uint32_t size;
- unsigned char abi_align;
- unsigned char pref_align;
-
switch(*p) {
case 'E':
LittleEndian = false;
case 'v':
case 'f':
case 'a': {
- align_type = (*p == 'i' ? INTEGER_ALIGN :
- (*p == 'f' ? FLOAT_ALIGN :
- (*p == 'v' ? VECTOR_ALIGN : AGGREGATE_ALIGN)));
- size = (uint32_t) atoi(++p);
- abi_align = atoi(getToken(token, ":").c_str()) / 8;
- pref_align = atoi(getToken(token, ":").c_str()) / 8;
+ AlignTypeEnum align_type =
+ (*p == 'i' ? INTEGER_ALIGN : (*p == 'f' ? FLOAT_ALIGN :
+ (*p == 'v' ? VECTOR_ALIGN : AGGREGATE_ALIGN)));
+ uint32_t size = (uint32_t) atoi(++p);
+ unsigned char abi_align = atoi(getToken(token, ":").c_str()) / 8;
+ unsigned char pref_align = atoi(getToken(token, ":").c_str()) / 8;
if (pref_align == 0)
pref_align = abi_align;
setAlignment(align_type, abi_align, pref_align, size);
}
}
-TargetData::TargetData(const Module *M) {
+TargetData::TargetData(const Module *M)
+ : ImmutablePass((intptr_t)&ID) {
init(M->getDataLayout());
}
// Otherwise, create the struct layout. Because it is variable length, we
// malloc it, then use placement new.
- unsigned NumElts = Ty->getNumElements();
+ int NumElts = Ty->getNumElements();
StructLayout *L =
(StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t));
unsigned char Alignment;
Size = getTypeSize(ATy->getElementType());
Alignment = getABITypeAlignment(ATy->getElementType());
- unsigned AlignedSize = (Size + Alignment - 1)/Alignment*Alignment;
+ uint64_t AlignedSize = (Size + Alignment - 1)/Alignment*Alignment;
return AlignedSize*ATy->getNumElements();
}
case Type::StructTyID: {
case Type::DoubleTyID:
AlignType = FLOAT_ALIGN;
break;
- case Type::VectorTyID:
- AlignType = VECTOR_ALIGN;
+ case Type::VectorTyID: {
+ const VectorType *VTy = cast<VectorType>(Ty);
+ // Degenerate vectors are assumed to be scalar-ized
+ if (VTy->getNumElements() == 1)
+ return getAlignment(VTy->getElementType(), abi_or_pref);
+ else
+ AlignType = VECTOR_ALIGN;
break;
+ }
default:
assert(0 && "Bad type for getAlignment!!!");
break;
TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices);
for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) {
if (const StructType *STy = dyn_cast<StructType>(*TI)) {
- assert(Indices[CurIDX]->getType() == Type::Int32Ty &&"Illegal struct idx");
+ assert(Indices[CurIDX]->getType() == Type::Int32Ty &&
+ "Illegal struct idx");
unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
// Get structure layout information...