Re: [PHP-DEV] Re: Windows (Visual Studio) compiler stuff

[email protected] ("Matt Wilmas") Sun, 22 Nov 2015 23:08:00 -0600
Newsgroups php.internals,php.internals.win
Message-ID <CD9F6A36D2EF4A529EDAFE5C8A4E6929@pc1>
Hi Dmitry,

----- Original Message -----
From: "Dmitry Stogov"
Sent: Monday, November 16, 2015

> Hi Matt,
>
> On Mon, Nov 16, 2015 at 1:30 AM, Matt Wilmas <[email protected]>
> wrote:
>
>> Hi Dmitry, Anatol, Pierre (etc.), and all,
>>
>> I'm back now, I think, after a much longer (unintentional) break than I
>> expected.  Be coming very soon with what I was doing in the summer (param
>> parsing stuff) -- *now* it works with MSVC too, barring any fragility, as 
>> I
>> accidentally discovered last month...
>>
>> I've been "discovering" a lot with the wacky Visual Studio compiler! :-)
>> This message is about the 2 I found today.
>>
>> The first simple thing was probably just overlooked, but noticed it while
>> looking up __declspec.  zend_never_inline has always been empty (I guess)
>> for MSVC, but there's actually a __declspec(noinline) that can be used 
>> (and
>> works as expected).  A simple and obvious change to bring it in line with
>> the other compilers?
>>
>
> Please, provide a patch for zend_portability.h

Really? :-)  And that's easier than just adding

__declspec(noinline)

to line 287?

I can add it myself soon, if it's acceptable.  And yes, I verified that it 
does have an effect, and prevents current inlining, as you intended.  (12 KB 
smaller binary.)

>> The second "issue" is with the zend_always_inline functions, I noticed
>> this summer.  Did anyone else know that MSVC leaves a *copy* of those
>> functions in the output files (DLLs)?  What's the point of that?  When
>> they've been inlined, and not referenced otherwise, there should be no
>> reason to emit code for a standalone function!
>>
>> I remembered after seeing that behavior that a bit of my own
>> __forceinline'd code did NOT have extra function code, but forgot to
>> investigate until today.  What's different about my function definition?
>> No "static" specifier!  So that's the key. :-)
>>
>> But... non-static would create duplicate symbols, I thought.  But no, it
>> works!  With just __forceinline, there's no errors. :^)
>>
>> Can something be done about this?  It would cut the binary size down a
>> bit. A zend_static macro to be used with zend_always_inline...?
>>
>
> zend_always inline should be always used with static keyword.

Right, that would be the standard thinking, but it makes MSVC not remove the 
unreferenced standalone function like GCC/Clang...  Adds almost 100 KB to 
php7.dll.

But nevermind...  Thanks to Anatol, it seems another compiler flag WILL 
actually strip those functions, and then some! :-)

> Thanks. Dmitry.

- Matt