
Mostly mechanical changes in preparation of extracting the Flang-RT "subproject" in #110217. This PR intends to only move pre-existing files to the new folder structure, with no behavioral change. Common files (headers, testing, cmake) shared by Flang-RT and Flang remain in `flang/`. Some cosmetic changes and files paths were necessary: * Relative paths to the new path for the source files and `add_subdirectory`. * Add the new location's include directory to `include_directories` * The unittest/Evaluate directory has unitests for flang-rt and Flang. A new `CMakeLists.txt` was introduced for the flang-rt tests. * Change the `#include` paths relative to the include directive * clang-format on the `#include` directives * Since the paths are part if the copyright header and include guards, a script was used to canonicalize those * `test/Runtime` and runtime tests in `test/Driver` are moved, but the lit.cfg.py mechanism to execute the will only be added in #110217.
59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
//===-- include/flang-rt/runtime/allocator-registry.h -----------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef FLANG_RT_RUNTIME_ALLOCATOR_REGISTRY_H_
|
|
#define FLANG_RT_RUNTIME_ALLOCATOR_REGISTRY_H_
|
|
|
|
#include "flang/Common/api-attrs.h"
|
|
#include "flang/Runtime/allocator-registry-consts.h"
|
|
#include <cstdlib>
|
|
#include <vector>
|
|
|
|
#define MAX_ALLOCATOR 7 // 3 bits are reserved in the descriptor.
|
|
|
|
namespace Fortran::runtime {
|
|
|
|
using AllocFct = void *(*)(std::size_t);
|
|
using FreeFct = void (*)(void *);
|
|
|
|
typedef struct Allocator_t {
|
|
AllocFct alloc{nullptr};
|
|
FreeFct free{nullptr};
|
|
} Allocator_t;
|
|
|
|
#ifdef RT_DEVICE_COMPILATION
|
|
static RT_API_ATTRS void *MallocWrapper(std::size_t size) {
|
|
return std::malloc(size);
|
|
}
|
|
static RT_API_ATTRS void FreeWrapper(void *p) { return std::free(p); }
|
|
#endif
|
|
|
|
struct AllocatorRegistry {
|
|
#ifdef RT_DEVICE_COMPILATION
|
|
RT_API_ATTRS constexpr AllocatorRegistry()
|
|
: allocators{{&MallocWrapper, &FreeWrapper}} {}
|
|
#else
|
|
constexpr AllocatorRegistry() {
|
|
allocators[kDefaultAllocator] = {&std::malloc, &std::free};
|
|
};
|
|
#endif
|
|
RT_API_ATTRS void Register(int, Allocator_t);
|
|
RT_API_ATTRS AllocFct GetAllocator(int pos);
|
|
RT_API_ATTRS FreeFct GetDeallocator(int pos);
|
|
|
|
Allocator_t allocators[MAX_ALLOCATOR];
|
|
};
|
|
|
|
RT_OFFLOAD_VAR_GROUP_BEGIN
|
|
extern RT_VAR_ATTRS AllocatorRegistry allocatorRegistry;
|
|
RT_OFFLOAD_VAR_GROUP_END
|
|
|
|
} // namespace Fortran::runtime
|
|
|
|
#endif // FLANG_RT_RUNTIME_ALLOCATOR_REGISTRY_H_
|