The Clang gcc-compatible driver (clang/tools/driver/driver.cpp) has some logic to select an alternate target based on the executable it was called as. For instance, if you symlink i686-linux-android-gcc to clang and invoke it, the driver will act as though it were called with another argument (“-target i686-linux-android”). This leads to visible effects even in syntax-only compilations (like the ANDROID preprocessor symbol being defined).
This behavior is not replicated for tool invocations–for instance, clang::createInvocationFromCommandLine will not choose an alternate target based on ArgList. This means that configurations stored in compilation databases aren’t accurately replayed.
One possible solution is to move the target-extracting logic from driver/driver.cpp to a library (Frontend/Utils.h) and to be sure to call it in any situation where an argv-equivalent array is used to initialize the compiler. Is this appropriate, or does it violate some layering principle that I don’t understand?