Windows (Visual Studio) compiler stuff

[email protected] ("Matt Wilmas") Sun, 15 Nov 2015 16:30:40 -0600
Newsgroups php.internals,php.internals.win
Message-ID <9B23C6783EE5480CB15EAC35B9E420EA@pc1>
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?


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...?


Note: I didn't compile PHP, just quick standalone tests to check that 
"noinline" works, no useless functions, and no link error.  Both VS 2008 & 
2015 (same results).

Thoughts?


Thanks,
Matt