Skip to content

Commit

Permalink
[libomptarget] Build plugins-nextgen for SystemZ
Browse files Browse the repository at this point in the history
The plugin was not getting built as the build_generic_elf64
macro assumes the LLVM triple processor name matches the
CMake processor name, which is unfortunately not the case
for SystemZ.

Fix this by providing two separate arguments instead.

Actually building the plugin exposed a number of other issues
causing various test failures.  Specifically, I've had to add
the SystemZ target to
- CompilerInvocation::ParseLangArgs
- linkDevice in ClangLinuxWrapper.cpp
- OMPContext::OMPContext (to set the device_kind_cpu trait)
- LIBOMPTARGET_ALL_TARGETS in libomptarget/CMakeLists.txt
- a check_plugin_target call in libomptarget/src/CMakeLists.txt

Finally, I've had to set a number of test cases to UNSUPPORTED
on s390x-ibm-linux-gnu; all these tests were already marked as
UNSUPPORTED for x86_64-pc-linux-gnu and aarch64-unknown-linux-gnu
and are failing on s390x for what seem to be the same reason.

In addition, this also requires support for BE ELF files in
plugins-nextgen: llvm#83976
  • Loading branch information
uweigand committed Mar 6, 2024
1 parent ff66e9b commit e0cca3d
Show file tree
Hide file tree
Showing 37 changed files with 71 additions and 9 deletions.
1 change: 1 addition & 0 deletions clang/lib/Frontend/CompilerInvocation.cpp
Expand Up @@ -4012,6 +4012,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,

if (TT.getArch() == llvm::Triple::UnknownArch ||
!(TT.getArch() == llvm::Triple::aarch64 || TT.isPPC() ||
TT.getArch() == llvm::Triple::systemz ||
TT.getArch() == llvm::Triple::nvptx ||
TT.getArch() == llvm::Triple::nvptx64 ||
TT.getArch() == llvm::Triple::amdgcn ||
Expand Down
1 change: 1 addition & 0 deletions clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
Expand Up @@ -552,6 +552,7 @@ Expected<StringRef> linkDevice(ArrayRef<StringRef> InputFiles,
case Triple::aarch64_be:
case Triple::ppc64:
case Triple::ppc64le:
case Triple::systemz:
return generic::clang(InputFiles, Args);
default:
return createStringError(inconvertibleErrorCode(),
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Frontend/OpenMP/OMPContext.cpp
Expand Up @@ -44,6 +44,7 @@ OMPContext::OMPContext(bool IsDeviceCompilation, Triple TargetTriple) {
case Triple::ppcle:
case Triple::ppc64:
case Triple::ppc64le:
case Triple::systemz:
case Triple::x86:
case Triple::x86_64:
ActiveTraits.set(unsigned(TraitProperty::device_kind_cpu));
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/CMakeLists.txt
Expand Up @@ -56,6 +56,8 @@ set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} x86_64-pc-linux-gnu-L
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda")
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda-LTO")
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda-JIT-LTO")
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} s390x-ibm-linux-gnu")
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} s390x-ibm-linux-gnu-LTO")

# Once the plugins for the different targets are validated, they will be added to
# the list of supported targets in the current system.
Expand Down
9 changes: 6 additions & 3 deletions openmp/libomptarget/plugins-nextgen/CMakeLists.txt
Expand Up @@ -12,12 +12,15 @@

add_subdirectory(common)

# void build_generic_elf64(string tmachine, string tmachine_name, string tmachine_libname, string elf_machine_id);
# void build_generic_elf64(string tmachine, string tmachine_name, string tmachine_libname,
# string tmachine_llvm, string tmachine_triple, string elf_machine_id);
# - build a plugin for an ELF based generic 64-bit target based on libffi.
# - tmachine: name of the machine processor as used in the cmake build system.
# - tmachine_name: name of the machine to be printed with the debug messages.
# - tmachine_libname: machine name to be appended to the plugin library name.
macro(build_generic_elf64 tmachine tmachine_name tmachine_libname tmachine_triple elf_machine_id)
# - tmachine_llvm: LLVM triple for the processor
# - tmachine_triple: GNU target triple
macro(build_generic_elf64 tmachine tmachine_name tmachine_libname tmachine_llvm tmachine_triple elf_machine_id)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "${tmachine}$")
# Define macro to be used as prefix of the runtime messages for this target.
add_definitions("-DTARGET_NAME=${tmachine_name}")
Expand All @@ -30,7 +33,7 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "${tmachine}$")
add_definitions("-DTARGET_ELF_ID=${elf_machine_id}")

