[cfe-commits] r59372 - /cfe/trunk/lib/CodeGen/CodeGenModule.cpp
Anders Carlsson
andersca at mac.com
Sat Nov 15 10:54:24 PST 2008
Author: andersca
Date: Sat Nov 15 12:54:24 2008
New Revision: 59372
URL: http://llvm.org/viewvc/llvm-project?rev=59372&view=rev
Log:
Handle padding in the constant CFString struct. Fixes PR3046.
Modified:
cfe/trunk/lib/CodeGen/CodeGenModule.cpp
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=59372&r1=59371&r2=59372&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sat Nov 15 12:54:24 2008
@@ -784,6 +784,34 @@
return MemSetFn = getIntrinsic(IID);
}
+static void appendFieldAndPadding(CodeGenModule &CGM,
+ std::vector<llvm::Constant*>& Fields,
+ int FieldNo, llvm::Constant* Field,
+ RecordDecl* RD, const llvm::StructType *STy)
+{
+ // Append the field.
+ Fields.push_back(Field);
+
+ int StructFieldNo =
+ CGM.getTypes().getLLVMFieldNo(RD->getMember(FieldNo));
+
+ int NextStructFieldNo;
+ if (FieldNo + 1 == RD->getNumMembers()) {
+ NextStructFieldNo = STy->getNumElements();
+ } else {
+ NextStructFieldNo =
+ CGM.getTypes().getLLVMFieldNo(RD->getMember(FieldNo + 1));
+ }
+
+ // Append padding
+ for (int i = StructFieldNo + 1; i < NextStructFieldNo; i++) {
+ llvm::Constant *C =
+ llvm::Constant::getNullValue(STy->getElementType(StructFieldNo + 1));
+
+ Fields.push_back(C);
+ }
+}
+
// We still need to work out the details of handling UTF-16.
// See: <rdr://2996215>
llvm::Constant *CodeGenModule::
@@ -817,29 +845,39 @@
llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2);
}
- std::vector<llvm::Constant*> Fields(4);
+ QualType CFTy = getContext().getCFConstantStringType();
+ RecordDecl *CFRD = CFTy->getAsRecordType()->getDecl();
+
+ const llvm::StructType *STy =
+ cast<llvm::StructType>(getTypes().ConvertType(CFTy));
+ std::vector<llvm::Constant*> Fields;
+
+
// Class pointer.
- Fields[0] = CFConstantStringClassRef;
+ appendFieldAndPadding(*this, Fields, 0, CFConstantStringClassRef, CFRD, STy);
// Flags.
const llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
- Fields[1] = llvm::ConstantInt::get(Ty, 0x07C8);
+ appendFieldAndPadding(*this, Fields, 1, llvm::ConstantInt::get(Ty, 0x07C8),
+ CFRD, STy);
// String pointer.
llvm::Constant *C = llvm::ConstantArray::get(str);
C = new llvm::GlobalVariable(C->getType(), true,
llvm::GlobalValue::InternalLinkage,
- C, ".str", &getModule());
- Fields[2] = llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2);
+ C, ".str", &getModule());
+ appendFieldAndPadding(*this, Fields, 2,
+ llvm::ConstantExpr::getGetElementPtr(C, Zeros, 2),
+ CFRD, STy);
// String length.
Ty = getTypes().ConvertType(getContext().LongTy);
- Fields[3] = llvm::ConstantInt::get(Ty, str.length());
+ appendFieldAndPadding(*this, Fields, 3, llvm::ConstantInt::get(Ty, str.length()),
+ CFRD, STy);
// The struct.
- Ty = getTypes().ConvertType(getContext().getCFConstantStringType());
- C = llvm::ConstantStruct::get(cast<llvm::StructType>(Ty), Fields);
+ C = llvm::ConstantStruct::get(STy, Fields);
llvm::GlobalVariable *GV =
new llvm::GlobalVariable(C->getType(), true,
llvm::GlobalVariable::InternalLinkage,
More information about the cfe-commits
mailing list