diff --git a/clang/docs/ClangNvlinkWrapper.rst b/clang/docs/ClangNvlinkWrapper.rst new file mode 100644 --- /dev/null +++ b/clang/docs/ClangNvlinkWrapper.rst @@ -0,0 +1,57 @@ +==================== +Clang Nvlink Wrapper +==================== + +.. contents:: + :local: + +.. _clang-nvlink-wrapper: + +Introduction +============ + +This tool works as a wrapper over the ``nvlink`` program. It is required +because ``nvlink`` does not support linking of archive files implicitly. It +transparently passes every input option and object to ``nvlink`` except archive +files. It reads each input archive file to extract the archived cubin files as +temporary files. These temporary (*.cubin) files are passed to ``nvlink``. + +Use Case +======== + +During linking of heterogeneous device archive libraries with an OpenMP +program, the :doc:`ClangOffloadBundler` creates a device specific archive of +cubin files. Such an archive is then passed to this wrapper tool to extract +cubin files before passing to ``nvlink``. + +Working +======= + +**Inputs** + + A command line generated by the OpenMP-Clang driver targeting NVPTX, + containing a set of flags, cubin object files, and zero or more archive + files. + +Example:: + + clang-nvlink-wrapper main.cubin /tmp/libTest-nvptx-sm_50.a -o main-linked.out + +**Processing** + + 1. From each archive file extract all cubin files as temporary files and + store their names in a list, `CubinFiles`. + 2. Create a new command line, `NVLinkCommand`, such that + * Program is ``nvlink`` + * All input flags are transparently passed on as flags + * All input archive file are replaced with `CubinFiles` + 3. Execute NVLinkCommand + +:: + + 1. Extract (libTest-nvptx-sm_50.a) => /tmp/a.cubin /tmp/b.cubin + 2. nvlink -o a.out-openmp-nvptx64 main.cubin /tmp/a.cubin /tmp/b.cubin + +**Output** + + Output file generated by ``nvlink`` which links all cubin files. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -147,7 +147,8 @@ OpenMP Support in Clang ----------------------- -- ... +- ``clang-nvlink-wrapper`` tool introduced to support linking of cubin files archived in an archive. See :doc:`ClangNvlinkWrapper`. + CUDA Support in Clang --------------------- diff --git a/clang/docs/index.rst b/clang/docs/index.rst --- a/clang/docs/index.rst +++ b/clang/docs/index.rst @@ -80,6 +80,7 @@ ClangFormat ClangFormatStyleOptions ClangFormattedStatus + ClangNvlinkWrapper ClangOffloadBundler Design Documents diff --git a/clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp --- a/clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNvlinkWrapper.cpp @@ -13,7 +13,7 @@ /// These temp (*.cubin) files are passed to nvlink, because nvlink does not /// support linking of archive files implicitly. /// -/// During linking of heteregenous device archive libraries, the +/// During linking of heterogeneous device archive libraries, the /// clang-offload-bundler creates a device specific archive of cubin files. /// Such an archive is then passed to this tool to extract cubin files before /// passing to nvlink. @@ -60,7 +60,7 @@ std::vector> ArchiveBuffers; ErrorOr> BufOrErr = - MemoryBuffer::getFileOrSTDIN(Filename, -1, false); + MemoryBuffer::getFileOrSTDIN(Filename, false, false); if (std::error_code EC = BufOrErr.getError()) return createFileError(Filename, EC);