# Define target triple
add_definitions("-DLIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE=${tmachine}")
add_definitions("-DLIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE=${tmachine_llvm}")

add_llvm_library("omptarget.rtl.${tmachine_libname}"
SHARED
Expand Down
2 changes: 1 addition & 1 deletion openmp/libomptarget/plugins-nextgen/aarch64/CMakeLists.txt
Expand Up @@ -11,7 +11,7 @@
##===----------------------------------------------------------------------===##

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
build_generic_elf64("aarch64" "aarch64" "aarch64" "aarch64-unknown-linux-gnu" "183")
build_generic_elf64("aarch64" "aarch64" "aarch64" "aarch64" "aarch64-unknown-linux-gnu" "183")
else()
libomptarget_say("Not building aarch64 NextGen offloading plugin: machine not found in the system.")
endif()
2 changes: 1 addition & 1 deletion openmp/libomptarget/plugins-nextgen/ppc64/CMakeLists.txt
Expand Up @@ -11,7 +11,7 @@
##===----------------------------------------------------------------------===##

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
build_generic_elf64("ppc64" "PPC64" "ppc64" "powerpc64-ibm-linux-gnu" "21")
build_generic_elf64("ppc64" "PPC64" "ppc64" "ppc64" "powerpc64-ibm-linux-gnu" "21")
else()
libomptarget_say("Not building ppc64 NextGen offloading plugin: machine not found in the system.")
endif()
2 changes: 1 addition & 1 deletion openmp/libomptarget/plugins-nextgen/ppc64le/CMakeLists.txt
Expand Up @@ -11,7 +11,7 @@
##===----------------------------------------------------------------------===##

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
build_generic_elf64("ppc64le" "PPC64le" "ppc64" "powerpc64le-ibm-linux-gnu" "21")
build_generic_elf64("ppc64le" "PPC64le" "ppc64" "ppc64le" "powerpc64le-ibm-linux-gnu" "21")
else()
libomptarget_say("Not building ppc64le NextGen offloading plugin: machine not found in the system.")
endif()
2 changes: 1 addition & 1 deletion openmp/libomptarget/plugins-nextgen/s390x/CMakeLists.txt
Expand Up @@ -11,7 +11,7 @@
##===----------------------------------------------------------------------===##

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
build_generic_elf64("SystemZ" "S390X" "s390x" "s390x-ibm-linux-gnu" "22")
build_generic_elf64("s390x" "S390X" "s390x" "systemz" "s390x-ibm-linux-gnu" "22")
else()
libomptarget_say("Not building s390x NextGen offloading plugin: machine not found in the system.")
endif()
2 changes: 1 addition & 1 deletion openmp/libomptarget/plugins-nextgen/x86_64/CMakeLists.txt
Expand Up @@ -11,7 +11,7 @@
##===----------------------------------------------------------------------===##

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
build_generic_elf64("x86_64" "x86_64" "x86_64" "x86_64-pc-linux-gnu" "62")
build_generic_elf64("x86_64" "x86_64" "x86_64" "x86_64" "x86_64-pc-linux-gnu" "62")
else()
libomptarget_say("Not building x86_64 NextGen offloading plugin: machine not found in the system.")
endif()
1 change: 1 addition & 0 deletions openmp/libomptarget/src/CMakeLists.txt
Expand Up @@ -73,6 +73,7 @@ if (NOT LIBOMPTARGET_PLUGINS_TO_LOAD)
check_plugin_target(cuda)
check_plugin_target(aarch64)
check_plugin_target(amdgpu)
check_plugin_target(s390x)
endif()

list(TRANSFORM LIBOMPTARGET_PLUGINS_TO_LOAD PREPEND "\"libomptarget.rtl.")
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/api/omp_dynamic_shared_memory.c
Expand Up @@ -10,6 +10,8 @@
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: aarch64-unknown-linux-gnu
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <omp.h>
#include <stdio.h>
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/jit/empty_kernel_lvl1.c
Expand Up @@ -32,5 +32,7 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include "empty_kernel.inc"
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/jit/empty_kernel_lvl2.c
Expand Up @@ -92,5 +92,7 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include "empty_kernel.inc"
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/jit/type_punning.c
Expand Up @@ -12,6 +12,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

// Ensure that there is only the kernel function left, not any outlined
// parallel regions.
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/mapping/auto_zero_copy.cpp
Expand Up @@ -13,6 +13,8 @@
// UNSUPPORTED: nvptx64-nvidia-cuda-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

// REQUIRES: unified_shared_memory

Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/mapping/auto_zero_copy_globals.cpp
Expand Up @@ -9,6 +9,8 @@
// UNSUPPORTED: nvptx64-nvidia-cuda-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

// REQUIRES: unified_shared_memory

Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/barrier_fence.c
Expand Up @@ -7,6 +7,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <omp.h>
#include <stdio.h>
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/bug49334.cpp
Expand Up @@ -9,6 +9,8 @@
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: aarch64-unknown-linux-gnu
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO
// UNSUPPORTED: amdgcn-amd-amdhsa
// UNSUPPORTED: nvptx64-nvidia-cuda
// UNSUPPORTED: nvptx64-nvidia-cuda-LTO
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/default_thread_limit.c
Expand Up @@ -9,6 +9,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

__attribute__((optnone)) int optnone() { return 1; }

Expand Down
5 changes: 4 additions & 1 deletion openmp/libomptarget/test/offloading/ompx_bare.c
@@ -1,10 +1,13 @@
// RUN: %libomptarget-compile-generic
// RUN: env LIBOMPTARGET_INFO=63 %libomptarget-run-generic 2>&1 | %fcheck-generic
// RUN: env LIBOMPTARGET_INFO=63 %libomptarget-run-generic 2>&1 | \
// RUN: %fcheck-generic
//
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: aarch64-unknown-linux-gnu
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <assert.h>
#include <ompx.h>
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/ompx_coords.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: aarch64-unknown-linux-gnu
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <omp.h>
#include <ompx.h>
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/ompx_saxpy_mixed.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: aarch64-unknown-linux-gnu
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <math.h>
#include <omp.h>
Expand Down
Expand Up @@ -6,6 +6,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <iostream>
#include <vector>
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/small_trip_count.c
Expand Up @@ -9,6 +9,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#define N 128

Expand Down
Expand Up @@ -7,6 +7,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

int main(int argc, char *argv[]) {
constexpr const int block_size = 256;
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/spmdization.c
Expand Up @@ -11,6 +11,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

#include <omp.h>
#include <stdio.h>
Expand Down
Expand Up @@ -6,6 +6,8 @@
// UNSUPPORTED: nvptx64-nvidia-cuda-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO
// UNSUPPORTED: amdgcn-amd-amdhsa

#include <omp.h>
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/offloading/thread_limit.c
Expand Up @@ -9,6 +9,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

int main() {
int n = 1 << 20;
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/target_memcpy.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Verify that for the target OpenMP APIs, the return address is non-null and
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/target_memcpy_emi.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Verify all three data transfer directions: H2D, D2D and D2H
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/veccopy.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Example OpenMP program that registers non-EMI callbacks
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/veccopy_data.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Example OpenMP program that registers EMI callbacks.
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/veccopy_disallow_both.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Example OpenMP program that shows that both EMI and non-EMI
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/veccopy_emi.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Example OpenMP program that registers EMI callbacks
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/veccopy_emi_map.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Example OpenMP program that shows that map-EMI callbacks are not supported.
Expand Down
2 changes: 2 additions & 0 deletions openmp/libomptarget/test/ompt/veccopy_map.c
Expand Up @@ -4,6 +4,8 @@
// UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
// UNSUPPORTED: s390x-ibm-linux-gnu
// UNSUPPORTED: s390x-ibm-linux-gnu-LTO

/*
* Example OpenMP program that shows that map callbacks are not supported.
Expand Down

0 comments on commit e0cca3d

Please sign in to comment.