diff options
author | Dean Michael Berris <dberris@google.com> | 2018-04-04 12:47:49 +0000 |
---|---|---|
committer | Dean Michael Berris <dberris@google.com> | 2018-04-04 12:47:49 +0000 |
commit | 9b59233f57269ea163aee4f715b21cc6319b0813 (patch) | |
tree | e539148dca73143834005dc618b2edb14a31e5e7 /clang/lib/Driver/ToolChains/OpenBSD.cpp | |
parent | b1c746ef043c4c21677f0e25c5af8a82d257fac9 (diff) | |
download | bcm5719-llvm-9b59233f57269ea163aee4f715b21cc6319b0813.tar.gz bcm5719-llvm-9b59233f57269ea163aee4f715b21cc6319b0813.zip |
[XRay][clang] Allow clang to build XRay instrumented binaries in OpenBSD
Summary:
This patch was originally reviewed in D45126. It enables clang to add
the XRay runtime and the link-time dependencies for XRay instrumentation
in OpenBSD.
Landing for devnexen.
Reviewers: brad, dberris
Subscribers: dberris, krytarowski, cfe-commits
Author: devnexen
Differential Revision: https://reviews.llvm.org/D45126
llvm-svn: 329183
Diffstat (limited to 'clang/lib/Driver/ToolChains/OpenBSD.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/OpenBSD.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp index c0f8eff6418..3a33432f3dc 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.cpp +++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp @@ -22,6 +22,29 @@ using namespace clang::driver::toolchains; using namespace clang; using namespace llvm::opt; +static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + 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"); + CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false)); + CmdArgs.push_back("-no-whole-archive"); + return true; + } + + return false; +} + +static void linkXRayRuntimeDeps(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + CmdArgs.push_back("--no-as-needed"); + CmdArgs.push_back("-lm"); + CmdArgs.push_back("-lpthread"); +} + void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -180,6 +203,7 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_Z_Flag, options::OPT_r}); bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); + bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs); AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { @@ -195,6 +219,10 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(ToolChain.getCompilerRTArgString(Args, "builtins", false)); linkSanitizerRuntimeDeps(ToolChain, CmdArgs); } + if (NeedsXRayDeps) { + CmdArgs.push_back(ToolChain.getCompilerRTArgString(Args, "builtins", false)); + linkXRayRuntimeDeps(ToolChain, Args, CmdArgs); + } // FIXME: For some reason GCC passes -lgcc before adding // the default system libraries. Just mimic this for now. CmdArgs.push_back("-lgcc"); |