diff --git a/offload/plugins-nextgen/common/include/Utils/ELF.h b/offload/plugins-nextgen/common/include/Utils/ELF.h index 88c83d39b68ce..f87e0a5ed02b4 100644 --- a/offload/plugins-nextgen/common/include/Utils/ELF.h +++ b/offload/plugins-nextgen/common/include/Utils/ELF.h @@ -24,6 +24,9 @@ namespace elf { /// Returns true or false if the \p Buffer is an ELF file. bool isELF(llvm::StringRef Buffer); +/// Returns the ELF e_machine value of the current compilation target. +uint16_t getTargetMachine(); + /// Checks if the given \p Object is a valid ELF matching the e_machine value. llvm::Expected checkMachine(llvm::StringRef Object, uint16_t EMachine); diff --git a/offload/plugins-nextgen/common/src/Utils/ELF.cpp b/offload/plugins-nextgen/common/src/Utils/ELF.cpp index 2ae97f0f25892..90d6950b83e5a 100644 --- a/offload/plugins-nextgen/common/src/Utils/ELF.cpp +++ b/offload/plugins-nextgen/common/src/Utils/ELF.cpp @@ -36,6 +36,21 @@ bool utils::elf::isELF(StringRef Buffer) { } } +uint16_t utils::elf::getTargetMachine() { +#if defined(__x86_64__) + return EM_X86_64; +#elif defined(__s390x__) + return EM_S390; +#elif defined(__aarch64__) + return EM_AARCH64; +#elif defined(__powerpc64__) + return EM_PPC64; +#else +#warning "Unknown ELF compilation target architecture" + return EM_NONE; +#endif +} + template static Expected checkMachineImpl(const object::ELFObjectFile &ELFObj, uint16_t EMachine) { diff --git a/offload/plugins-nextgen/host/CMakeLists.txt b/offload/plugins-nextgen/host/CMakeLists.txt index 48e591bc894e6..1d000442c84d4 100644 --- a/offload/plugins-nextgen/host/CMakeLists.txt +++ b/offload/plugins-nextgen/host/CMakeLists.txt @@ -52,27 +52,22 @@ endif() # Define the target specific triples and ELF machine values. if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le$") - target_compile_definitions(omptarget.rtl.host PRIVATE TARGET_ELF_ID=EM_PPC64) list(APPEND LIBOMPTARGET_SYSTEM_TARGETS "powerpc64le-ibm-linux-gnu" "powerpc64le-ibm-linux-gnu-LTO") set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64$") - target_compile_definitions(omptarget.rtl.host PRIVATE TARGET_ELF_ID=EM_PPC64) list(APPEND LIBOMPTARGET_SYSTEM_TARGETS "powerpc64-ibm-linux-gnu" "powerpc64-ibm-linux-gnu-LTO") set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64$") - target_compile_definitions(omptarget.rtl.host PRIVATE TARGET_ELF_ID=EM_X86_64) list(APPEND LIBOMPTARGET_SYSTEM_TARGETS "x86_64-pc-linux-gnu" "x86_64-pc-linux-gnu-LTO") set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64$") - target_compile_definitions(omptarget.rtl.host PRIVATE TARGET_ELF_ID=EM_AARCH64) list(APPEND LIBOMPTARGET_SYSTEM_TARGETS "aarch64-unknown-linux-gnu" "aarch64-unknown-linux-gnu-LTO") set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x$") - target_compile_definitions(omptarget.rtl.host PRIVATE TARGET_ELF_ID=EM_S390) list(APPEND LIBOMPTARGET_SYSTEM_TARGETS "s390x-ibm-linux-gnu" "s390x-ibm-linux-gnu-LTO") set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE) diff --git a/offload/plugins-nextgen/host/src/rtl.cpp b/offload/plugins-nextgen/host/src/rtl.cpp index c929db6c22d83..4bdcae3dd6a1b 100644 --- a/offload/plugins-nextgen/host/src/rtl.cpp +++ b/offload/plugins-nextgen/host/src/rtl.cpp @@ -18,6 +18,7 @@ #include "Shared/Debug.h" #include "Shared/Environment.h" +#include "Utils/ELF.h" #include "GlobalHandler.h" #include "OpenMP/OMPT/Callback.h" @@ -44,11 +45,6 @@ // The number of devices in this plugin. #define NUM_DEVICES 4 -// The ELF ID should be defined at compile-time by the build system. -#ifndef TARGET_ELF_ID -#define TARGET_ELF_ID EM_NONE -#endif - namespace llvm { namespace omp { namespace target { @@ -416,7 +412,9 @@ struct GenELF64PluginTy final : public GenericPluginTy { } /// Get the ELF code to recognize the compatible binary images. - uint16_t getMagicElfBits() const override { return ELF::TARGET_ELF_ID; } + uint16_t getMagicElfBits() const override { + return utils::elf::getTargetMachine(); + } /// This plugin does not support exchanging data between two devices. bool isDataExchangable(int32_t SrcDeviceId, int32_t DstDeviceId) override {