Skip to content

Commit ca6bbe0

Browse files
committed
[OpenMP] Make clang argument handling for the new driver more generic
In preparation for accepting other offloading kinds with the new driver, this patch makes the way we handle offloading actions more generic. A new field to get the associated device action's toolchain is used rather than manually iterating a list. This makes building the arguments easier and makes sure that we doin't rely on any implicit ordering. Reviewed By: yaxunl Differential Revision: https://reviews.llvm.org/D123313
1 parent 643c9b2 commit ca6bbe0

File tree

3 files changed

+41
-28
lines changed

3 files changed

+41
-28
lines changed

clang/include/clang/Driver/Action.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ class Action {
128128
/// The Offloading architecture associated with this action.
129129
const char *OffloadingArch = nullptr;
130130

131+
/// The Offloading toolchain associated with this device action.
132+
const ToolChain *OffloadingToolChain = nullptr;
133+
131134
Action(ActionClass Kind, types::ID Type) : Action(Kind, ActionList(), Type) {}
132135
Action(ActionClass Kind, Action *Input, types::ID Type)
133136
: Action(Kind, ActionList({Input}), Type) {}
@@ -184,7 +187,8 @@ class Action {
184187

185188
/// Set the device offload info of this action and propagate it to its
186189
/// dependences.
187-
void propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch);
190+
void propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch,
191+
const ToolChain *OToolChain);
188192

