@@ -197,6 +197,51 @@ std::string Driver::GetResourcesPath(StringRef BinaryPath) {
197
197
return std::string (P);
198
198
}
199
199
200
+ CUIDOptions::CUIDOptions (llvm::opt::DerivedArgList &Args, const Driver &D)
201
+ : UseCUID(Kind::Hash) {
202
+ if (Arg *A = Args.getLastArg (options::OPT_fuse_cuid_EQ)) {
203
+ StringRef UseCUIDStr = A->getValue ();
204
+ UseCUID = llvm::StringSwitch<Kind>(UseCUIDStr)
205
+ .Case (" hash" , Kind::Hash)
206
+ .Case (" random" , Kind::Random)
207
+ .Case (" none" , Kind::None)
208
+ .Default (Kind::Invalid);
209
+ if (UseCUID == Kind::Invalid) {
210
+ D.Diag (clang::diag::err_drv_invalid_value)
211
+ << A->getAsString (Args) << UseCUIDStr;
212
+ }
213
+ }
214
+
215
+ FixedCUID = Args.getLastArgValue (options::OPT_cuid_EQ);
216
+ if (!FixedCUID.empty ())
217
+ UseCUID = Kind::Fixed;
218
+ }
219
+
220
+ std::string CUIDOptions::getCUID (StringRef InputFile,
221
+ llvm::opt::DerivedArgList &Args) const {
222
+ std::string CUID = FixedCUID.str ();
223
+ if (CUID.empty ()) {
224
+ if (UseCUID == Kind::Random)
225
+ CUID = llvm::utohexstr (llvm::sys::Process::GetRandomNumber (),
226
+ /* LowerCase=*/ true );
227
+ else if (UseCUID == Kind::Hash) {
228
+ llvm::MD5 Hasher;
229
+ llvm::MD5::MD5Result Hash;
230
+ SmallString<256 > RealPath;
231
+ llvm::sys::fs::real_path (InputFile, RealPath,
232
+ /* expand_tilde=*/ true );
233
+ Hasher.update (RealPath);
234
+ for (auto *A : Args) {
235
+ if (A->getOption ().matches (options::OPT_INPUT))
236
+ continue ;
237
+ Hasher.update (A->getAsString (Args));
238
+ }
239
+ Hasher.final (Hash);
240
+ CUID = llvm::utohexstr (Hash.low (), /* LowerCase=*/ true );
241
+ }
242
+ }
243
+ return CUID;
244
+ }
200
245
Driver::Driver (StringRef ClangExecutable, StringRef TargetTriple,
201
246
DiagnosticsEngine &Diags, std::string Title,
202
247
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS)
@@ -875,6 +920,9 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
875
920
C.addOffloadDeviceToolChain (HIPTC, OFK);
876
921
}
877
922
923
+ if (IsCuda || IsHIP)
924
+ CUIDOpts = CUIDOptions (C.getArgs (), *this );
925
+
878
926
//
879
927
// OpenMP
880
928
//
@@ -3156,19 +3204,15 @@ class OffloadingActionBuilder final {
3156
3204
// / Default GPU architecture if there's no one specified.
3157
3205
OffloadArch DefaultOffloadArch = OffloadArch::UNKNOWN;
3158
3206
3159
- // / Method to generate compilation unit ID specified by option
3160
- // / '-fuse-cuid='.
3161
- enum UseCUIDKind { CUID_Hash, CUID_Random, CUID_None, CUID_Invalid };
3162
- UseCUIDKind UseCUID = CUID_Hash;
3163
-
3164
- // / Compilation unit ID specified by option '-cuid='.
3165
- StringRef FixedCUID;
3207
+ // / Compilation unit ID specified by option '-fuse-cuid=' or'-cuid='.
3208
+ const CUIDOptions &CUIDOpts;
3166
3209
3167
3210
public:
3168
3211
CudaActionBuilderBase (Compilation &C, DerivedArgList &Args,
3169
3212
const Driver::InputList &Inputs,
3170
3213
Action::OffloadKind OFKind)
3171
- : DeviceActionBuilder(C, Args, Inputs, OFKind) {
3214
+ : DeviceActionBuilder(C, Args, Inputs, OFKind),
3215
+ CUIDOpts (C.getDriver().getCUIDOpts()) {
3172
3216
3173
3217
CompileDeviceOnly = C.getDriver ().offloadDeviceOnly ();
3174
3218
Relocatable = Args.hasFlag (options::OPT_fgpu_rdc,
@@ -3199,28 +3243,8 @@ class OffloadingActionBuilder final {
3199
3243
// Set the flag to true, so that the builder acts on the current input.
3200
3244
IsActive = true ;
3201
3245
3202
- std::string CUID = FixedCUID.str ();
3203
- if (CUID.empty ()) {
3204
- if (UseCUID == CUID_Random)
3205
- CUID = llvm::utohexstr (llvm::sys::Process::GetRandomNumber (),
3206
- /* LowerCase=*/ true );
3207
- else if (UseCUID == CUID_Hash) {
3208
- llvm::MD5 Hasher;
3209
- llvm::MD5::MD5Result Hash;
3210
- SmallString<256 > RealPath;
3211
- llvm::sys::fs::real_path (IA->getInputArg ().getValue (), RealPath,
3212
- /* expand_tilde=*/ true );
3213
- Hasher.update (RealPath);
3214
- for (auto *A : Args) {
3215
- if (A->getOption ().matches (options::OPT_INPUT))
3216
- continue ;
3217
- Hasher.update (A->getAsString (Args));
3218
- }
3219
- Hasher.final (Hash);
3220
- CUID = llvm::utohexstr (Hash.low (), /* LowerCase=*/ true );
3221
- }
3222
- }
3223
- IA->setId (CUID);
3246
+ if (CUIDOpts.isEnabled ())
3247
+ IA->setId (CUIDOpts.getCUID (IA->getInputArg ().getValue (), Args));
3224
3248
3225
3249
if (CompileHostOnly)
3226
3250
return ABRT_Success;
@@ -3346,21 +3370,6 @@ class OffloadingActionBuilder final {
3346
3370
CompileHostOnly = C.getDriver ().offloadHostOnly ();
3347
3371
EmitLLVM = Args.getLastArg (options::OPT_emit_llvm);
3348
3372
EmitAsm = Args.getLastArg (options::OPT_S);
3349
- FixedCUID = Args.getLastArgValue (options::OPT_cuid_EQ);
3350
- if (Arg *A = Args.getLastArg (options::OPT_fuse_cuid_EQ)) {
3351
- StringRef UseCUIDStr = A->getValue ();
3352
- UseCUID = llvm::StringSwitch<UseCUIDKind>(UseCUIDStr)
3353
- .Case (" hash" , CUID_Hash)
3354
- .Case (" random" , CUID_Random)
3355
- .Case (" none" , CUID_None)
3356
- .Default (CUID_Invalid);
3357
- if (UseCUID == CUID_Invalid) {
3358
- C.getDriver ().Diag (diag::err_drv_invalid_value)
3359
- << A->getAsString (Args) << UseCUIDStr;
3360
- C.setContainsError ();
3361
- return true ;
3362
- }
3363
- }
3364
3373
3365
3374
// --offload and --offload-arch options are mutually exclusive.
3366
3375
if (Args.hasArgNoClaim (options::OPT_offload_EQ) &&
@@ -4360,6 +4369,10 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
4360
4369
// Build the pipeline for this file.
4361
4370
Action *Current = C.MakeAction <InputAction>(*InputArg, InputType);
4362
4371
4372
+ if (CUIDOpts.isEnabled () && types::isSrcFile (InputType))
4373
+ cast<InputAction>(Current)->setId (
4374
+ CUIDOpts.getCUID (InputArg->getValue (), Args));
4375
+
4363
4376
// Use the current host action in any of the offloading actions, if
4364
4377
// required.
4365
4378
if (!UseNewOffloadingDriver)
@@ -4805,8 +4818,12 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
4805
4818
TCAndArchs.push_back (std::make_pair (TC, Arch));
4806
4819
}
4807
4820
4808
- for (unsigned I = 0 , E = TCAndArchs.size (); I != E; ++I)
4809
- DeviceActions.push_back (C.MakeAction <InputAction>(*InputArg, InputType));
4821
+ for (unsigned I = 0 , E = TCAndArchs.size (); I != E; ++I) {
4822
+ auto *IA = C.MakeAction <InputAction>(*InputArg, InputType);
4823
+ if (CUIDOpts.isEnabled ())
4824
+ IA->setId (CUIDOpts.getCUID (IA->getInputArg ().getValue (), Args));
4825
+ DeviceActions.push_back (IA);
4826
+ }
4810
4827
4811
4828
if (DeviceActions.empty ())
4812
4829
return HostAction;
0 commit comments