[cfe-dev] Inlining dllimport functions
Hamza Sood via cfe-dev
cfe-dev at lists.llvm.org
Fri Sep 14 06:51:10 PDT 2018
Would it break ABI compatibility if we let Clang inline things like this? What about putting it behind a Clang-specific optimisation flag?
> On 13 Sep 2018, at 21:29, Reid Kleckner wrote:
>
> That would be a shame. I wouldn't want to throw away such an important code size optimization just because we can't export the things the inline functions reference.
>
> I understand it's tough, though. libc++'s visibility and export macros have many consumers, many vendors, many linkage models, and basically too many cooks in the kitchen. I don't have any brilliant suggestions for solving that.
>
>> On Thu, Sep 13, 2018 at 1:05 PM Hamza Sood <hamza_sood at me.com> wrote:
>> I’ve looked into it a bit more and it seems like the main optimisation barrier with libc++ on Windows is the extern template usage; it’s preventing a lot of trivial inlining. What about making _LIBCPP_DISABLE_EXTERN_TEMPLATE the default for Windows DLL builds?
>>
>>> On 13 Sep 2018, at 17:23, Reid Kleckner wrote:
>>>
>>> It would cause problems if 'f' in turn referenced functions that were neither inline nor exported:
>>>
>>> bool not_exported();
>>> inline bool f() { return not_exported(); }
>>> __declspec(dllimport) inline bool g() { return f(); }
>>>
>>> I'm pretty sure MSVC will not inline g in this or your example, so I would suggest adjusting dllimport usage patterns to something that satisfies both compilers rather than changing clang.
>>>
>>>> On Thu, Sep 13, 2018 at 8:43 AM Hamza Sood via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>>>> Currently, Clang won’t inline a dllimport function that references a non-dllimport function. This has a big performance impact on using libc++ on Windows because even something as simple as vector::data() won’t be inlined at the max optimisation level.
>>>>
>>>> Would anything break if Clang were to allow inlining of a dllimport function that references a non-dllimport function that’s also declared inline?
>>>>
>>>> E.g:
>>>>
>>>> inline bool f() { return false; }
>>>>
>>>> __declspec(dllimport) inline bool g() { return f(); }
>>>>
>>>> bool h() {
>>>> // can we inline this without issue?
>>>> return g();
>>>> }
>>>> _______________________________________________
>>>> cfe-dev mailing list
>>>> cfe-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180914/67ad4d6c/attachment.html>
More information about the cfe-dev
mailing list