//===-- RTDyldMemoryManager.cpp - Memory manager for MC-JIT -----*- 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
//
//===----------------------------------------------------------------------===//
//
// Implementation of the runtime dynamic memory manager base class.
//
//===----------------------------------------------------------------------===//

#include "llvm/Config/config.h"
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/DynamicLibrary.h"
#include "llvm/Support/ErrorHandling.h"
#include <cstdlib>

#ifdef __linux__
  // These includes used by RTDyldMemoryManager::getPointerToNamedFunction()
  // for Glibc trickery. See comments in this function for more information.
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#endif

namespace llvm {

RTDyldMemoryManager::~RTDyldMemoryManager() = default;

#if defined(HAVE_REGISTER_FRAME) && defined(HAVE_DEREGISTER_FRAME) &&          \
    !defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__)
extern "C" void __register_frame(void *);
extern "C" void __deregister_frame(void *);
#else
// The building compiler does not have __(de)register_frame but
// it may be found at runtime in a dynamically-loaded library.
// For example, this happens when building LLVM with Visual C++
// but using the MingW runtime.
static void __register_frame(void *p) {
  static bool Searched = false;
  static void (*rf)(void *) = 0;

  if (!Searched) {
    Searched = true;
    *(void **)&rf =
        llvm::sys::DynamicLibrary::SearchForAddressOfSymbol("__register_frame");
  }
  if (rf)
    rf(p);
}

static void __deregister_frame(void *p) {
  static bool Searched = false;
  static void (*df)(void *) = 0;

  if (!Searched) {
    Searched = true;
    *(void **)&df = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(
        "__deregister_frame");
  }
  if (df)
    df(p);
}
#endif

/* libgcc and libunwind __register_frame behave differently. We use the presence
 * of __unw_add_dynamic_fde to detect libunwind. */
#if defined(HAVE_UNW_ADD_DYNAMIC_FDE) || defined(__APPLE__)

static const char *processFDE(const char *Entry, bool isDeregister) {
  const char *P = Entry;
  uint32_t Length = *((const uint32_t *)P);
  P += 4;
  uint32_t Offset = *((const uint32_t *)P);
  if (Offset != 0) {
    if (isDeregister)
      __deregister_frame(const_cast<char *>(Entry));
    else
      __register_frame(const_cast<char *>(Entry));
  }
  return P + Length;
}

// This implementation handles frame registration for local targets.
// Memory managers for remote targets should re-implement this function
// and use the LoadAddr parameter.
void RTDyldMemoryManager::registerEHFramesInProcess(uint8_t *Addr,
                                                    size_t Size) {
  // On OS X OS X __register_frame takes a single FDE as an argument.
  // See http://lists.llvm.org/pipermail/llvm-dev/2013-April/061737.html
  // and projects/libunwind/src/UnwindLevel1-gcc-ext.c.
  const char *P = (const char *)Addr;
  const char *End = P + Size;
  while (P != End)
    P = processFDE(P, false);
}

void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr,
                                                      size_t Size) {
  const char *P = (const char *)Addr;
  const char *End = P + Size;
  while (P != End)
    P = processFDE(P, true);
}

#else

void RTDyldMemoryManager::registerEHFramesInProcess(uint8_t *Addr,
                                                    size_t Size) {
  // On Linux __register_frame takes a single argument:
  // a pointer to the start of the .eh_frame section.

  // How can it find the end? Because crtendS.o is linked
  // in and it has an .eh_frame section with four zero chars.
  __register_frame(Addr);
}

void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr,
                                                      size_t Size) {
  __deregister_frame(Addr);
}

#endif

void RTDyldMemoryManager::registerEHFrames(uint8_t *Addr, uint64_t LoadAddr,
                                          size_t Size) {
  registerEHFramesInProcess(Addr, Size);
  EHFrames.push_back({Addr, Size});
}

void RTDyldMemoryManager::deregisterEHFrames() {
  for (auto &Frame : EHFrames)
    deregisterEHFramesInProcess(Frame.Addr, Frame.Size);
  EHFrames.clear();
}

static int jit_noop() {
  return 0;
}

