[PATCH] Add an -mattr option to the gold plugin to support subtarget features in LTO
Nick Kledzik
kledzik at apple.com
Tue Apr 22 16:37:16 PDT 2014
Tom,
Your patch is fine with me. It is a reasonable work around until we start encoding all those attributes in bitcode.
-Nick K.
On Apr 21, 2014, at 10:16 AM, Tom Roeder <tmroeder at google.com> wrote:
> On Thu, Mar 27, 2014 at 2:54 AM, Nick Lewycky <nicholas at mxc.ca> wrote:
>> Nick Kledzik wrote:
>>>
>>>
>>> On Mar 25, 2014, at 12:06 AM, Nick Lewycky<nicholas at mxc.ca> wrote:
>>>
>>>> Nick Kledzik wrote:
>>>>>
>>>>>
>>>>> On Mar 24, 2014, at 4:27 PM, Tom Roeder<tmroeder at google.com> wrote:
>>>>>>
>>>>>> The small patch attached here adds support for an -mattr option to the
>>>>>> gold plugin and to llvm-lto. This allows the caller to specify details
>>>>>> of the subtarget architecture, like +aes, or +ssse3 on x86. Note that
>>>>>> this required a change to the include/llvm-c/lto.h interface: it adds
>>>>>> a function lto_codegen_set_attr and it increments the version of the
>>>>>> interface.
>>>>>>
>>>>>> Please let me know what you think.
>>>>>
>>>>>
>>>>> The LTO API already has:
>>>>> lto_codegen_debug_option(lto_codegen_t, const char *);
>>>>>
>>>>> Could you support -mattr options using the existing API like?:
>>>>> lto_codegen_debug_option(cg, “-mattr=+sse3”);
>>>>
>>>>
>>>> Absolutely not. That API has the word "debug" in its name because it is
>>>> strictly reserved for debugging libLTO. That means that it is not part of
>>>> libLTO's public interface.
>>>
>>> It is in the public header<llvm-c/lto.h>. How can it not be part of the
>>> public interface?
>>>
>>>
>>>> The reason is that libLTO has a strong ABI requirement. Once we have a
>>>> user using libLTO, we can never ever break them at the ABI level. The
>>>> intention is that this exposed interface is something small that we can
>>>> audit, and that we can change LLVM's innards without disturbing libLTO.
>>>>
>>>> Once you allow passing arbitrary flags across, every single flag
>>>> everywhere in every llvm library becomes part of the permanent ABI that can
>>>> never be changed.
>>>
>>> That boat has already sailed.
>>
>>
>> No. You may have shipped a product you thought was ABI stable, but you are
>> mistaken.
>>
>>
>> The darwin linker accepts “-mllvm foo” and calls
>> lto_codegen_debug_option(xx, “foo”).
>>
>> Realize that flags are currently whole-process globals. LLVM is a library,
>> and there is no place for such globals (consider a program that uses a
>> graphics library and an audio library, both libraries are accelerated using
>> llvm under the hood. They can not both set these globals). The direction
>> we're headed is one where flags in the llvm libraries get transformed into
>> APIs and non-global state objects while the flags themselves get shunted
>> outwards towards the tools. Ultimately "-mattr" will be a flag in
>> tools/llc/llc.cpp not inside the llvm library.
>>
>> What then?
>>
>> If you want to maintain backwards compatibility, I suggest you find a set of
>> "mllvm" flags you want to continue to support, then add a new string-based
>> API for them to libLTO and have libLTO parse those flags and set llvm's
>> internal state.
>>
>> And no, you can't use lto_codegen_debug_option for that purpose. That
>> function is for passing arbitrary flags to debug libLTO with. What this
>> means is that you've already bought into ABI instability and the linker
>> you've already shipped will not be compatible with some future version of
>> libLTO.
>>
>>
>> It has been used with things like -mcpu=blah to work around that
>> information not being recorded in the bitcode files.
>>>
>>>
>>> I understand that a string interface by-passes any sort of static
>>> analysis.
>>
>>
>> I have no problem with a string interface. I do have a problem with putting
>> the entirety of llvm libraries under ABI lock.
>>
>>
>>> Isn’t the long term goal that info like +sse3 be recorded in bit code
>>> files so that these options are not needed at link time? If so, then the
>>> proposed API is a short term work around. My point is that we already have
>>> a hack to pass arbitrary option strings. Why have two?
>>
>>
>> If the plan was to bake arbitrary strings into bitcode and call
>> cl::ParseCommandLineOptions then we need a new plan. However, I see no
>> problem with baking into the bitcode file the same strings that the backend
>> .td files use ("sse3").
>>
>> I don't even mind if you want to make the string "mattr=+sse3", the only
>> requirement is that it needs to be parsed by libLTO itself or something
>> that's aware of the ABI stability guarantee.
>>
>
> This patch is currently the only short-term way I know to get these
> attributes down into LTO, and this is necessary for me to get some
> large LTO builds to work. (That is, the only way other than the debug
> interface, which seems to have strong opposition on this list). LTO is
> currently broken for builds that use special attributes to compile
> some files. Is this patch acceptable for fixing that breakage?
>
> Thanks,
>
> Tom
More information about the llvm-commits
mailing list