[LLVMdev] [RFC] Passing Options to Different Parts of the Compiler Using Attributes

Bill Wendling
2012-11-26T21:41:32Z

On Nov 26, 2012, at 1:20 PM, Bill Wendling <wendling at apple.com> wrote:

> On Nov 20, 2012, at 11:03 AM, Meador Inge <meadori at
codesourcery.com> wrote:
>
>>  3. Can attribute groups and single attributes be inter-mixed?
>>     For example:
>>
>>        void @foo attrgroup(#1) alwaysinline attrgroup(#2) nounwind
>>
> This will be necessary for backwards compatibility. However, running this
through this sequence:
>
> 	$ llvm-as < foo.ll | llvm-dis
>
> would produce:
>
> 	attrgroup #1 = { ... }
> 	attrgroup #2 = { ... }
> 	attrgroup #3 = { alwaysinline, nounwind }
>
> 	void @foo() attrgroup(#1) attrgroup(#2) attrgroup(#3)
>
> This is because of how the attributes will be represented internally to
LLVM. Let me know if you have strong objections to this.
>
Now that I think about it, this isn't the output. Here's what it would
look like:

a.ll:
	attributes #1 = { "no-sse" }
	attributes #2 = { noredzone }

	define void @foo() #1 #2 alwaysinline nounwind { ret void }

Here's the output:

	$ llvm-as < a.ll | llvm-dis

	attributes #1 = { "no-sse" }
	attributes #2 = { noredzone }
	attributes #3 = { "no-sse", noredzone, alwaysinline, nounwind }

	define void @foo() #3 { ret void }

This is because all of the attribute groups that a function references will be
merged into one attribute object. When we output the attribute object, we
don't know that the original function referred to two attribute groups and
had a couple of extra attributes defined.

In practice, I expect this to happen rarely in non-LTO mode.

-bw