forked from OSchip/llvm-project
IRgen/NeXT: Fix several alignment issues with Objective-C metadata symbols:
- Fix some places that had the alignment hard coded. - Use ABI type alignment, not preferred type alignment -- neither of this is exactly right, as we really want the C type alignment as required by the runtime, but the ABI alignment is a more correct choice. This should be equivalent for x86_64, but fixes the alignment for ARM. llvm-svn: 102314
This commit is contained in:
parent
e4273bc38c
commit
710cb20cd6
|
@ -4202,7 +4202,7 @@ void CGObjCNonFragileABIMac::AddModuleClassList(const
|
||||||
llvm::GlobalValue::InternalLinkage,
|
llvm::GlobalValue::InternalLinkage,
|
||||||
Init,
|
Init,
|
||||||
SymbolName);
|
SymbolName);
|
||||||
GV->setAlignment(8);
|
GV->setAlignment(CGM.getTargetData().getABITypeAlignment(Init->getType()));
|
||||||
GV->setSection(SectionName);
|
GV->setSection(SectionName);
|
||||||
CGM.AddUsedGlobal(GV);
|
CGM.AddUsedGlobal(GV);
|
||||||
}
|
}
|
||||||
|
@ -4399,7 +4399,7 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
|
||||||
std::string("\01l_OBJC_METACLASS_RO_$_")+ClassName :
|
std::string("\01l_OBJC_METACLASS_RO_$_")+ClassName :
|
||||||
std::string("\01l_OBJC_CLASS_RO_$_")+ClassName);
|
std::string("\01l_OBJC_CLASS_RO_$_")+ClassName);
|
||||||
CLASS_RO_GV->setAlignment(
|
CLASS_RO_GV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.ClassRonfABITy));
|
CGM.getTargetData().getABITypeAlignment(ObjCTypes.ClassRonfABITy));
|
||||||
CLASS_RO_GV->setSection("__DATA, __objc_const");
|
CLASS_RO_GV->setSection("__DATA, __objc_const");
|
||||||
return CLASS_RO_GV;
|
return CLASS_RO_GV;
|
||||||
|
|
||||||
|
@ -4435,7 +4435,7 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassMetaData(
|
||||||
GV->setInitializer(Init);
|
GV->setInitializer(Init);
|
||||||
GV->setSection("__DATA, __objc_data");
|
GV->setSection("__DATA, __objc_data");
|
||||||
GV->setAlignment(
|
GV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.ClassnfABITy));
|
CGM.getTargetData().getABITypeAlignment(ObjCTypes.ClassnfABITy));
|
||||||
if (HiddenVisibility)
|
if (HiddenVisibility)
|
||||||
GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
||||||
return GV;
|
return GV;
|
||||||
|
@ -4685,7 +4685,7 @@ void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
|
||||||
Init,
|
Init,
|
||||||
ExtCatName);
|
ExtCatName);
|
||||||
GCATV->setAlignment(
|
GCATV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.CategorynfABITy));
|
CGM.getTargetData().getABITypeAlignment(ObjCTypes.CategorynfABITy));
|
||||||
GCATV->setSection("__DATA, __objc_const");
|
GCATV->setSection("__DATA, __objc_const");
|
||||||
CGM.AddUsedGlobal(GCATV);
|
CGM.AddUsedGlobal(GCATV);
|
||||||
DefinedCategories.push_back(GCATV);
|
DefinedCategories.push_back(GCATV);
|
||||||
|
@ -4745,7 +4745,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitMethodList(llvm::Twine Name,
|
||||||
Init,
|
Init,
|
||||||
Name);
|
Name);
|
||||||
GV->setAlignment(
|
GV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(Init->getType()));
|
CGM.getTargetData().getABITypeAlignment(Init->getType()));
|
||||||
GV->setSection(Section);
|
GV->setSection(Section);
|
||||||
CGM.AddUsedGlobal(GV);
|
CGM.AddUsedGlobal(GV);
|
||||||
return llvm::ConstantExpr::getBitCast(GV,
|
return llvm::ConstantExpr::getBitCast(GV,
|
||||||
|
@ -4780,7 +4780,7 @@ CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
|
||||||
IvarOffsetGV->setInitializer(llvm::ConstantInt::get(ObjCTypes.LongTy,
|
IvarOffsetGV->setInitializer(llvm::ConstantInt::get(ObjCTypes.LongTy,
|
||||||
Offset));
|
Offset));
|
||||||
IvarOffsetGV->setAlignment(
|
IvarOffsetGV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.LongTy));
|
CGM.getTargetData().getABITypeAlignment(ObjCTypes.LongTy));
|
||||||
|
|
||||||
// FIXME: This matches gcc, but shouldn't the visibility be set on the use as
|
// FIXME: This matches gcc, but shouldn't the visibility be set on the use as
|
||||||
// well (i.e., in ObjCIvarOffsetVariable).
|
// well (i.e., in ObjCIvarOffsetVariable).
|
||||||
|
@ -4867,7 +4867,7 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
|
||||||
Init,
|
Init,
|
||||||
Prefix + OID->getName());
|
Prefix + OID->getName());
|
||||||
GV->setAlignment(
|
GV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(Init->getType()));
|
CGM.getTargetData().getABITypeAlignment(Init->getType()));
|
||||||
GV->setSection("__DATA, __objc_const");
|
GV->setSection("__DATA, __objc_const");
|
||||||
|
|
||||||
CGM.AddUsedGlobal(GV);
|
CGM.AddUsedGlobal(GV);
|
||||||
|
@ -4986,7 +4986,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
|
||||||
false, llvm::GlobalValue::WeakAnyLinkage, Init,
|
false, llvm::GlobalValue::WeakAnyLinkage, Init,
|
||||||
"\01l_OBJC_PROTOCOL_$_" + PD->getName());
|
"\01l_OBJC_PROTOCOL_$_" + PD->getName());
|
||||||
Entry->setAlignment(
|
Entry->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.ProtocolnfABITy));
|
CGM.getTargetData().getABITypeAlignment(ObjCTypes.ProtocolnfABITy));
|
||||||
Entry->setSection("__DATA,__datacoal_nt,coalesced");
|
Entry->setSection("__DATA,__datacoal_nt,coalesced");
|
||||||
}
|
}
|
||||||
Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
||||||
|
@ -4999,7 +4999,7 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
|
||||||
false, llvm::GlobalValue::WeakAnyLinkage, Entry,
|
false, llvm::GlobalValue::WeakAnyLinkage, Entry,
|
||||||
"\01l_OBJC_LABEL_PROTOCOL_$_" + PD->getName());
|
"\01l_OBJC_LABEL_PROTOCOL_$_" + PD->getName());
|
||||||
PTGV->setAlignment(
|
PTGV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.ProtocolnfABIPtrTy));
|
CGM.getTargetData().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy));
|
||||||
PTGV->setSection("__DATA, __objc_protolist, coalesced, no_dead_strip");
|
PTGV->setSection("__DATA, __objc_protolist, coalesced, no_dead_strip");
|
||||||
PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
||||||
CGM.AddUsedGlobal(PTGV);
|
CGM.AddUsedGlobal(PTGV);
|
||||||
|
@ -5055,7 +5055,7 @@ CGObjCNonFragileABIMac::EmitProtocolList(llvm::Twine Name,
|
||||||
Name);
|
Name);
|
||||||
GV->setSection("__DATA, __objc_const");
|
GV->setSection("__DATA, __objc_const");
|
||||||
GV->setAlignment(
|
GV->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(Init->getType()));
|
CGM.getTargetData().getABITypeAlignment(Init->getType()));
|
||||||
CGM.AddUsedGlobal(GV);
|
CGM.AddUsedGlobal(GV);
|
||||||
return llvm::ConstantExpr::getBitCast(GV,
|
return llvm::ConstantExpr::getBitCast(GV,
|
||||||
ObjCTypes.ProtocolListnfABIPtrTy);
|
ObjCTypes.ProtocolListnfABIPtrTy);
|
||||||
|
@ -5252,7 +5252,7 @@ llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CGBuilderTy &Builder,
|
||||||
ClassGV,
|
ClassGV,
|
||||||
"\01L_OBJC_CLASSLIST_REFERENCES_$_");
|
"\01L_OBJC_CLASSLIST_REFERENCES_$_");
|
||||||
Entry->setAlignment(
|
Entry->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(
|
CGM.getTargetData().getABITypeAlignment(
|
||||||
ObjCTypes.ClassnfABIPtrTy));
|
ObjCTypes.ClassnfABIPtrTy));
|
||||||
Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip");
|
Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip");
|
||||||
CGM.AddUsedGlobal(Entry);
|
CGM.AddUsedGlobal(Entry);
|
||||||
|
@ -5275,7 +5275,7 @@ CGObjCNonFragileABIMac::EmitSuperClassRef(CGBuilderTy &Builder,
|
||||||
ClassGV,
|
ClassGV,
|
||||||
"\01L_OBJC_CLASSLIST_SUP_REFS_$_");
|
"\01L_OBJC_CLASSLIST_SUP_REFS_$_");
|
||||||
Entry->setAlignment(
|
Entry->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(
|
CGM.getTargetData().getABITypeAlignment(
|
||||||
ObjCTypes.ClassnfABIPtrTy));
|
ObjCTypes.ClassnfABIPtrTy));
|
||||||
Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
|
Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
|
||||||
CGM.AddUsedGlobal(Entry);
|
CGM.AddUsedGlobal(Entry);
|
||||||
|
@ -5301,7 +5301,7 @@ llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CGBuilderTy &Builder,
|
||||||
MetaClassGV,
|
MetaClassGV,
|
||||||
"\01L_OBJC_CLASSLIST_SUP_REFS_$_");
|
"\01L_OBJC_CLASSLIST_SUP_REFS_$_");
|
||||||
Entry->setAlignment(
|
Entry->setAlignment(
|
||||||
CGM.getTargetData().getPrefTypeAlignment(
|
CGM.getTargetData().getABITypeAlignment(
|
||||||
ObjCTypes.ClassnfABIPtrTy));
|
ObjCTypes.ClassnfABIPtrTy));
|
||||||
|
|
||||||
Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
|
Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
|
||||||
|
@ -5860,7 +5860,8 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
|
||||||
|
|
||||||
if (CGM.getLangOptions().getVisibilityMode() == LangOptions::Hidden)
|
if (CGM.getLangOptions().getVisibilityMode() == LangOptions::Hidden)
|
||||||
Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
|
||||||
Entry->setAlignment(8);
|
Entry->setAlignment(CGM.getTargetData().getABITypeAlignment(
|
||||||
|
ObjCTypes.EHTypeTy));
|
||||||
|
|
||||||
if (ForDefinition) {
|
if (ForDefinition) {
|
||||||
Entry->setSection("__DATA,__objc_const");
|
Entry->setSection("__DATA,__objc_const");
|
||||||
|
|
|
@ -23,6 +23,18 @@
|
||||||
// CHECK-X86_64-HIDDEN: define internal void @"\01-[A im0]"
|
// CHECK-X86_64-HIDDEN: define internal void @"\01-[A im0]"
|
||||||
// CHECK-X86_64-HIDDEN: define internal void @"\01-[A(Cat) im1]"
|
// CHECK-X86_64-HIDDEN: define internal void @"\01-[A(Cat) im1]"
|
||||||
|
|
||||||
|
// RUN: %clang_cc1 -triple armv6-apple-darwin10 -target-abi apcs-gnu -fobjc-nonfragile-abi -emit-llvm -o %t %s
|
||||||
|
// RUN: FileCheck -check-prefix=CHECK-ARMV6 < %t %s
|
||||||
|
|
||||||
|
// CHECK-ARMV6: @"OBJC_CLASS_$_A" = global {{.*}}, section "__DATA, __objc_data", align 4
|
||||||
|
// CHECK-ARMV6: @"OBJC_METACLASS_$_A" = global {{.*}}, section "__DATA, __objc_data", align 4
|
||||||
|
// CHECK-ARMV6: @"\01L_OBJC_CLASS_NAME_" = {{.*}}, section "__TEXT,__cstring,cstring_literals", align 1
|
||||||
|
// CHECK-ARMV6: @"OBJC_EHTYPE_$_EH1" = weak global {{.*}}, section "__DATA,__datacoal_nt,coalesced", align 4
|
||||||
|
// CHECK-ARMV6: @"OBJC_EHTYPE_$_EH2" = external global
|
||||||
|
// CHECK-ARMV6: @"OBJC_EHTYPE_$_EH3" = global {{.*}}, section "__DATA,__objc_const", align 4
|
||||||
|
// CHECK-ARMV6: @"\01L_OBJC_LABEL_CLASS_$" = internal global {{.*}}, section "__DATA, __objc_classlist, regular, no_dead_strip", align 4
|
||||||
|
// CHECK-ARMV6: define internal arm_apcscc void @"\01-[A im0]"
|
||||||
|
// CHECK-ARMV6: define internal arm_apcscc void @"\01-[A(Cat) im1]"
|
||||||
|
|
||||||
@interface A
|
@interface A
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Reference in New Issue