From 7fc737a2472996609a855c2b8951b4a327d13d69 Mon Sep 17 00:00:00 2001 From: Dean Michael Berris Date: Fri, 13 Apr 2018 05:59:57 +0000 Subject: [PATCH] [XRay][clang] Make -fxray-modes= additive Summary: This allows us to do the following: clang -fxray-modes=none ... -fxray-modes=xray-basic It's important to be able to do this in cases where we'd like to specialise the configuration for the invocation of the compiler, in various scripting environments. This is related to llvm.org/PR37066, a follow-up to D45474. Reviewers: eizan, kpw, pelikan Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D45610 llvm-svn: 329989 --- clang/lib/Driver/XRayArgs.cpp | 23 ++++++++++++----------- clang/test/Driver/XRay/xray-mode-flags.cpp | 12 ++++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/clang/lib/Driver/XRayArgs.cpp b/clang/lib/Driver/XRayArgs.cpp index e25259c..8736933 100644 --- a/clang/lib/Driver/XRayArgs.cpp +++ b/clang/lib/Driver/XRayArgs.cpp @@ -146,21 +146,16 @@ XRayArgs::XRayArgs(const ToolChain &TC, const ArgList &Args) { llvm::copy(XRaySupportedModes, std::back_inserter(Modes)); else for (const auto &Arg : SpecifiedModes) { - if (Arg == "none") { - Modes.clear(); - break; - } - if (Arg == "all") { - Modes.clear(); - llvm::copy(XRaySupportedModes, std::back_inserter(Modes)); - break; - } - // Parse CSV values for -fxray-modes=... llvm::SmallVector ModeParts; llvm::SplitString(Arg, ModeParts, ","); for (const auto &M : ModeParts) - Modes.push_back(M); + if (M == "none") + Modes.clear(); + else if (M == "all") + llvm::copy(XRaySupportedModes, std::back_inserter(Modes)); + else + Modes.push_back(M); } // Then we want to sort and unique the modes we've collected. @@ -205,4 +200,10 @@ void XRayArgs::addArgs(const ToolChain &TC, const ArgList &Args, ExtraDepOpt += Dep; CmdArgs.push_back(Args.MakeArgString(ExtraDepOpt)); } + + for (const auto &Mode : Modes) { + SmallString<64> ModeOpt("-fxray-modes="); + ModeOpt += Mode; + CmdArgs.push_back(Args.MakeArgString(ModeOpt)); + } } diff --git a/clang/test/Driver/XRay/xray-mode-flags.cpp b/clang/test/Driver/XRay/xray-mode-flags.cpp index 9c87b8e..0a04088 100644 --- a/clang/test/Driver/XRay/xray-mode-flags.cpp +++ b/clang/test/Driver/XRay/xray-mode-flags.cpp @@ -14,6 +14,18 @@ // RUN: 2>&1 | FileCheck --check-prefixes FDR,BASIC %s // RUN: %clang -v -o /dev/null -fxray-instrument -fxray-modes=none -### %s \ // RUN: 2>&1 | FileCheck --check-prefixes NONE %s +// +// We also should support overriding the modes in an additive manner. +// +// RUN: %clang -v -o /dev/null -fxray-instrument -fxray-modes=none,xray-fdr \ +// RUN: -### %s \ +// RUN: 2>&1 | FileCheck --check-prefixes FDR %s +// RUN: %clang -v -o /dev/null -fxray-instrument -fxray-modes=xray-fdr,none \ +// RUN: -### %s \ +// RUN: 2>&1 | FileCheck --check-prefixes NONE %s +// RUN: %clang -v -o /dev/null -fxray-instrument -fxray-modes=none,all \ +// RUN: -### %s \ +// RUN: 2>&1 | FileCheck --check-prefixes FDR,BASIC %s // BASIC: libclang_rt.xray-basic // FDR: libclang_rt.xray-fdr -- 2.7.4