[LLVMdev] [RFC] Attributes Rewrite (Final)

Bill Wending isanbard at gmail.com
Sun Feb 3 12:55:34 PST 2013


On Feb 3, 2013, at 10:45 AM, Chris Lattner <clattner at apple.com> wrote:

> On Jan 29, 2013, at 2:42 PM, Bill Wendling <isanbard at gmail.com> wrote:
>> Executive Summary:
>> 
>> The new syntax is:
>> 
>>    #0 = attributes { noinline align=4 "cpu"="cortex-a8" }
>>    #1 = attributes { attr = (val1 val2 val3) }
>>    #bork = attributes { sspreq noredzone }
>> 
>>    define void @foo() #0 #bork { ret void }
> 
> The general syntax LGTM.  It seems clean and fits well with what we have.
> 
Thanks! :-)

>> The 'align' and "cpu" attributes both have a value associated with them. The 'attr' attribute in '#1' has multiple values associated with it. (The BNF is below in the 'IR Changes' section.) Attribute groups with the same attributes in them, but in a different order, are identical. So '@bar' and '@qux' have the same attributes in this example:
> 
> What is the use case for the multi-value attribute?  Perhaps obvious, but it makes sense to stage this out to add one thing at a time.  Also, your BNF doesn't make it clear what is allowed for <value>: I would assume it is a set of hardcoded keywords (like align, sspreq, etc) plus the string form.  If so, how does "val1" fit into that?
> 
I added it because I wanted to limit possible future changes to the IR. But that may be premature. It would essentially act like the '-mattr' command line option works today. Of course the -mattr functionality is covered by this proposal. I will omit that part and leave it for a future expansions if necessary. It won't be a major change to the IR at that point.

My first thoughts about what <value> can be is something that can be represented by a Constant object. So a keyword, string, or numerical value. I expect string values to be used mainly for target-dependent attributes. The other two forms would be used for target-independent attributes defined in the LangRef.

>> Proposal
>> ========
>> 
>> We will expand the Attriutes class to support all of the attributes that the
>> compiler may care about. Anything that affects code transformations and code
>> generation will be specified inside of the Attributes class. This allows for a
>> cleaner interface for the front-ends, since they won't have to fill in a
>> target-specific structure to pass along this information.
> 
> It will also hopefully allow us to eliminate most or all of the "global" variables crammed into the TargetOptions class.
> 
God-willing, yes! :-)

>> There are two classes of attributes: those that are target-independent (e.g.,
>> 'noinline'), and those that are target-dependent (e.g., 'thumb' and
>> 'cpu=cortex-a8'). The target-dependent options are stored as strings inside of
>> the Attributes class. The target's back-end is responsible for interpreting
>> target-dependent attributes.
>> 
>> Attributes should be documented in the language reference document.
> 
> Target specific attributes should probably be listed in the target-specific section of docs/CodeGenerator.rst.
> 
Okay, that makes sense. 

>> The core of this proposal is the idea of an "attribute group". As the name
>> implies, it's a group of attributes that are then referenced by objects within
>> the IR. An attribute group is a module-level object. The BNF of the syntax is:
>> 
>> attribute_group := <attrgroup_id> '=' attributes '{' <attribute_list> '}'
>> attrgroup_id    := #<id>
>> attribute_list  := <attribute> <attribute>*
>> attribute       := <name> ('=' <list_of_values>)?
>> list_of_values  := <value> | '(' <value> <value>* ')'
>> id              := <number> | <name>
> 
> As mentioned above, it is unclear what "value" is.  It makes sense to me to make it one of a hard-coded list of well-known stuff we know about (like align) plus double-quoted strings, used for target-specific stuff.
> 
That sounds reasonable.

>> Attribute groups are important for keeping `.ll' files readable, because a lot
>> of functions will use the same attributes. In the degenerative case of a `.ll'
>> file that corresponds to a single `.c' file, the single `attrgroup' will capture
>> the command line flags used to build that file.
> 
> It's worth noting that the structure of attribute groups is an .ll file syntax thing, they aren't reflected in the IR once parsed.
> 
Yes. In particular, we won't be trying to preserve the .ll syntax when it's run through llvm-as and llvm-dis.

>> 
>> Target-Dependent Attributes in IR
>> ---------------------------------
>> 
>> The front-end is responsible for knowing which target-dependent options are 
>> interesting to the target. Target-dependent attributes are specified as strings,
>> which are understood by the target's back-end. E.g.:
>> 
>>    #0 = attributes { "long-calls", "cpu=cortex-a8", "thumb" }
> 
> "cpu=cortex-a8" or "cpu"="cortex-a8"?

The latter.

-bw



More information about the llvm-dev mailing list