[Flang][Driver] Add support for fopenmp-is-device and fembed-offload-object to Flang ToolChain
This allows-fembed-offload-object's and -fopenmp-is-device
compiler invocation arguments to be passed to the Flang frontend
during split compilation when offloading in OpenMP.
An example use case is when passing an offload-arch alongside
-fopenmp to embed device objects compiled for the offload-arch
within the host architecture.
This borrows from existing clangDriver+Clang.h/.cpp work and the intent
is currently to reuse as much of the existing infrastructure and design as
we can to achieve offloading for Flang+OpenMP. An overview of
Clang's offloading design can be found
here: https://clang.llvm.org/docs/OffloadingDesign.html
Reviewers:
awarzynski
jhuber6
Differential Revision: https://reviews.llvm.org/D145815
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 10a518c..0a4a0de 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -114,6 +114,35 @@
// TODO: Add target specific flags, ABI, mtune option etc.
}
+void Flang::addOffloadOptions(Compilation &C, const InputInfoList &Inputs,
+ const JobAction &JA, const ArgList &Args,
+ ArgStringList &CmdArgs) const {
+ bool IsOpenMPDevice = JA.isDeviceOffloading(Action::OFK_OpenMP);
+ bool IsHostOffloadingAction = JA.isHostOffloading(Action::OFK_OpenMP) ||
+ JA.isHostOffloading(C.getActiveOffloadKinds());
+
+ // Skips the primary input file, which is the input file that the compilation
+ // proccess will be executed upon (e.g. the host bitcode file) and
+ // adds the other secondary input (e.g. device bitcode files for embedding)
+ // to the embed offload object. This is condensed logic from the Clang driver
+ // for embedding offload objects during HostOffloading.
+ if (IsHostOffloadingAction) {
+ for (size_t i = 1; i < Inputs.size(); ++i) {
+ if (Inputs[i].getType() != types::TY_Nothing)
+ CmdArgs.push_back(
+ Args.MakeArgString("-fembed-offload-object=" +
+ getToolChain().getInputFilename(Inputs[i])));
+ }
+ }
+
+ if (IsOpenMPDevice) {
+ // -fopenmp-is-device is passed along to tell the frontend that it is
+ // generating code for a device, so that only the relevant code is
+ // emitted.
+ CmdArgs.push_back("-fopenmp-is-device");
+ }
+}
+
static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
ArgStringList &CmdArgs) {
StringRef FPContract;
@@ -327,6 +356,9 @@
// Add other compile options
addOtherOptions(Args, CmdArgs);
+ // Offloading related options
+ addOffloadOptions(C, Inputs, JA, Args, CmdArgs);
+
// Forward -Xflang arguments to -fc1
Args.AddAllArgValues(CmdArgs, options::OPT_Xflang);