My native C++ COM component uses ATL. In DllRegisterServer() I call CComModule::RegisterServer():
STDAPI DllRegisterServer()
{
return _Module.RegisterServer(FALSE); // <<< notice FALSE here
}
FALSE is passed to indicate to not register the type library.
ATL is available as sources, so I in fact compile the implementation of CComModule::RegisterServer(). Somewhere down the call stack there’s an if statement:
if( doRegisterTypeLibrary ) { //<< FALSE goes here
// do some stuff, then call RegisterTypeLib()
}
The compiler sees all of the above code and so it can see that in fact the if condition is always false, yet when I inspect the linker progress messages I see that the reference to RegisterTypeLib() is still there, so the if statement is not eliminated.
Can I make Visual C++ 9 perform better static analysis and actually see that some code is never called and not emit that code?
Turns out the key is to enable link-time code generator all the way through the compiler settings.
It must be enabled on the General tab – Whole program optimization must be set to “Use link-time code generation”. It must also be enabled on the C++ -> Optimization tab – “Whole program optimization* must be set to “Enable link-time code generation”. It must also be enabled on the Linker -> Optimization tab – Link Time Code Generation must be set to “Use Link Time Code Generation”. Then /OPT:REF and /OPT:ICF (again, *Linker -> Optimization” tab) must both be enabled.
And this effectively removes the calls to
RegisterTypeLib()– it is no longer in the list of symbols imported.