dberris created this revision.
dberris added reviewers: eizan, kpw, pelikan.

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 
https://reviews.llvm.org/D45474.


https://reviews.llvm.org/D45610

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


Index: clang/test/Driver/XRay/xray-mode-flags.cpp
===================================================================
--- clang/test/Driver/XRay/xray-mode-flags.cpp
+++ 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
Index: clang/lib/Driver/XRayArgs.cpp
===================================================================
--- clang/lib/Driver/XRayArgs.cpp
+++ clang/lib/Driver/XRayArgs.cpp
@@ -146,21 +146,16 @@
       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 @@
     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: clang/test/Driver/XRay/xray-mode-flags.cpp
===================================================================
--- clang/test/Driver/XRay/xray-mode-flags.cpp
+++ 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
Index: clang/lib/Driver/XRayArgs.cpp
===================================================================
--- clang/lib/Driver/XRayArgs.cpp
+++ clang/lib/Driver/XRayArgs.cpp
@@ -146,21 +146,16 @@
       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 @@
     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));
+  }
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D45610: [XRay]... Dean Michael Berris via Phabricator via cfe-commits

Reply via email to