summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/ToolChains/OpenBSD.cpp
diff options
context:
space:
mode:
authorDean Michael Berris <dberris@google.com>2018-04-04 12:47:49 +0000
committerDean Michael Berris <dberris@google.com>2018-04-04 12:47:49 +0000
commit9b59233f57269ea163aee4f715b21cc6319b0813 (patch)
treee539148dca73143834005dc618b2edb14a31e5e7 /clang/lib/Driver/ToolChains/OpenBSD.cpp
parentb1c746ef043c4c21677f0e25c5af8a82d257fac9 (diff)
downloadbcm5719-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.cpp28
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");
OpenPOWER on IntegriCloud