[cfe-dev] [RFC] Module Flags Metadata
Sandeep Patel
deeppatel1987 at gmail.com
Thu Jan 19 09:12:01 PST 2012
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
More information about the cfe-dev
mailing list