[PATCH] D45212: [HIP] Let CUDA toolchain support HIP language mode and amdgpu
Yaxun Liu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 23 07:59:58 PDT 2018
yaxunl marked 19 inline comments as done.
yaxunl added a comment.
In https://reviews.llvm.org/D45212#1105177, @tra wrote:
> Hi,
>
> Sorry about the long silence. I'm back to continue the reviews. I'll handle what I can today and will continue with the rest on Tuesday.
>
> It looks like patch description needs to be updated:
>
> > Use clang-offload-bindler to create binary for device ISA.
>
> I don't see anything related to offload-bundler in this patch any more.
You are right. Using clang-offload-bundler to create binary for device ISA has been moved to another patch. Will update the description of this patch.
In https://reviews.llvm.org/D45212#1105282, @tra wrote:
> One more thing -- it would be really good to add some tests to make sure your commands are constructed the way you want.
will do
================
Comment at: include/clang/Driver/Options.td:582
def fno_cuda_rdc : Flag<["-"], "fno-cuda-rdc">;
+def hip_device_lib_path_EQ : Joined<["--"], "hip-device-lib-path=">, Group<i_Group>,
+ HelpText<"HIP device library path">;
----------------
tra wrote:
> I'm not sure about `i_Group`? This will cause this option to be passed to all preprocessor jobs. It will also be passed to host and device side compilations, while you probably only want/need it on device side only.
will change to Link_Group
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:323
+ C.getDriver().Diag(diag::err_drv_no_such_file) << BCName;
+ CmdArgs.push_back(Args.MakeArgString(FullName));
+ return FoundLibDevice;
----------------
tra wrote:
> FullName is already result of Args.MakeArgString. You only need to do it once.
will fix
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:329
+// object file. It calls llvm-link, opt, llc, then lld steps.
+void AMDGCN::Linker::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
----------------
tra wrote:
> This function is too large to easily see that we're actually constructing sequence of commands.
> I'd probably split construction of individual tool's command line into its own function.
will do
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:336
+ assert(StringRef(JA.getOffloadingArch()).startswith("gfx") &&
+ " unless gfx processor, backend should be clang");
+ const auto &TC =
----------------
tra wrote:
> No need for the leading space in the message.
will fix.
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:344-345
+ // Add the input bc's created by compile step.
+ for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end();
+ it != ie; ++it) {
+ const InputInfo &II = *it;
----------------
tra wrote:
> `for (const InputInfo &it : Inputs)` ?
will fix
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:350
+
+ std::string GFXNAME = JA.getOffloadingArch();
+
----------------
tra wrote:
> All-caps name looks like a macro. Rename to `GfxName` ?
will fix
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:354-359
+ // Find in --hip-device-lib-path and HIP_LIBRARY_PATH.
+ for (auto Arg : Args) {
+ if (Arg->getSpelling() == "--hip-device-lib-path=") {
+ LibraryPaths.push_back(Args.MakeArgString(Arg->getValue()));
+ }
+ }
----------------
tra wrote:
> ```
> for (path : Args.getAllArgValues(...)) {
> LibraryPaths.push_back(Args.MakeArgString(path));
> }
>
> ```
will fix
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:375-378
+ addBCLib(C, Args, CmdArgs, LibraryPaths,
+ (Twine("oclc_isa_version_") + StringRef(GFXNAME).drop_front(3) +
+ ".amdgcn.bc")
+ .str());
----------------
tra wrote:
> This is somewhat unreadable. Perhaps you could construct the name in a temp variable.
will do
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:384
+ const char *ResultingBitcodeF =
+ C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
+ CmdArgs.push_back(ResultingBitcodeF);
----------------
tra wrote:
> You don't need to use c_str() for MakeArgString. It will happily accept std::string.
will fix
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:394
+ // The input to opt is the output from llvm-link.
+ OptArgs.push_back(ResultingBitcodeF);
+ // Pass optimization arg to opt.
----------------
tra wrote:
> `BitcodeOutputFile`?
will change
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:417
+ const char *mcpustr = Args.MakeArgString("-mcpu=" + GFXNAME);
+ OptArgs.push_back(mcpustr);
+ OptArgs.push_back("-o");
----------------
tra wrote:
> I think you can get rid of the temp var here without hurting readability.
will do
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:420
+ std::string OptOutputFileName =
+ C.getDriver().GetTemporaryPath("OPT_OUTPUT", "bc");
+ const char *OptOutputFile =
----------------
tra wrote:
> I wonder if we could derive temp file name from the input's name. This may make it easier to find relevant temp files if/when we need to debug the compilation process.
will do
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:422
+ const char *OptOutputFile =
+ C.addTempFile(C.getArgs().MakeArgString(OptOutputFileName.c_str()));
+ OptArgs.push_back(OptOutputFile);
----------------
tra wrote:
> No need for c_str() here.
will do
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:439
+ const char *LlcOutputFile =
+ C.addTempFile(C.getArgs().MakeArgString(LlcOutputFileName.c_str()));
+ LlcArgs.push_back(LlcOutputFile);
----------------
tra wrote:
> c_str(), again.
will fix
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:764
+ if (DriverArgs.hasArg(options::OPT_nocudalib) ||
+ DeviceOffloadingKind == Action::OFK_HIP)
return;
----------------
tra wrote:
> I'd just add something like this and leave existing if unchanged:
> ```
> // There's no need for CUDA-specific bitcode linking with HIP.
> if( DeviceOffloadingKind == Action::OFK_HIP)
> return;
> ```
>
>
will change
================
Comment at: lib/Driver/ToolChains/Cuda.cpp:926-938
Tool *CudaToolChain::buildAssembler() const {
- return new tools::NVPTX::Assembler(*this);
+ if (getTriple().isNVPTX())
+ return new tools::NVPTX::Assembler(*this);
+ return ToolChain::buildAssembler();
}
Tool *CudaToolChain::buildLinker() const {
----------------
tra wrote:
> All these should be in the derived toolchain.
will do
================
Comment at: lib/Driver/ToolChains/Cuda.h:137-138
+ Linker(const ToolChain &TC)
+ : Tool("AMDGCN::Linker", "amdgcn-link", TC, RF_Full,
+ llvm::sys::WEM_UTF8, "--options-file") {}
+
----------------
tra wrote:
> Where does amdgcn-link come from? Does it accept --options-file ?
amdgcn-link is the short name of the amdgcn bitcode linker. It is not a real program and does not support response file. Will remove the arguments about response file.
================
Comment at: lib/Driver/ToolChains/Cuda.h:153-154
class LLVM_LIBRARY_VISIBILITY CudaToolChain : public ToolChain {
public:
CudaToolChain(const Driver &D, const llvm::Triple &Triple,
----------------
tra wrote:
> You may want to derive your own HIPToolChain as you're unlikely to reuse NVPTX-specific tools.
Will do
================
Comment at: lib/Driver/ToolChains/Cuda.h:172
- // Never try to use the integrated assembler with CUDA; always fork out to
- // ptxas.
- bool useIntegratedAs() const override { return false; }
+ bool useIntegratedAs() const override;
bool isCrossCompiling() const override { return true; }
----------------
tra wrote:
> In HIPToolchain this one would become an inline function returning true.
will do
https://reviews.llvm.org/D45212
More information about the cfe-commits
mailing list