[Mingw-w64-public] How to fix error with macros in d3d12?

Zebediah Figura zfigura at codeweavers.com
Mon Jul 25 14:12:58 CDT 2022


On 7/25/22 10:25, Jacek Caban wrote:
> On 7/25/22 00:10, Zebediah Figura wrote:
>> (+ wine-devel)
>>
>> On 6/11/22 13:26, LIU Hao wrote:
>>> 在 2022-06-12 01:59, Zebediah Figura 写道:
>>>>> The combination of `extern` with `__gnu_inline__` is necessary to 
>>>>> suppress generation of a function
>>>>> body if the attached function could not be inlined when compiling 
>>>>> as C99.
>>>>
>>>> Why do we need that?
>>>>
>>>
>>> Otherwise there would be errors about multiple definitions.
>>>
>>>
>>>>> I don't think there is
>>>>> anything we can do with these headers. Perhaps WIDL should not 
>>>>> generate `static` for `FORCEINLINE`
>>>>> functions; or, if that is not an option, `static __inline__` might 
>>>>> be a better alternative.
>>>>
>>>> Is it legal to use 'static __forceinline' or 'extern __forceinline' 
>>>> with MSVC? If so I imagine we
>>>> should find a solution that allows them.
>>>>
>>>
>>> Yes, unfortunately. I don't think there is a solution. `extern 
>>> inline` and `inline` are not
>>> equivalent in C.
>>>
>>>
>>
>> Right, so, apparently MSVC treats both "inline" and "__forceinline" as 
>> magic bullets—they can both appear with or without 'static' and 
>> 'extern'; they'll always generate a function body but can also be 
>> defined in multiple source files (in fact, if the definition differs 
>> and the functions aren't static, an arbitrary one is picked and no 
>> warning is even printed.) And for good measure you can always take the 
>> address too. [So as far as I can tell there's no difference between 
>> "inline" and "extern inline" as far as MSVC is concerned.]
>>
>> I guess we can't do anything about that without modifying the 
>> language. But of course in lieu of that we should probably fix our 
>> headers. I see at least three options:
>>
>> (1) Use "FORCEINLINE" instead of "static FORCEINLINE" for these 
>> functions. MSVC never uses FORCEINLINE with static or extern, so this 
>> would be more consistent. The downside is we'd need to provide import 
>> library definitions for all of these functions, though, which seems 
>> less than ideal. (Unless combined with option 3 below.)
>>
>> (2) Use "static inline" for COM wrappers. This of course drops the 
>> __always_inline__ attribute. I'm inclined to assert that's a 
>> non-issue, but then again I never really saw the point of 
>> __always_inline__ anyway. [I guess it can be used to force the 
>> compiler to inline even when -finline isn't enough, but surely that 
>> would never be the case here...]
>>
>> (2b) Or use "static inline __attribute((__always_inline__))", and 
>> define a new macro to encapsulate that.
>>
>> (3) Define __forceinline as "static inline" rather than "extern 
>> inline". I have to assume there was a reason this wasn't done in the 
>> first place, but there's no documentation in the file and I couldn't 
>> easily find discussion about it. As far as I can tell this actually 
>> matches MSVC almost exactly, except that multiple definitions will be 
>> generated if something takes the function address. That is arguably a 
>> break in behaviour which is worse than just failing to link, though.
> 
> 
> I recall attempts to improve it in mingw-w64, but I think they always 
> hit one or another compatibility limitations (see commit 5255bcfd21 for 
> an example). My long term preferred solution would be:
> 
> (4) Have proper compiler support for __forceinline (probably in form of 
> __attribute__((__forceinline__))

Is there anything special about __forceinline in this respect, relative 
to the MSVC semantics of regular inline? I.e. as far as I can tell, to 
sort of mix metaphors, __forceinline is basically just inline plus GNU's 
__attribute__((__always_inline__)). But there certainly may have been 
things I've missed.

Anyway, yes, I agree we want proper compiler support.

> 
> 
>> I think my preferred solution is 2 (or 2b I guess). I'm planning to 
>> send the attached patch to winehq (since we need to sync widl from 
>> there), but I'd like to hear some feedback from the mingw-w64 project 
>> first. 
> 
> 
> FWIW, the patch seems fine to me.
> 
> 
> Thanks,
> 
> Jacek
> 
> 



More information about the wine-devel mailing list