some cleanups on top of David's patch. There are still two
remaining open issues I've communicated to him:
1) self can be assigned to, and his patch didn't handle it correctly.
2) CollectObjCIvarTypes is N^2 (because each subclass reprocesses
all parent class ivars) and flattens classes. If A derives from B,
and both have an int, I'd expect to get { {i32}, i32}, not { i32, i32}.
David, please review.
llvm-svn: 48970
This commit is contained in:
@@ -41,9 +41,8 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
|
||||
|
||||
CodeGenModule::~CodeGenModule() {
|
||||
llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction();
|
||||
if (ObjCInitFunction) {
|
||||
if (ObjCInitFunction)
|
||||
AddGlobalCtor(ObjCInitFunction);
|
||||
}
|
||||
EmitGlobalCtors();
|
||||
delete Runtime;
|
||||
}
|
||||
@@ -80,15 +79,15 @@ void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor) {
|
||||
/// called on module load, if any have been registered with AddGlobalCtor.
|
||||
void CodeGenModule::EmitGlobalCtors() {
|
||||
if (GlobalCtors.empty()) return;
|
||||
|
||||
// Get the type of @llvm.global_ctors
|
||||
std::vector<const llvm::Type*> CtorFields;
|
||||
CtorFields.push_back(llvm::IntegerType::get(32));
|
||||
// Constructor function type
|
||||
std::vector<const llvm::Type*> VoidArgs;
|
||||
llvm::FunctionType* CtorFuncTy = llvm::FunctionType::get(
|
||||
llvm::Type::VoidTy,
|
||||
VoidArgs,
|
||||
false);
|
||||
llvm::FunctionType* CtorFuncTy =
|
||||
llvm::FunctionType::get(llvm::Type::VoidTy, VoidArgs, false);
|
||||
|
||||
// i32, function type pair
|
||||
const llvm::Type *FPType = llvm::PointerType::getUnqual(CtorFuncTy);
|
||||
llvm::StructType* CtorStructTy =
|
||||
@@ -120,7 +119,6 @@ void CodeGenModule::EmitGlobalCtors() {
|
||||
|
||||
GlobalCtorsVal->setInitializer(llvm::ConstantArray::get(GlobalCtorsTy,
|
||||
CtorValues));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user