189193
/// Append the host offload info of this action and propagate it to its
190194
/// dependences.
@@ -205,10 +209,13 @@ class Action {
205209

206210
OffloadKind getOffloadingDeviceKind() const { return OffloadingDeviceKind; }
207211
const char *getOffloadingArch() const { return OffloadingArch; }
212+
const ToolChain *getOffloadingToolChain() const {
213+
return OffloadingToolChain;
214+
}
208215

209216
/// Check if this action have any offload kinds. Note that host offload kinds
210217
/// are only set if the action is a dependence to a host offload action.
211-
bool isHostOffloading(OffloadKind OKind) const {
218+
bool isHostOffloading(unsigned int OKind) const {
212219
return ActiveOffloadKindMask & OKind;
213220
}
214221
bool isDeviceOffloading(OffloadKind OKind) const {

clang/lib/Driver/Action.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ const char *Action::getClassName(ActionClass AC) {
5454
llvm_unreachable("invalid class");
5555
}
5656

57-
void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch) {
57+
void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch,
58+
const ToolChain *OToolChain) {
5859
// Offload action set its own kinds on their dependences.
5960
if (Kind == OffloadClass)
6061
return;
@@ -67,9 +68,10 @@ void Action::propagateDeviceOffloadInfo(OffloadKind OKind, const char *OArch) {
6768
assert(!ActiveOffloadKindMask && "Setting a device kind in a host action??");
6869
OffloadingDeviceKind = OKind;
6970
OffloadingArch = OArch;
71+
OffloadingToolChain = OToolChain;
7072

7173
for (auto *A : Inputs)
72-
A->propagateDeviceOffloadInfo(OffloadingDeviceKind, OArch);
74+
A->propagateDeviceOffloadInfo(OffloadingDeviceKind, OArch, OToolChain);
7375
}
7476

7577
void Action::propagateHostOffloadInfo(unsigned OKinds, const char *OArch) {
@@ -91,7 +93,8 @@ void Action::propagateOffloadInfo(const Action *A) {
9193
propagateHostOffloadInfo(HK, A->getOffloadingArch());
9294
else
9395
propagateDeviceOffloadInfo(A->getOffloadingDeviceKind(),
94-
A->getOffloadingArch());
96+
A->getOffloadingArch(),
97+
A->getOffloadingToolChain());
9598
}
9699

97100
std::string Action::getOffloadingKindPrefix() const {
@@ -192,6 +195,7 @@ OffloadAction::OffloadAction(const DeviceDependences &DDeps, types::ID Ty)
192195
DevToolChains(DDeps.getToolChains()) {
193196
auto &OKinds = DDeps.getOffloadKinds();
194197
auto &BArchs = DDeps.getBoundArchs();
198+
auto &OTCs = DDeps.getToolChains();
195199

196200
// If all inputs agree on the same kind, use it also for this action.
197201
if (llvm::all_of(OKinds, [&](OffloadKind K) { return K == OKinds.front(); }))
@@ -203,7 +207,7 @@ OffloadAction::OffloadAction(const DeviceDependences &DDeps, types::ID Ty)
203207

204208
// Propagate info to the dependencies.
205209
for (unsigned i = 0, e = getInputs().size(); i != e; ++i)
206-
getInputs()[i]->propagateDeviceOffloadInfo(OKinds[i], BArchs[i]);
210+
getInputs()[i]->propagateDeviceOffloadInfo(OKinds[i], BArchs[i], OTCs[i]);
207211
}
208212

209213
OffloadAction::OffloadAction(const HostDependence &HDep,
@@ -222,7 +226,8 @@ OffloadAction::OffloadAction(const HostDependence &HDep,
222226
if (auto *A = DDeps.getActions()[i]) {
223227
getInputs().push_back(A);
224228
A->propagateDeviceOffloadInfo(DDeps.getOffloadKinds()[i],
225-
DDeps.getBoundArchs()[i]);
229+
DDeps.getBoundArchs()[i],
230+
DDeps.getToolChains()[i]);
226231
}
227232
}
228233

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4384,11 +4384,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
43844384
bool IsHIP = JA.isOffloading(Action::OFK_HIP);
43854385
bool IsHIPDevice = JA.isDeviceOffloading(Action::OFK_HIP);
43864386
bool IsOpenMPDevice = JA.isDeviceOffloading(Action::OFK_OpenMP);
4387-
bool IsOpenMPHost = JA.isHostOffloading(Action::OFK_OpenMP);
43884387
bool IsHeaderModulePrecompile = isa<HeaderModulePrecompileJobAction>(JA);
43894388
bool IsExtractAPI = isa<ExtractAPIJobAction>(JA);
43904389
bool IsDeviceOffloadAction = !(JA.isDeviceOffloading(Action::OFK_None) ||
43914390
JA.isDeviceOffloading(Action::OFK_Host));
4391+
bool IsHostOffloadingAction =
4392+
JA.isHostOffloading(Action::OFK_OpenMP) &&
4393+
!Args.hasArg(options::OPT_fno_openmp_new_driver);
43924394
bool IsUsingLTO = D.isUsingLTO(IsDeviceOffloadAction);
43934395
auto LTOMode = D.getLTOMode(IsDeviceOffloadAction);
43944396

@@ -4415,7 +4417,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
44154417

44164418
InputInfoList ModuleHeaderInputs;
44174419
InputInfoList ExtractAPIInputs;
4418-
InputInfoList OpenMPHostInputs;
4420+
InputInfoList HostOffloadingInputs;
44194421
const InputInfo *CudaDeviceInput = nullptr;
44204422
const InputInfo *OpenMPDeviceInput = nullptr;
44214423
for (const InputInfo &I : Inputs) {
@@ -4438,12 +4440,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
44384440
<< types::getTypeName(ExpectedInputType);
44394441
}
44404442
ExtractAPIInputs.push_back(I);
4443+
} else if (IsHostOffloadingAction) {
4444+
HostOffloadingInputs.push_back(I);
44414445
} else if ((IsCuda || IsHIP) && !CudaDeviceInput) {
44424446
CudaDeviceInput = &I;
44434447
} else if (IsOpenMPDevice && !OpenMPDeviceInput) {
44444448
OpenMPDeviceInput = &I;
4445-
} else if (IsOpenMPHost) {
4446-
OpenMPHostInputs.push_back(I);
44474449
} else {
44484450
llvm_unreachable("unexpectedly given multiple inputs");
44494451
}
@@ -6948,24 +6950,23 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
69486950
}
69496951
}
69506952

6951-
// Host-side OpenMP offloading recieves the device object files and embeds it
6952-
// in a named section including the associated target triple and architecture.
6953-
if (IsOpenMPHost && !OpenMPHostInputs.empty()) {
6954-
auto InputFile = OpenMPHostInputs.begin();
6955-
auto OpenMPTCs = C.getOffloadToolChains<Action::OFK_OpenMP>();
6956-
for (auto TI = OpenMPTCs.first, TE = OpenMPTCs.second; TI != TE;
6957-
++TI, ++InputFile) {
6958-
const ToolChain *TC = TI->second;
6959-
const ArgList &TCArgs = C.getArgsForToolChain(TC, "", Action::OFK_OpenMP);
6960-
StringRef File =
6961-
C.getArgs().MakeArgString(TC->getInputFilename(*InputFile));
6953+
// Host-side offloading recieves the device object files and embeds it in a
6954+
// named section including the associated target triple and architecture.
6955+
for (const InputInfo Input : HostOffloadingInputs) {
6956+
const Action *OffloadAction = Input.getAction();
6957+
const ToolChain *TC = OffloadAction->getOffloadingToolChain();
6958+
const ArgList &TCArgs =
6959+
C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(),
6960+
OffloadAction->getOffloadingDeviceKind());
6961+
StringRef File = C.getArgs().MakeArgString(TC->getInputFilename(Input));
6962+
StringRef Arch = (OffloadAction->getOffloadingArch())
6963+
? OffloadAction->getOffloadingArch()
6964+
: TCArgs.getLastArgValue(options::OPT_march_EQ);
69626965

6963-
CmdArgs.push_back(
6964-
Args.MakeArgString("-fembed-offload-object=" + File + "," +
6965-
Action::GetOffloadKindName(Action::OFK_OpenMP) +
6966-
"," + TC->getTripleString() + "," +
6967-
TCArgs.getLastArgValue(options::OPT_march_EQ)));
6968-
}
6966+
CmdArgs.push_back(Args.MakeArgString(
6967+
"-fembed-offload-object=" + File + "," +
6968+
Action::GetOffloadKindName(OffloadAction->getOffloadingDeviceKind()) +
6969+
"," + TC->getTripleString() + "," + Arch));
69696970
}
69706971

69716972
if (Triple.isAMDGPU()) {

0 commit comments

Comments
 (0)