[LLVMdev] Can we establish layering for the LLD libraries? Current state is a bit of a mess...

Nick Kledzik kledzik at apple.com
Tue Jan 20 17:35:53 PST 2015


On Jan 19, 2015, at 6:33 PM, Chandler Carruth <chandlerc at google.com> wrote:

> I wanted to go through and map out the layering of LLD's libraries today and found that it's essentially impossible. I think some serious cleanup is needed here.
> 
> Let's start with the purely link-level dependencies encoded in the CMake build:
> 
> Curently the Core library depends on the ReaderWriter/Native library, which links against the ReaderWriter library, which links against the Core library. This clearly cannot work. The same cycle exists with Core -> YAML -> ReaderWrite -> Core.
How are you determining these cycles?   How is Core dependent on YAML? (cause that seems wrong).


I just build all of lld in an Xcode projects (which compiles each .o file and links them all together).  I never see any of the layering...

> The situation seems a bit worse for includes. If you start from LinkingContext.h I think this becomes quite clear. This is ostensibly part of the Core library, but it has methods that produce types from the ReaderWriter library. Combined with the fact that ReaderWriter depends on Core (not the other way around) and ReaderWriter/ELF subclasses LinkingContext, I can't make heads or tails of what was intended here.
> 
> 
> My vague guess is that Core should actually be two libraries. One that doesn't depend on anything (other than Config) and provides the very "core" types for LLD. And another, perhaps called "Linker" which is a much higher-level library and provides useful APIs for actually doing linking, depends on ReaderWriter and provides methods that manipulate it. I could even see needing to spilt the target libraries in a similar manner.
> 
> 
> But I don't know LLD's design well, I'm just trying to stitch the build system back together in a reasonable way, so maybe I've missed things completely. So help me out. I'd like to understand a reasonable DAG in which to construct libraries for LLD. Having this should allow proper layering, layering checks, and eventually building with C++ modules. All of which seem essentially impossible today.

One question I have is what should the granularity of the libraries be?  At one point I asked about building an lld for OSX that only had mach-o support and got push-back that lld should always be a universal linker.  If that is the case, why have so many small libraries?  

Besides lld the command line tool, I can see lld libraries being used to construct a JIT linker.  And in that case, I can see wanting a very pared down linker - just one file format (not yaml) and no driver.  



More information about the llvm-dev mailing list