135ebe4ccSSaiyedul Islam // REQUIRES: x86-registered-target
235ebe4ccSSaiyedul Islam // REQUIRES: amdgpu-registered-target
364d1d5f3SJinsong Ji // UNSUPPORTED: -aix
435ebe4ccSSaiyedul Islam
535ebe4ccSSaiyedul Islam // See the steps to create a fat archive are given at the end of the file.
635ebe4ccSSaiyedul Islam
735ebe4ccSSaiyedul Islam // Given a FatArchive, clang-offload-bundler should be called to create a
835ebe4ccSSaiyedul Islam // device specific archive, which should be passed to llvm-link.
9ae23be84SJoseph Huber // RUN: %clang -O2 -### -fopenmp -fno-openmp-new-driver -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx906 %s -L%S/Inputs/openmp_static_device_link -lFatArchive 2>&1 | FileCheck %s
10*98067998SFangrui Song // CHECK: "-cc1"{{.*}}"-triple" "amdgcn-amd-amdhsa"{{.*}}"-emit-llvm-bc"{{.*}}"-target-cpu" "[[GPU:gfx[0-9]+]]"{{.*}}"-o" "[[HOSTBC:.*.bc]]" "-x" "c++"{{.*}}.cpp
1109a5eae0SYaxun (Sam) Liu // CHECK: clang-offload-bundler" "-unbundle" "-type=a" "-input={{.*}}/Inputs/openmp_static_device_link/libFatArchive.a" "-targets=openmp-amdgcn-amd-amdhsa-[[GPU]]" "-output=[[DEVICESPECIFICARCHIVE:.*.a]]" "-allow-missing-bundles"
1235ebe4ccSSaiyedul Islam // CHECK: llvm-link{{.*}}"[[HOSTBC]]" "[[DEVICESPECIFICARCHIVE]]" "-o" "{{.*}}-[[GPU]]-linked-{{.*}}.bc"
1335ebe4ccSSaiyedul Islam // expected-no-diagnostics
1435ebe4ccSSaiyedul Islam
1535ebe4ccSSaiyedul Islam #ifndef HEADER
1635ebe4ccSSaiyedul Islam #define HEADER
1735ebe4ccSSaiyedul Islam
1835ebe4ccSSaiyedul Islam #define N 10
1935ebe4ccSSaiyedul Islam
2035ebe4ccSSaiyedul Islam #pragma omp declare target
2135ebe4ccSSaiyedul Islam // Functions defined in Fat Archive.
2235ebe4ccSSaiyedul Islam extern "C" void func_present(float *, float *, unsigned);
2335ebe4ccSSaiyedul Islam
2435ebe4ccSSaiyedul Islam #ifdef MISSING
2535ebe4ccSSaiyedul Islam // Function not defined in the fat archive.
2635ebe4ccSSaiyedul Islam extern "C" void func_missing(float *, float *, unsigned);
2735ebe4ccSSaiyedul Islam #endif
2835ebe4ccSSaiyedul Islam
2935ebe4ccSSaiyedul Islam #pragma omp end declare target
3035ebe4ccSSaiyedul Islam
main()3135ebe4ccSSaiyedul Islam int main() {
3235ebe4ccSSaiyedul Islam float in[N], out[N], sum = 0;
3335ebe4ccSSaiyedul Islam unsigned i;
3435ebe4ccSSaiyedul Islam
3535ebe4ccSSaiyedul Islam #pragma omp parallel for
3635ebe4ccSSaiyedul Islam for (i = 0; i < N; ++i) {
3735ebe4ccSSaiyedul Islam in[i] = i;
3835ebe4ccSSaiyedul Islam }
3935ebe4ccSSaiyedul Islam
4035ebe4ccSSaiyedul Islam func_present(in, out, N); // Returns out[i] = a[i] * 0
4135ebe4ccSSaiyedul Islam
4235ebe4ccSSaiyedul Islam #ifdef MISSING
4335ebe4ccSSaiyedul Islam func_missing(in, out, N); // Should throw an error here
4435ebe4ccSSaiyedul Islam #endif
4535ebe4ccSSaiyedul Islam
4635ebe4ccSSaiyedul Islam #pragma omp parallel for reduction(+ \
4735ebe4ccSSaiyedul Islam : sum)
4835ebe4ccSSaiyedul Islam for (i = 0; i < N; ++i)
4935ebe4ccSSaiyedul Islam sum += out[i];
5035ebe4ccSSaiyedul Islam
5135ebe4ccSSaiyedul Islam if (!sum)
5235ebe4ccSSaiyedul Islam return 0;
5335ebe4ccSSaiyedul Islam return sum;
5435ebe4ccSSaiyedul Islam }
5535ebe4ccSSaiyedul Islam
5635ebe4ccSSaiyedul Islam #endif
5735ebe4ccSSaiyedul Islam
5835ebe4ccSSaiyedul Islam /***********************************************
5935ebe4ccSSaiyedul Islam Steps to create Fat Archive (libFatArchive.a)
6035ebe4ccSSaiyedul Islam ************************************************
6135ebe4ccSSaiyedul Islam ***************** File: func_1.c ***************
6235ebe4ccSSaiyedul Islam void func_present(float* in, float* out, unsigned n){
6335ebe4ccSSaiyedul Islam unsigned i;
6435ebe4ccSSaiyedul Islam #pragma omp target teams distribute parallel for map(to: in[0:n]) map(from: out[0:n])
6535ebe4ccSSaiyedul Islam for(i=0; i<n; ++i){
6635ebe4ccSSaiyedul Islam out[i] = in[i] * 0;
6735ebe4ccSSaiyedul Islam }
6835ebe4ccSSaiyedul Islam }
6935ebe4ccSSaiyedul Islam *************************************************
7035ebe4ccSSaiyedul Islam 1. Compile source file(s) to generate object file(s)
7135ebe4ccSSaiyedul Islam clang -O2 -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx906 -c func_1.c -o func_1_gfx906.o
7235ebe4ccSSaiyedul Islam clang -O2 -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908 -c func_1.c -o func_1_gfx908.o
7335ebe4ccSSaiyedul Islam clang -O2 -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx906 -c func_2.c -o func_2_gfx906.o
7435ebe4ccSSaiyedul Islam clang -O2 -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908 -c func_2.c -o func_2_gfx908.o
7535ebe4ccSSaiyedul Islam clang -O2 -fopenmp -fopenmp-targets=nvptx64 -c func_1.c -o func_1_nvptx.o
7635ebe4ccSSaiyedul Islam clang -O2 -fopenmp -fopenmp-targets=nvptx64 -c func_2.c -o func_2_nvptx.o
7735ebe4ccSSaiyedul Islam
7835ebe4ccSSaiyedul Islam 2. Create a fat archive by combining all the object file(s)
7935ebe4ccSSaiyedul Islam llvm-ar cr libFatArchive.a func_1_gfx906.o func_1_gfx908.o func_2_gfx906.o func_2_gfx908.o func_1_nvptx.o func_2_nvptx.o
8035ebe4ccSSaiyedul Islam ************************************************/
81