[LLVMdev] VC++ linking issues, revisited

Jeff Cohen jeffc at jolt-lang.org
Sat Jan 1 17:05:49 PST 2005


I've gone about as far as I can in building executables with VC++.  The 
problem with the remaining ones is that they rely on the static 
constructor trick to register various modules.  This doesn't work with 
VC++ because without an explicit external reference to these modules 
they simply can't be linked in to an executable.

This isn't a new problem, of course.  Morten originally ran into this 
getting the X86 backend to link in, and solved it by introducing a 
global variable that could be used as the external reference.  The 
problem is, this doesn't scale.  There are few code generator targets, 
and fewer still that one would care to use on Windows.  But there are 
dozens of optimizations and analyses.  It's not practical or 
maintainable to give each one a global variable and then reference it 
from each affected executable.

So I can (and have, actually) build "opt", but it's just a big waste of 
bytes as it has no optimizations available to it.  And if I understand 
things correctly, it means that the JIT can't do any optimizations either.

I'm not really sure how to deal with this.  The best solution I can come 
up with is to put all of these modules into DLLs.  When a DLL is loaded, 
all of its static constructors are executed, regardless of which modules 
are externally referenced.  Nonetheless, there must be at least *one* 
external reference, or else the DLL wouldn't be loaded automatically in 
the first place.  The DLL could be manually loaded, but that would be 
introducing Windows-specific code in places you probably don't want it.  
However, one global (or dummy function) for all optimizations or all 
code generator targets or all analyses is much better than one for each 
optimization or target or analysis.

I think this will work, but it does represent a major change in how the 
VC++ build is conducted and I want to get feedback first, especially 
from Morten.




More information about the llvm-dev mailing list