// ARM math functions are statically linked on Android from libgcc.a, but not
// available at runtime for dynamic linking. On Linux these are usually placed
// in libgcc_s.so so can be found by normal dynamic lookup.
#if defined(__BIONIC__) && defined(__arm__)
// List of functions which are statically linked on Android and can be generated
// by LLVM. This is done as a nested macro which is used once to declare the
// imported functions with ARM_MATH_DECL and once to compare them to the
// user-requested symbol in getSymbolAddress with ARM_MATH_CHECK. The test
// assumes that all functions start with __aeabi_ and getSymbolAddress must be
// modified if that changes.
#define ARM_MATH_IMPORTS(PP) \
  PP(__aeabi_d2f) \
  PP(__aeabi_d2iz) \
  PP(__aeabi_d2lz) \
  PP(__aeabi_d2uiz) \
  PP(__aeabi_d2ulz) \
  PP(__aeabi_dadd) \
  PP(__aeabi_dcmpeq) \
  PP(__aeabi_dcmpge) \
  PP(__aeabi_dcmpgt) \
  PP(__aeabi_dcmple) \
  PP(__aeabi_dcmplt) \
  PP(__aeabi_dcmpun) \
  PP(__aeabi_ddiv) \
  PP(__aeabi_dmul) \
  PP(__aeabi_dsub) \
  PP(__aeabi_f2d) \
  PP(__aeabi_f2iz) \
  PP(__aeabi_f2lz) \
  PP(__aeabi_f2uiz) \
  PP(__aeabi_f2ulz) \
  PP(__aeabi_fadd) \
  PP(__aeabi_fcmpeq) \
  PP(__aeabi_fcmpge) \
  PP(__aeabi_fcmpgt) \
  PP(__aeabi_fcmple) \
  PP(__aeabi_fcmplt) \
  PP(__aeabi_fcmpun) \
  PP(__aeabi_fdiv) \
  PP(__aeabi_fmul) \
  PP(__aeabi_fsub) \
  PP(__aeabi_i2d) \
  PP(__aeabi_i2f) \
  PP(__aeabi_idiv) \
  PP(__aeabi_idivmod) \
  PP(__aeabi_l2d) \
  PP(__aeabi_l2f) \
  PP(__aeabi_lasr) \
  PP(__aeabi_ldivmod) \
  PP(__aeabi_llsl) \
  PP(__aeabi_llsr) \
  PP(__aeabi_lmul) \
  PP(__aeabi_ui2d) \
  PP(__aeabi_ui2f) \
  PP(__aeabi_uidiv) \
  PP(__aeabi_uidivmod) \
  PP(__aeabi_ul2d) \
  PP(__aeabi_ul2f) \
  PP(__aeabi_uldivmod)

// Declare statically linked math functions on ARM. The function declarations
// here do not have the correct prototypes for each function in
// ARM_MATH_IMPORTS, but it doesn't matter because only the symbol addresses are
// needed. In particular the __aeabi_*divmod functions do not have calling
// conventions which match any C prototype.
#define ARM_MATH_DECL(name) extern "C" void name();
ARM_MATH_IMPORTS(ARM_MATH_DECL)
#undef ARM_MATH_DECL
#endif

#if defined(__linux__) && defined(__GLIBC__) && \
      (defined(__i386__) || defined(__x86_64__))
extern "C" LLVM_ATTRIBUTE_WEAK void __morestack();
#endif

uint64_t
RTDyldMemoryManager::getSymbolAddressInProcess(const std::string &Name) {
  // This implementation assumes that the host program is the target.
  // Clients generating code for a remote target should implement their own
  // memory manager.
#if defined(__linux__) && defined(__GLIBC__)
  //===--------------------------------------------------------------------===//
  // Function stubs that are invoked instead of certain library calls
  //
  // Force the following functions to be linked in to anything that uses the
  // JIT. This is a hack designed to work around the all-too-clever Glibc
  // strategy of making these functions work differently when inlined vs. when
  // not inlined, and hiding their real definitions in a separate archive file
  // that the dynamic linker can't see. For more info, search for
  // 'libc_nonshared.a' on Google, or read http://llvm.org/PR274.
  if (Name == "stat") return (uint64_t)&stat;
  if (Name == "fstat") return (uint64_t)&fstat;
  if (Name == "lstat") return (uint64_t)&lstat;
  if (Name == "stat64") return (uint64_t)&stat64;
  if (Name == "fstat64") return (uint64_t)&fstat64;
  if (Name == "lstat64") return (uint64_t)&lstat64;
  if (Name == "atexit") return (uint64_t)&atexit;
  if (Name == "mknod") return (uint64_t)&mknod;

#if defined(__i386__) || defined(__x86_64__)
  // __morestack lives in libgcc, a static library.
  if (&__morestack && Name == "__morestack")
    return (uint64_t)&__morestack;
#endif
#endif // __linux__ && __GLIBC__

  // See ARM_MATH_IMPORTS definition for explanation
#if defined(__BIONIC__) && defined(__arm__)
  if (Name.compare(0, 8, "__aeabi_") == 0) {
    // Check if the user has requested any of the functions listed in
    // ARM_MATH_IMPORTS, and if so redirect to the statically linked symbol.
#define ARM_MATH_CHECK(fn) if (Name == #fn) return (uint64_t)&fn;
    ARM_MATH_IMPORTS(ARM_MATH_CHECK)
#undef ARM_MATH_CHECK
  }
#endif

  // We should not invoke parent's ctors/dtors from generated main()!
  // On Mingw and Cygwin, the symbol __main is resolved to
  // callee's(eg. tools/lli) one, to invoke wrong duplicated ctors
  // (and register wrong callee's dtors with atexit(3)).
  // We expect ExecutionEngine::runStaticConstructorsDestructors()
  // is called before ExecutionEngine::runFunctionAsMain() is called.
  if (Name == "__main") return (uint64_t)&jit_noop;

  const char *NameStr = Name.c_str();

  // DynamicLibrary::SearchForAddressOfSymbol expects an unmangled 'C' symbol
  // name so ff we're on Darwin, strip the leading '_' off.
#ifdef __APPLE__
  if (NameStr[0] == '_')
    ++NameStr;
#endif

  return (uint64_t)sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);
}

void *RTDyldMemoryManager::getPointerToNamedFunction(const std::string &Name,
                                                     bool AbortOnFailure) {
  uint64_t Addr = getSymbolAddress(Name);

  if (!Addr && AbortOnFailure)
    report_fatal_error(Twine("Program used external function '") + Name +
                       "' which could not be resolved!");

  return (void*)Addr;
}

void RTDyldMemoryManager::anchor() {}
void MCJITMemoryManager::anchor() {}
} // namespace llvm
