]> granicus.if.org Git - clang/commitdiff
[XRay][clang] Make -fxray-modes= additive
authorDean Michael Berris <dberris@google.com>
Fri, 13 Apr 2018 05:59:57 +0000 (05:59 +0000)
committerDean Michael Berris <dberris@google.com>
Fri, 13 Apr 2018 05:59:57 +0000 (05:59 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@329989 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/XRayArgs.cpp
test/Driver/XRay/xray-mode-flags.cpp

index e25259ca6d64c4220cddb61bd8d3321ec23d744b..873693354d18252347dd0df29c81bd41bfb75d97 100644 (file)
@@ -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<StringRef, 2> 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));
+  }
 }
index 9c87b8e55e3d642f2fa6d4fa9ad0833659f45bad..0a040881d332cf2d7564fba89976e34240c52e04 100644 (file)
 // 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