# Clang 14 documentation

## 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 Clang Offload Bundler 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.