[cfe-commits] r66481 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/objc-align.m

Daniel Dunbar daniel at zuster.org
Mon Mar 9 16:05:11 PDT 2009


We discussed this offline and decided to just force all metadata
variables to pointer alignment for know. This is something of a hack
but ensures that things should be packed tightly while not penalizing
codegen.

 - Daniel

On Mon, Mar 9, 2009 at 3:49 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
> ObjC sections have generally symbols of the same kind. Those which has all
> pointers should be
> aligned on a pointer alignment. Hard-coding to 4 makes the alignment
> incorrect if we ever want to
> support let's say old abi in 64-bit mode. I think we should get the
> alignment from the type of
> the initializers which go into the section. And if we don't yet have the
> initializer, set the alignment
> when initializers become available.
>
> - fariborz
>
> On Mar 9, 2009, at 3:41 PM, Daniel Dunbar wrote:
>
>> I'm not sure what you mean by getting the alignment of the symbol that
>> this section is for.
>>
>> I don't like hard coding the alignment either, but the only "right"
>> way to get the correct alignment without hardcoding would be to make
>> up the C types for the structures that these sections are supposed to
>> contain and then use our existing machinery to get the alignment.
>> Getting the alignment of, say, a pointer type feels worse to me; it is
>> still hard coding, since it isn't actually using the right type, and
>> it also isn't really encoding the correct dependency (although maybe
>> it is a little more robust).
>>
>> Lets discuss in person if you disagree... I could be swayed. :)
>>
>> - Daniel
>>
>> On Mon, Mar 9, 2009 at 3:28 PM, Fariborz Jahanian <fjahanian at apple.com>
>> wrote:
>>>
>>> On Mar 9, 2009, at 3:18 PM, Daniel Dunbar wrote:
>>>
>>>> Author: ddunbar
>>>> Date: Mon Mar  9 17:18:41 2009
>>>> New Revision: 66481
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=66481&view=rev
>>>> Log:
>>>> NeXT: Set alignment on a number of ObjC metadata variables (matching
>>>> llvm-gcc).
>>>>
>>>> Added:
>>>>  cfe/trunk/test/CodeGenObjC/objc-align.m
>>>> Modified:
>>>>  cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>>>>
>>>> Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>>>> URL:
>>>>
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=66481&r1=66480&r2=66481&view=diff
>>>>
>>>>
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
>>>> +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Mon Mar  9 17:18:41 2009
>>>> @@ -1086,6 +1086,7 @@
>>>>
>>>> std::string("\01L_OBJC_PROTOCOL_")+ProtocolName,
>>>>                              &CGM.getModule());
>>>>   Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
>>>> +    Entry->setAlignment(4);
>>>>   UsedGlobals.push_back(Entry);
>>>>   // FIXME: Is this necessary? Why only for protocol?
>>>>   Entry->setAlignment(4);
>>>> @@ -1108,6 +1109,7 @@
>>>>                              "\01L_OBJC_PROTOCOL_" +
>>>> PD->getNameAsString(),
>>>>                              &CGM.getModule());
>>>>   Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
>>>> +    Entry->setAlignment(4);
>>>>   UsedGlobals.push_back(Entry);
>>>>   // FIXME: Is this necessary? Why only for protocol?
>>>>   Entry->setAlignment(4);
>>>> @@ -1195,7 +1197,7 @@
>>>>  llvm::Constant *Init = llvm::ConstantStruct::get(Values);
>>>>  llvm::GlobalVariable *GV =
>>>>   CreateMetadataVar(Name, Init,
>>>> "__OBJC,__cat_cls_meth,regular,no_dead_strip",
>>>> -                      0, false);
>>>> +                      4, false);
>>>>  return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
>>>> }
>>>>
>>>> @@ -1354,7 +1356,7 @@
>>>>  llvm::GlobalVariable *GV =
>>>>   CreateMetadataVar(std::string("\01L_OBJC_CATEGORY_")+ExtName, Init,
>>>>                     "__OBJC,__category,regular,no_dead_strip",
>>>> -                      0, true);
>>>> +                      4, true);
>>>>  DefinedCategories.push_back(GV);
>>>> }
>>>>
>>>> @@ -1489,8 +1491,7 @@
>>>>  llvm::GlobalVariable *GV =
>>>>   CreateMetadataVar(std::string("\01L_OBJC_CLASS_")+ClassName, Init,
>>>>                     "__OBJC,__class,regular,no_dead_strip",
>>>> -                      32, // FIXME: Why?
>>>> -                      true);
>>>> +                      4, true);
>>>>  DefinedClasses.push_back(GV);
>>>> }
>>>>
>>>> @@ -1559,9 +1560,8 @@
>>>>                                 &CGM.getModule());
>>>>  }
>>>>  GV->setSection("__OBJC,__meta_class,regular,no_dead_strip");
>>>> +  GV->setAlignment(4);
>>>>  UsedGlobals.push_back(GV);
>>>> -  // FIXME: Why?
>>>> -  GV->setAlignment(32);
>>>>
>>>>  return GV;
>>>> }
>>>> @@ -1715,8 +1715,8 @@
>>>>  llvm::GlobalVariable *GV;
>>>>  if (ForClass)
>>>>   GV = CreateMetadataVar("\01L_OBJC_CLASS_VARIABLES_" +
>>>> ID->getNameAsString(),
>>>> -                           Init,
>>>> "__OBJC,__cls_vars,regular,no_dead_strip",
>>>> -                           32, true);
>>>> +                           Init,
>>>> "__OBJC,__class_vars,regular,no_dead_strip",
>>>> +                           4, true);
>>>>  else
>>>>   GV = CreateMetadataVar("\01L_OBJC_INSTANCE_VARIABLES_"
>>>>                          + ID->getNameAsString(),
>>>> @@ -2349,7 +2349,7 @@
>>>>  CreateMetadataVar("\01L_OBJC_MODULES",
>>>>                   llvm::ConstantStruct::get(ObjCTypes.ModuleTy, Values),
>>>>                   "__OBJC,__module_info,regular,no_dead_strip",
>>>> -                    0, true);
>>>> +                    4, true);
>>>> }
>>>>
>>>> llvm::Constant *CGObjCMac::EmitModuleSymbols() {
>>>> @@ -3493,8 +3493,7 @@
>>>>                              Init,
>>>>                              "\01L_OBJC_LABEL_CLASS_$",
>>>>                              &CGM.getModule());
>>>> -    GV->setAlignment(
>>>> -      CGM.getTargetData().getPrefTypeAlignment(ObjCTypes.Int8PtrTy));
>>>> +    GV->setAlignment(8);
>>>
>>> Why are we hard coding the alignment here and in other places, instead of
>>> getting the alignment of the symbol that this
>>> section is for?
>>>
>>> - fariborz
>>>
>>>
>
>




More information about the cfe-commits mailing list