Index: lib/Driver/ToolChains/Gnu.cpp =================================================================== --- lib/Driver/ToolChains/Gnu.cpp +++ lib/Driver/ToolChains/Gnu.cpp @@ -206,6 +206,10 @@ static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { + // Do not add the XRay runtime to shared libraries. + if (Args.hasArg(options::OPT_shared)) + return false; + if (Args.hasFlag(options::OPT_fxray_instrument, options::OPT_fnoxray_instrument, false)) { CmdArgs.push_back("-whole-archive"); @@ -213,6 +217,7 @@ CmdArgs.push_back("-no-whole-archive"); return true; } + return false; } Index: test/Driver/XRay/lit.local.cfg =================================================================== --- test/Driver/XRay/lit.local.cfg +++ test/Driver/XRay/lit.local.cfg @@ -1,2 +1,21 @@ target_triple_components = config.target_triple.split('-') config.available_features.update(target_triple_components) + +# Only run the tests in platforms where XRay instrumentation is supported. +supported_targets = [ + 'amd64', 'x86_64', 'x86_64h', 'arm', 'aarch64', 'arm64', 'powerpc64le', + 'mips', 'mipsel', 'mips64', 'mips64el' +] + +# Only on platforms we support. +supported_oses = [ + 'linux' +] + +triple_set = set(target_triple_components) +if len(triple_set.intersection(supported_targets)) == 0: + config.unsupported = True + +# Do not run for 'android' despite being linux. +if len(triple_set.intersection(supported_oses)) == 0 or 'android' in triple_set: + config.unsupported = True Index: test/Driver/XRay/xray-shared-noxray.cpp =================================================================== --- /dev/null +++ test/Driver/XRay/xray-shared-noxray.cpp @@ -0,0 +1,16 @@ +// RUN: %clangxx -shared -fPIC -o /dev/null -v -fxray-instrument %s 2>&1 | \ +// RUN: FileCheck %s --check-prefix=SHARED +// RUN: %clangxx -static -o /dev/null -v -fxray-instrument %s 2>&1 -DMAIN | \ +// RUN: FileCheck %s --check-prefix=STATIC +// RUN: %clangxx -static -fPIE -o /dev/null -v -fxray-instrument %s 2>&1 \ +// RUN: -DMAIN | FileCheck %s --check-prefix=STATIC +// +// SHARED-NOT: {{clang_rt\.xray-}} +// STATIC: {{clang_rt\.xray-}} +// +// REQUIRES: linux +int foo() { return 42; } + +#ifdef MAIN +int main() { return foo(); } +#endif