amccarth added inline comments.

================
Comment at: lib/Driver/MSVCToolChain.cpp:478
@@ +477,3 @@
+
+  const DWORD VersionSize = ::GetFileVersionInfoSizeW(ClExeWide.c_str(),
+                                                      nullptr);
----------------
amccarth wrote:
> thakis wrote:
> > amccarth wrote:
> > > Yes, it looks in the executable (which I tried to emphasize with the 
> > > method name).
> > > 
> > > I don't think this is very expensive given that Explorer often makes 
> > > zillions of such calls, but I'm open to other suggestions.
> > > 
> > > I know that you can't use a library that's newer than the compiler 
> > > (because it may use new language features), but I don't know if that 
> > > applies in the other direction or how we would safely and reliably map 
> > > directory names to library versions and therefore to compiler versions.
> > I agree that figuring out the right value for fmsc-version automatically 
> > somehow is definitely something we should do.
> > 
> > I forgot that `getVisualStudioBinariesFolder` already works by looking for 
> > cl.exe in PATH, so cl.exe's metadata is already warmed up in the disk 
> > cache. However, GetFileVersionInfoW() probably opens cl.exe itself and does 
> > some PE parsing to get at the version, and that probably is in cold cache 
> > territory. 
> > (https://msdn.microsoft.com/en-us/library/windows/desktop/ms647003(v=vs.85).aspx
> >  suggests that this function might open several files).
> > 
> > `getVisualStudioBinariesFolder` checks:
> > 
> > 1. getenv("VCINSTALLDIR")
> > 2. cl.exe in getenv("PATH")
> > 3. registry (via getVisualStudioInstallDir)
> > 
> > The common cases are 1 and 3. For 1, for default installs, the version 
> > number is part of the directory name (for default installs, what most 
> > people have). For 3, the version number is in the registry key we query. So 
> > in most cases we shouldn't have to look at cl.exe itself. And for the cases 
> > where we would have to look, maybe it's ok to require an explicit 
> > fmsc-version flag.
> The version number in the directory name and the registry is the version 
> number of Visual Studio not of the compiler.  Yes, we could do a mapping (VS 
> 14 comes bundled with CL 19), assuming Microsoft continues to keep VS 
> releases and compiler releases in sync, and it means this code will forever 
> need updates to the mapping data.
> 
> The mapping would give just the major version number, which might be all that 
> matters now, but if there's ever a CL 19.1 that has different compatibility 
> requirements (and is maybe released out-of-band with Visual Studio), we'd be 
> stuck.
> 
> Getting the actual version from the compiler seems the most accurate and 
> future-proof way to check.  If that's too expensive, then maybe we should 
> abandon the idea of detecting the default for compatibility.
I'll do some research to figure out the actual costs.  I suspect that walking 
the PATH for the executable may be far more expensive, but I'll get some 
numbers and report back.


http://reviews.llvm.org/D20136



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to