[llvm-commits] [llvm] r150507 - in /llvm/trunk: include/llvm/CodeGen/TargetLoweringObjectFileImpl.h include/llvm/Target/TargetLoweringObjectFile.h lib/CodeGen/AsmPrinter/AsmPrinter.cpp lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Bill Wendling
isanbard at gmail.com
Wed Feb 15 11:29:58 PST 2012
On Feb 15, 2012, at 3:59 AM, Chris Lattner <clattner at apple.com> wrote:
> On Feb 14, 2012, at 1:28 PM, Bill Wendling wrote:
>
>> Author: void
>> Date: Tue Feb 14 15:28:13 2012
>> New Revision: 150507
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=150507&view=rev
>> Log:
>> Add code to the target lowering object file module to handle module flags.
>>
>> The MachO back-end needs to emit the garbage collection flags specified in the
>> module flags. This is a WIP, so the front-end hasn't been modified to emit these
>> flags just yet. Documentation and front-end switching to occur soon.
>
> Looks nice, some comments:
>
> + // Emit module flags.
> + if (NamedMDNode *ModFlags = M.getModuleFlagsMetadata())
> + getObjFileLowering().emitModuleFlags(OutStreamer, ModFlags, Mang, TM);
> ...
>
> + /// emitModuleFlags - Emit the module flags that specify the garbage
> + /// collection information.
> + virtual void emitModuleFlags(MCStreamer &Streamer, NamedMDNode *ModFlags,
> + Mangler *Mang, const TargetMachine &TM) const;
>
> Instead of passing the NamedMDNode down and having all clients have to tear it apart, it would be better for a Module:: api to decompose them into structs and then pass an ArrayRef of structs into TLOF. Please add a new local struct to Module that contains "ModAttrBehavior Behavior, StringRef Key, Value *Val", and add method to Module that returns the (possibly empty) list for the module.
>
> That would make the AsmPrinter.cpp common code look like:
>
> SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags;
> M.getModuleFlags(ModuleFlags);
> if (!ModuleFlags.empty())
> ... emitModuleFlags(... ModuleFlags, ...)
>
Okay. That sounds good.
>
>> +void TargetLoweringObjectFileMachO::
>> +emitModuleFlags(MCStreamer &Streamer, NamedMDNode *ModFlags,
>> + Mangler *Mang, const TargetMachine &TM) const {
>> + StringRef Version("Objective-C Image Info Version");
>> + StringRef SectionSpec("Objective-C Image Info Section");
>> + StringRef GC("Objective-C Garbage Collection");
>> + StringRef GCOnly("Objective-C GC Only");
>
> Is there a specific reason you factored these out like this? Why not just do
>
> if (KeyStr == "Objective-C Image Info Version") down below?
>
In my mind there was a reason, but it's not really necessary (and isn't valid for this code). :-)
>> + // The section is mandatory. If we don't have it, then we don't have image
>> + // info information.
>> + if (Section.empty()) return;
>> +
>> + uint32_t Values[2] = { VersionVal, GCFlags };
>> + Module *M = ModFlags->getParent();
>> + Constant *Init = ConstantDataArray::get(M->getContext(), Values);
>> + GlobalVariable *GV = new GlobalVariable(*M, Init->getType(), false,
>> + GlobalValue::InternalLinkage, Init,
>> + "\01L_OBJC_IMAGE_INFO");
>> + GV->setSection(Section);
>> +
>> + MCSymbol *GVSym = Mang->getSymbol(GV);
>> + SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
>> + const MCSection *TheSection = SectionForGlobal(GV, GVKind, Mang, TM);
>
> This should not be creating (and leaking :) a temporary GlobalVariable. Just drive the Streamer API directly to get the directives you need.
>
Doh!! Sorry for the leakage. I'll modify it to directly emit things.
Thanks for the review!
-bw
More information about the llvm-commits
mailing list