I am looking for a single driver that should be able to generate the assembly for a given target.
It should be able to generate the bitcode, run standard LTO passes, run target specific module passes and final function passes to generate assembly. So pretty much clang -emit-llvm-bc, llvm-ld , opt and llc functionality in a single executable.
Besides, the option to be able to invoke native assembler and native linker to generate final executable should also be handled by this driver.
Currently, clang takes a -triple option to specify the target.
Can a target schedule these things in clang?
Right now we are using a .td based compilerdriver plugin to invoke these different set of executables.
Clang already runs various passes as part of -O0, -O1, etc. Adding a
target hook for that would be relatively straightforward, although we
want to make sure that one doesn't have to link in LLVM just to run
-fsyntax-only.
I also plan to make the clang driver accept .ll and .bc files,
eventually, but I'm not sure if this is what you are asking.
It sounds like what you want is:
--
$ clang -c -emit-llvm -o a.bc a.c
$ clang -c -emit-llvm -o b.bc b.c
$ clang -emit-llvm -o t.bc a.bc b.bc # Let's suppose this ran LTO, in
practice we may need a new syntax.
Right. Currently we use llvm-ld here.
$ clang -o t t.bc # This would run code generation, assembly, link.
--
where in step (4) you had the option of defining some passes to be run
before code generation.
Is this what you are looking for?
Precisely.
$ clang a.c b.c
should do all the 4 steps above. Much like a cross compiler driver, lets
say xyz-gcc.