[clang] 1054a73 - [Clang] Change host/device only compilation to a driver mode
Joseph Huber via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 13 08:34:10 PDT 2022
Author: Joseph Huber
Date: 2022-06-13T11:33:54-04:00
New Revision: 1054a7318788beb99536d84b34f84fccf2289769
URL: https://github.com/llvm/llvm-project/commit/1054a7318788beb99536d84b34f84fccf2289769
DIFF: https://github.com/llvm/llvm-project/commit/1054a7318788beb99536d84b34f84fccf2289769.diff
LOG: [Clang] Change host/device only compilation to a driver mode
We use the flags `--offload-host-only` and `--offload-device-only` to
change the driver's code generation for offloading programs. These are
currently parsed out independently in many places. This patch simply
refactors this to work as a mode for the Driver. This stopped us from
emitting warnings if unused because it's always used now, but I don't
think this is a great loss.
Reviewed By: tra
Differential Revision: https://reviews.llvm.org/D127515
Added:
Modified:
clang/include/clang/Driver/Driver.h
clang/lib/Driver/Driver.cpp
Removed:
clang/test/Driver/cuda-unused-arg-warning.cu
################################################################################
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index 67ff4dc2e01e8..774eac613a100 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -95,6 +95,12 @@ class Driver {
EmbedBitcode
} BitcodeEmbed;
+ enum OffloadMode {
+ OffloadHostDevice,
+ OffloadHost,
+ OffloadDevice,
+ } Offload;
+
/// Header unit mode set by -fmodule-header={user,system}.
ModuleHeaderMode CXX20HeaderType;
@@ -391,6 +397,9 @@ class Driver {
bool embedBitcodeInObject() const { return (BitcodeEmbed == EmbedBitcode); }
bool embedBitcodeMarkerOnly() const { return (BitcodeEmbed == EmbedMarker); }
+ bool offloadHostOnly() const { return Offload == OffloadHost; }
+ bool offloadDeviceOnly() const { return Offload == OffloadDevice; }
+
/// Compute the desired OpenMP runtime from the flags provided.
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const;
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index bb879805ae79e..70816def4b3fc 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -192,13 +192,14 @@ Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple,
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS)
: Diags(Diags), VFS(std::move(VFS)), Mode(GCCMode),
SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone),
- CXX20HeaderType(HeaderMode_None), ModulesModeCXX20(false),
- LTOMode(LTOK_None), ClangExecutable(ClangExecutable),
- SysRoot(DEFAULT_SYSROOT), DriverTitle(Title), CCCPrintBindings(false),
- CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false),
- CCGenDiagnostics(false), CCPrintProcessStats(false),
- TargetTriple(TargetTriple), Saver(Alloc), CheckInputsExist(true),
- ProbePrecompiled(true), SuppressMissingInputWarning(false) {
+ Offload(OffloadHostDevice), CXX20HeaderType(HeaderMode_None),
+ ModulesModeCXX20(false), LTOMode(LTOK_None),
+ ClangExecutable(ClangExecutable), SysRoot(DEFAULT_SYSROOT),
+ DriverTitle(Title), CCCPrintBindings(false), CCPrintOptions(false),
+ CCPrintHeaders(false), CCLogDiagnostics(false), CCGenDiagnostics(false),
+ CCPrintProcessStats(false), TargetTriple(TargetTriple), Saver(Alloc),
+ CheckInputsExist(true), ProbePrecompiled(true),
+ SuppressMissingInputWarning(false) {
// Provide a sane fallback if no VFS is specified.
if (!this->VFS)
this->VFS = llvm::vfs::getRealFileSystem();
@@ -1284,6 +1285,17 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
.Default(SaveTempsCwd);
}
+ if (const Arg *A = Args.getLastArg(options::OPT_offload_host_only,
+ options::OPT_offload_device_only,
+ options::OPT_offload_host_device)) {
+ if (A->getOption().matches(options::OPT_offload_host_only))
+ Offload = OffloadHost;
+ else if (A->getOption().matches(options::OPT_offload_device_only))
+ Offload = OffloadDevice;
+ else
+ Offload = OffloadHostDevice;
+ }
+
setLTOMode(Args);
// Process -fembed-bitcode= flags.
@@ -2933,15 +2945,8 @@ class OffloadingActionBuilder final {
? C.getSingleOffloadToolChain<Action::OFK_Cuda>()
: C.getSingleOffloadToolChain<Action::OFK_HIP>());
- Arg *PartialCompilationArg = Args.getLastArg(
- options::OPT_offload_host_only, options::OPT_offload_device_only,
- options::OPT_offload_host_device);
- CompileHostOnly =
- PartialCompilationArg && PartialCompilationArg->getOption().matches(
- options::OPT_offload_host_only);
- CompileDeviceOnly =
- PartialCompilationArg && PartialCompilationArg->getOption().matches(
- options::OPT_offload_device_only);
+ CompileHostOnly = C.getDriver().offloadHostOnly();
+ CompileDeviceOnly = C.getDriver().offloadDeviceOnly();
EmitLLVM = Args.getLastArg(options::OPT_emit_llvm);
EmitAsm = Args.getLastArg(options::OPT_S);
FixedCUID = Args.getLastArgValue(options::OPT_cuid_EQ);
@@ -4270,11 +4275,6 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
// Claim ignored clang-cl options.
Args.ClaimAllArgs(options::OPT_cl_ignored_Group);
-
- // Claim --offload-host-only and --offload-compile-host-device, which may be
- // passed to non-CUDA compilations and should not trigger warnings there.
- Args.ClaimAllArgs(options::OPT_offload_host_only);
- Args.ClaimAllArgs(options::OPT_offload_host_device);
}
/// Returns the canonical name for the offloading architecture when using a HIP
@@ -4393,18 +4393,10 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
llvm::opt::DerivedArgList &Args,
const InputTy &Input,
Action *HostAction) const {
- const Arg *Mode = Args.getLastArg(options::OPT_offload_host_only,
- options::OPT_offload_device_only,
- options::OPT_offload_host_device);
- const bool HostOnly =
- Mode && Mode->getOption().matches(options::OPT_offload_host_only);
- const bool DeviceOnly =
- Mode && Mode->getOption().matches(options::OPT_offload_device_only);
-
// Don't build offloading actions if explicitly disabled or we do not have a
// valid source input and compile action to embed it in. If preprocessing only
// ignore embedding.
- if (HostOnly || !types::isSrcFile(Input.first) ||
+ if (offloadHostOnly() || !types::isSrcFile(Input.first) ||
!(isa<CompileJobAction>(HostAction) ||
getFinalPhase(Args) == phases::Preprocess))
return HostAction;
@@ -4492,7 +4484,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
}
}
- if (DeviceOnly)
+ if (offloadDeviceOnly())
return C.MakeAction<OffloadAction>(DDeps, types::TY_Nothing);
Action *OffloadPackager =
diff --git a/clang/test/Driver/cuda-unused-arg-warning.cu b/clang/test/Driver/cuda-unused-arg-warning.cu
deleted file mode 100644
index 4e541c66def89..0000000000000
--- a/clang/test/Driver/cuda-unused-arg-warning.cu
+++ /dev/null
@@ -1,28 +0,0 @@
-// Tests that we trigger unused-arg warnings on CUDA flags appropriately.
-
-// REQUIRES: x86-registered-target
-// REQUIRES: nvptx-registered-target
-
-// --cuda-host-only and --cuda-compile-host-device should never trigger an
-// unused arg warning.
-// RUN: %clang -### -target x86_64-linux-gnu --cuda-host-only -c %s 2>&1 | \
-// RUN: FileCheck %s
-// RUN: %clang -### -target x86_64-linux-gnu --cuda-host-only -x c -c %s 2>&1 | \
-// RUN: FileCheck %s
-// RUN: %clang -### -target x86_64-linux-gnu --cuda-compile-host-device -c %s 2>&1 | \
-// RUN: FileCheck %s
-// RUN: %clang -### -target x86_64-linux-gnu --cuda-compile-host-device -x c -c %s 2>&1 | \
-// RUN: FileCheck %s
-
-// --cuda-device-only should warn during non-CUDA compilation.
-// RUN: %clang -### -target x86_64-linux-gnu --cuda-device-only -x c -c %s 2>&1 | \
-// RUN: FileCheck -check-prefix UNUSED-WARNING %s
-
-// --cuda-device-only should not produce warning compiling CUDA files
-// RUN: %clang -### -target x86_64-linux-gnu --cuda-device-only -c %s 2>&1 | \
-// RUN: FileCheck -check-prefix NO-UNUSED-WARNING %s
-
-// CHECK-NOT: warning: argument unused during compilation: '--cuda-host-only'
-// CHECK-NOT: warning: argument unused during compilation: '--cuda-compile-host-device'
-// UNUSED-WARNING: warning: argument unused during compilation: '--cuda-device-only'
-// NO-UNUSED-WARNING-NOT: warning: argument unused during compilation: '--cuda-device-only'
More information about the cfe-commits
mailing list