[LLVMdev] VC++ linking issues, revisited
Morten Ofstad
morten at hue.no
Mon Jan 3 07:15:30 PST 2005
Hello,
I've been away working on other things so I have not been able to
respond to mails on this mailing list for a while. But today I got back
and I got the latest version of LLVM from CVS and built it successfully
(after I deleted my old config.h which was included instead of the one
in the new location)...
Jeff Cohen wrote:
> OK, there may be some light at the end of the tunnel. I *can* force
> an arbitrary .obj file to become part of the executable, one that is
> not part of the executable's project. This is sufficient to eliminate
> the global variable hack Morten introduced for the X86 target.
However I can no longer link it with our main project since the
X86TargetMachine symbol is gone, and the intermediate object files are
not available to the other project. I can't easily do the same as the
fibonacci example does, so I have to put it back to the way it was.
> But this still doesn't scale very well, as I'd have to manually
> enumerate all .objs that are transforms and insert this list into
> every project that builds an executable that needs them.
I only have the problem with the X86TargetMachine because in the case of
the optimization passes I explicitly call the createXXXPass functions.
'opt' creates passes by name instead and that's why it gets into trouble.
> So there's only two ways of dealing with this. The first is to use
> DLLs. To prevent code from being duplicated in multiple DLLs and the
> EXE, the bulk of the code in lib/ will have to go in DLLs. To keep the
> number of DLLs reasonable, many projects will have to be collapsed into
> one. There will be one DLL (and project) each for the transforms, the
> analyses, and the targets, and one catchall DLL for all common
> dependencies of the other three.
I looked at this, but the problem is that DLLs need explicit __declspec(
dllimport) and __declspec(dllexport) on all symbols that are to be
exported and imported. I think adding the declarators to all the symbols
that are exported/imported is a lot of work and also pollutes the source
for the Unix versions.
> The other way is to stick a unique global variable in each transform and
> analysis, create one header file that uses the globals in all the
> transforms, and likewise for the analyses, and include that header file
> from any executable that needs its services. There are few enough
> targets that using forced dependencies works, though this approach can
> be used here as well for consistency.
I think this solution is quite OK considering almost all the modules
already have such global symbols, namely the createXXXPass functions.
m.
More information about the llvm-dev
mailing list