Summary: This patch reorganizes a lot of the code used to check for compatibility with the current environment. The main bulk of this patch involves moving from using a separate `__tgt_image_info` struct (which just contains a string for the architecture) to instead simply checking this information from the ELF directly. Checking information in the ELF is very inexpensive as creating an ELF file is simply writing a base pointer. The main desire to do this was to reorganize everything into the ELF image. We can then do the majority of these checks without first initializing the plugin. A future patch will move the first ELF checks to happen without initializing the plugin so we no longer need to initialize and plugins that don't have needed images. This patch also adds a lot more sanity checks for whether or not the ELF is actually compatible. Such as if the images have a valid ABI, 64-bit width, executable, etc.
47 lines
1.7 KiB
C++
47 lines
1.7 KiB
C++
//===-- Utils/ELF.h - Common ELF functionality ------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Common ELF functionality for target plugins.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_OPENMP_LIBOMPTARGET_PLUGINS_ELF_UTILS_H
|
|
#define LLVM_OPENMP_LIBOMPTARGET_PLUGINS_ELF_UTILS_H
|
|
|
|
#include "Shared/PluginAPI.h"
|
|
|
|
#include "llvm/Object/ELF.h"
|
|
#include "llvm/Object/ELFObjectFile.h"
|
|
|
|
namespace utils {
|
|
namespace elf {
|
|
|
|
/// Returns true or false if the \p Buffer is an ELF file.
|
|
bool isELF(llvm::StringRef Buffer);
|
|
|
|
/// Checks if the given \p Object is a valid ELF matching the e_machine value.
|
|
llvm::Expected<bool> checkMachine(llvm::StringRef Object, uint16_t EMachine);
|
|
|
|
/// Returns a pointer to the given \p Symbol inside of an ELF object.
|
|
llvm::Expected<const void *> getSymbolAddress(
|
|
const llvm::object::ELFObjectFile<llvm::object::ELF64LE> &ELFObj,
|
|
const llvm::object::ELF64LE::Sym &Symbol);
|
|
|
|
/// Returns the symbol associated with the \p Name in the \p ELFObj. It will
|
|
/// first search for the hash sections to identify symbols from the hash table.
|
|
/// If that fails it will fall back to a linear search in the case of an
|
|
/// executable file without a hash table.
|
|
llvm::Expected<const typename llvm::object::ELF64LE::Sym *>
|
|
getSymbol(const llvm::object::ELFObjectFile<llvm::object::ELF64LE> &ELFObj,
|
|
llvm::StringRef Name);
|
|
|
|
} // namespace elf
|
|
} // namespace utils
|
|
|
|
#endif // LLVM_OPENMP_LIBOMPTARGET_PLUGINS_ELF_UTILS_H
|