Hi Bill,
For the GNU runtimes, this metadata is stored in the module structure in each
compilation unit, and uses a different set of flags. Do you have any plans for
this to be generic, or is it intended just for Darwin?
David
On 19 Jan 2012, at 23:33, Bill Wendling wrote:
> Hi Sandeep,
>
> ObjC is the first place that I will use it, of course (we need it to fix
LTO). Other uses will come along later. (I don't know enough about the float
ABI issues to say whether they should be done via module flags or not.) The
OpenCL people have a need for named metadata for their stuff. I would hope that
module flags would be a good fit for that, but that remains to be seen. But in
general, any information which affects the module as a whole could use this
feature. ObjC metadata is just an obvious first step. :-)
>
> -bw
>
> On Jan 19, 2012, at 9:12 AM, Sandeep Patel wrote:
>
>> Could you expand on likely uses other than ObjC? For example, should
>> float ABI (soft/softfp/hard) be conveyed via this mechanism?
>>
>> deep
>>
>> On Wed, Jan 18, 2012 at 9:36 PM, Bill Wendling <wendling at
apple.com> wrote:
>>> Hello,
>>>
>>> This is a proposal for implementing "module flags".
Please take a look at this and give any feedback you may have.
>>>
>>> Thanks!
>>> -bw
>>>
>>> Module Flags Metadata
>>>
>>> Information about the module as a whole is difficult to convey to
LLVM's
>>> subsystems. The LLVM IR isn't sufficient to transmit this
information. One
>>> should instead use the llvm.module.flags named metadata. These
flags are in the
>>> form of a key / value pair -- much like a dictionary -- making it
easy for any
>>> subsystem who cares about a flag to look it up.
>>>
>>> The llvm.module.flags metadata contains a list of metadata
triplets. Each
>>> triplet has the following form:
>>>
>>> - The first element is a "behavior" flag, which specifies
the behavior when
>>> two (or more) modules are merged together, and it encounters two
(or more)
>>> metadata with the same ID. The supported behaviors are described
below.
>>>
>>> - The second element is a metadata string that is a unique ID for
the
>>> metadata. How each ID is interpreted is documented below.
>>>
>>> - The third element is the value of the metadata.
>>>
>>> When two (or more) modules are merged together, the resulting
llvm.module.flags
>>> metadata is the union of the modules' llvm.module.flags
metadata. The only
>>> exception being a flag with the 'Override' behavior, which
may override another
>>> flag's value (see below).
>>>
>>> The following behavior flags are supported:
>>>
>>> Value Behavior
>>> ----- --------
>>> 1 Error
>>> Emits an error if two values disagree.
>>>
>>> 2 Warning
>>> Emits a warning if two values disagree.
>>>
>>> 3 Require
>>>
>>> Emits an error when the specified value is not
present or
>>> doesn't have the specified value. It is an
error for two (or
>>> more) llvm.module.flags with the same ID to have
the Require
>>> behavior but different values. There may be
multiple Require
>>> flags per ID.
>>>
>>> 4 Override
>>> Uses the specified value if the two values
disagree. It is an
>>> error for two (or more) llvm.module.flags with the
same ID to
>>> have the Override behavior but different values.
>>>
>>> An example of module flags:
>>>
>>> !0 = metadata !{ i32 1, metadata !"foo", i32 1 }
>>> !1 = metadata !{ i32 4, metadata !"bar", i32 37 }
>>> !2 = metadata !{ i32 2, metadata !"qux", i32 42 }
>>> !3 = metadata !{ i32 3, metadata !"qux",
>>> metadata !{
>>> metadata !"foo", i32 1
>>> }
>>> }
>>> !llvm.module.flags = !{ !0, !1, !2, !3 }
>>>
>>> - Metadata !0 has the ID !"foo" and the value
'1'. The behavior if two or more
>>> !"foo" flags are seen is to emit an error if their values
are not equal.
>>>
>>> - Metadata !1 has the ID !"bar" and the value
'37'. The behavior if two or more
>>> !"bar" flags are seen is to use the value '37' if
their values are not equal.
>>>
>>> - Metadata !2 has the ID !"qux" and the value
'42'. The behavior if two or more
>>> !"qux" flags are seen is to emit a warning if their
values are not equal.
>>>
>>> - Metadata !3 has the ID !"qux" and the value:
>>>
>>> metadata !{ metadata !"foo", i32 1 }
>>>
>>> The behavior is to emit an error if the llvm.module.flags does not
contain a
>>> flag with the ID !"foo" that has the value '1'.
If two or more !"qux" flags
>>> exist, then they must have the same value or an error will be
issued.
>>>
>>>
>>> Objective-C Metadata
>>> --------------------
>>>
>>> To correctly link two or more Objective-C modules, the linker needs
to know
>>> quite a bit of information about the language and how the modules
were
>>> compiled. These flags are concerned with ABI versions and garbage
collection,
>>> since they cannot conflict. The MachO writer uses these values to
generate the
>>> "image info" section, and merges the values from
different modules in an
>>> "intelligent" fashion rather than append them together.
>>>
>>> The supported names are:
>>>
>>> * Objective-C Version
>>> - The version of the Objective-C ABI. Valid values are '1'
and '2'. It's an
>>> error for two or more Objective-C Version flags to have
different values.
>>>
>>> * Objective-C Garbage Collection Version
>>> - The garbage collection version, used by the image info section.
Currently
>>> always '0'. It is an error for two or more
"Objective-C Garbage Collection
>>> Value" flags to have different values.
>>>
>>> * Objective-C Garbage Collection
>>> - Specifies that this module supports garbage collection. Valid
values are
>>> '0' and '2'. A flag with the value of
'0' will override one with the value
>>> of '2'.
>>>
>>> * Objective-C GC Only
>>> - Specifies that this module requires garbage collection. This
requires that
>>> the "Objective-C Garbage Collection" metadata is
present and has a value of
>>> '2'. If present the valid value is '4'.
>>>
>>> * Objective-C Image Info Section
>>> - The image info section holds information about Objective-C
garbage
>>> collection. The "Objective-C Image Info Section"
specifies the name of the
>>> section where the image info is placed. This flag is required if
the
>>> "Objective-C Garbage Collection" flag is present and
has the value of
>>> '2'. It is an error for two or more of these flags to
have different
>>> values.
>>>
>>> Here is an example of how to use the Objective-C metadata:
>>>
>>> Module A
>>> --------
>>> !0 = metadata !{ i32 1, metadata !"Objective-C Version",
i32 2 }
>>> !1 = metadata !{ i32 1, metadata !"Objective-C Garbage
Collection Version", i32 0 }
>>> !2 = metadata !{ i32 1, metadata !"Objective-C Garbage
Collection", i32 2 }
>>> !3 = metadata !{ i32 3, metadata !"Objective-C Garbage
Collection",
>>> metadata !{
>>> metadata !"Objective-C Image Info Section",
>>> metadata !"__DATA, __objc_imageinfo, regular,
no_dead_strip"
>>> }
>>> }
>>> !4 = metadata !{ i32 1, metadata !"Objective-C Image Info
Section",
>>> metadata !"__DATA, __objc_imageinfo, regular,
no_dead_strip" }
>>> !llvm.module.flags = !{ !0, !1, !2, !3, !4 }
>>>
>>> Module B
>>> --------
>>> !0 = metadata !{ i32 1, metadata !"Objective-C Version",
i32 2 }
>>> !1 = metadata !{ i32 1, metadata !"Objective-C Garbage
Collection Version", i32 0 }
>>> !2 = metadata !{ i32 1, metadata !"Objective-C Garbage
Collection", i32 2 }
>>> !3 = metadata !{ i32 3, metadata !"Objective-C Garbage
Collection",
>>> metadata !{
>>> metadata !"Objective-C Image Info Section",
>>> metadata !"__DATA, __objc_imageinfo, regular,
no_dead_strip"
>>> }
>>> }
>>> !4 = metadata !{ i32 1, metadata !"Objective-C GC Only",
i32 4 }
>>> !5 = metadata !{ i32 3, metadata !"Objective-C GC Only",
>>> metadata !{
>>> metadata !"Objective-C Garbage Collection", i32 2
>>> }
>>> }
>>> !6 = metadata !{ i32 1, metadata !"Objective-C Image Info
Section",
>>> metadata !"__DATA, __objc_imageinfo, regular,
no_dead_strip" }
>>> !llvm.module.flags = !{ !0, !1, !2, !3, !4, !5, !6 }
>>>
>>> Linked Module
>>> -------------
>>> !0 = metadata !{ i32 1, metadata !"Objective-C Version",
i32 2 }
>>> !1 = metadata !{ i32 1, metadata !"Objective-C Garbage
Collection Version", i32 0 }
>>> !2 = metadata !{ i32 1, metadata !"Objective-C Garbage
Collection", i32 2 }
>>> !3 = metadata !{ i32 3, metadata !"Objective-C Garbage
Collection",
>>> metadata !{
>>> metadata !"Objective-C Image Info Section",
>>> metadata !"__DATA, __objc_imageinfo, regular,
no_dead_strip"
>>> }
>>> }
>>> !4 = metadata !{ i32 1, metadata !"Objective-C GC Only",
i32 4 }
>>> !5 = metadata !{ i32 3, metadata !"Objective-C GC Only",
>>> metadata !{
>>> metadata !"Objective-C Garbage Collection", i32 2
>>> }
>>> }
>>> !6 = metadata !{ i32 1, metadata !"Objective-C Image Info
Section",
>>> metadata !"__DATA, __objc_imageinfo, regular,
no_dead_strip" }
>>> !llvm.module.flags = !{ !0, !1, !2, !3, !4, !5, !6 }
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
--
This email complies with ISO 3103