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