diff options
author | Jeffrey Byrnes <Jeffrey.Byrnes@amd.com> | 2023-06-23 14:42:30 -0700 |
---|---|---|
committer | Jeffrey Byrnes <Jeffrey.Byrnes@amd.com> | 2023-06-29 08:18:28 -0700 |
commit | be8a65b598b3b80f73e862a01c7eaafe84d853a0 (patch) | |
tree | 2ee3893da8a135442401c2da93011dc5a4161f65 /clang/lib/Driver/Driver.cpp | |
parent | 21b6da35f1d5c8ee50c14fa4e498b6c46ac4bc0f (diff) | |
download | llvm-be8a65b598b3b80f73e862a01c7eaafe84d853a0.zip llvm-be8a65b598b3b80f73e862a01c7eaafe84d853a0.tar.gz llvm-be8a65b598b3b80f73e862a01c7eaafe84d853a0.tar.bz2 |
[HIP]: Add -fhip-emit-relocatable to override link job creation for -fno-gpu-rdc
Differential Revision: https://reviews.llvm.org/D153667
Change-Id: Idcc5c7c25dc350b8dc9a1865fd67982904d06ecd
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 1580f09..ccdaa5c 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2946,7 +2946,12 @@ class OffloadingActionBuilder final { CudaActionBuilderBase(Compilation &C, DerivedArgList &Args, const Driver::InputList &Inputs, Action::OffloadKind OFKind) - : DeviceActionBuilder(C, Args, Inputs, OFKind) {} + : DeviceActionBuilder(C, Args, Inputs, OFKind) { + + CompileDeviceOnly = C.getDriver().offloadDeviceOnly(); + Relocatable = Args.hasFlag(options::OPT_fgpu_rdc, + options::OPT_fno_gpu_rdc, /*Default=*/false); + } ActionBuilderReturnCode addDeviceDependences(Action *HostAction) override { // While generating code for CUDA, we only depend on the host input action @@ -3099,9 +3104,6 @@ class OffloadingActionBuilder final { !C.hasOffloadToolChain<Action::OFK_HIP>()) return false; - Relocatable = Args.hasFlag(options::OPT_fgpu_rdc, - options::OPT_fno_gpu_rdc, /*Default=*/false); - const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>(); assert(HostTC && "No toolchain for host compilation."); if (HostTC->getTriple().isNVPTX() || @@ -3120,7 +3122,6 @@ class OffloadingActionBuilder final { : C.getSingleOffloadToolChain<Action::OFK_HIP>()); 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); @@ -3352,16 +3353,40 @@ class OffloadingActionBuilder final { // only compilation. Bundle other type of output files only if // --gpu-bundle-output is specified for device only compilation. std::optional<bool> BundleOutput; + std::optional<bool> EmitReloc; public: HIPActionBuilder(Compilation &C, DerivedArgList &Args, const Driver::InputList &Inputs) : CudaActionBuilderBase(C, Args, Inputs, Action::OFK_HIP) { + DefaultCudaArch = CudaArch::GFX906; + + if (Args.hasArg(options::OPT_fhip_emit_relocatable, + options::OPT_fno_hip_emit_relocatable)) { + EmitReloc = Args.hasFlag(options::OPT_fhip_emit_relocatable, + options::OPT_fno_hip_emit_relocatable, false); + + if (*EmitReloc) { + if (Relocatable) { + C.getDriver().Diag(diag::err_opt_not_valid_with_opt) + << "-fhip-emit-relocatable" + << "-fgpu-rdc"; + } + + if (!CompileDeviceOnly) { + C.getDriver().Diag(diag::err_opt_not_valid_without_opt) + << "-fhip-emit-relocatable" + << "--cuda-device-only"; + } + } + } + if (Args.hasArg(options::OPT_gpu_bundle_output, options::OPT_no_gpu_bundle_output)) BundleOutput = Args.hasFlag(options::OPT_gpu_bundle_output, - options::OPT_no_gpu_bundle_output, true); + options::OPT_no_gpu_bundle_output, true) && + (!EmitReloc || !*EmitReloc); } bool canUseBundlerUnbundler() const override { return true; } @@ -3408,8 +3433,10 @@ class OffloadingActionBuilder final { assert(!CompileHostOnly && "Not expecting HIP actions in host-only compilation."); + bool ShouldLink = !EmitReloc || !*EmitReloc; + if (!Relocatable && CurPhase == phases::Backend && !EmitLLVM && - !EmitAsm) { + !EmitAsm && ShouldLink) { // If we are in backend phase, we attempt to generate the fat binary. // We compile each arch to IR and use a link action to generate code // object containing ISA. Then we use a special "link" action to create @@ -3485,6 +3512,8 @@ class OffloadingActionBuilder final { return CompileDeviceOnly ? ABRT_Ignore_Host : ABRT_Success; } else if (CurPhase == phases::Link) { + if (!ShouldLink) + return ABRT_Success; // Save CudaDeviceActions to DeviceLinkerInputs for each GPU subarch. // This happens to each device action originated from each input file. // Later on, device actions in DeviceLinkerInputs are used to create @@ -3522,8 +3551,11 @@ class OffloadingActionBuilder final { CudaDeviceActions.clear(); } - return (CompileDeviceOnly && CurPhase == FinalPhase) ? ABRT_Ignore_Host - : ABRT_Success; + return (CompileDeviceOnly && + (CurPhase == FinalPhase || + (!ShouldLink && CurPhase == phases::Assemble))) + ? ABRT_Ignore_Host + : ABRT_Success; } void appendLinkDeviceActions(ActionList &AL) override { @@ -3674,7 +3706,6 @@ public: ++InactiveBuilders; continue; } - auto RetCode = SB->getDeviceDependences(DDeps, CurPhase, FinalPhase, Phases); |