# Clang nvlink Wrapper

```{contents}
:local:
```

## Introduction

This tool works as a wrapper around the NVIDIA `nvlink` linker. The purpose
of this wrapper is to provide an interface similar to the `ld.lld` linker
while still relying on NVIDIA's proprietary linker to produce the final output.

`nvlink` has a number of known quirks that make it difficult to use in a
unified offloading setting. For example, it does not accept `.o` files as they
must be named `.cubin`. Static archives do not work, so passing a `.a` will
provide a linker error. `nvlink` also does not support link time optimization
and ignores many standard linker arguments. This tool works around these issues.

## Usage

This tool can be used with the following options. Any arguments not intended
only for the linker wrapper will be forwarded to `nvlink`.

```console
OVERVIEW: A utility that wraps around the NVIDIA 'nvlink' linker.
This enables static linking and LTO handling for NVPTX targets.

USAGE: clang-nvlink-wrapper [options] <options to passed to nvlink>

OPTIONS:
  --arch <value>       Specify the 'sm_' name of the target architecture.
  --cuda-path=<dir>    Set the system CUDA path
  --dry-run            Print generated commands without running.
  --feature <value>    Specify the '+ptx' feature to use for LTO.
  -g                   Specify that this was a debug compile.
  -help-hidden         Display all available options
  -help                Display available options (--help-hidden for more)
  -L <dir>             Add <dir> to the library search path
  -l <libname>         Search for library <libname>
  -mllvm <arg>         Arguments passed to LLVM, including Clang invocations,
                       for which the '-mllvm' prefix is preserved. Use '-mllvm
                       --help' for a list of options.
  -o <path>            Path to file to write output
  --plugin-opt=jobs=<value>
                       Number of LTO codegen partitions
  --plugin-opt=lto-partitions=<value>
                       Number of LTO codegen partitions
  --plugin-opt=O<O0, O1, O2, or O3>
                       Optimization level for LTO
  --plugin-opt=thinlto<value>
                       Enable the thin-lto backend
  --plugin-opt=<value> Arguments passed to LLVM, including Clang invocations,
                       for which the '-mllvm' prefix is preserved. Use '-mllvm
                       --help' for a list of options.
  --save-temps         Save intermediate results
  --version            Display the version number and exit
  -v                   Print verbose information
```

## Example

This tool is intended to be invoked when targeting the NVPTX toolchain directly
as a cross-compiling target. This can be used to create standalone GPU
executables with normal linking semantics similar to standard compilation.

```console
clang --target=nvptx64-nvidia-cuda -march=native -flto=full input.c
```
