diff options
Diffstat (limited to 'openmp/offload/src/ofldbegin.cpp')
-rw-r--r-- | openmp/offload/src/ofldbegin.cpp | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/openmp/offload/src/ofldbegin.cpp b/openmp/offload/src/ofldbegin.cpp new file mode 100644 index 00000000000..945f982a4ac --- /dev/null +++ b/openmp/offload/src/ofldbegin.cpp @@ -0,0 +1,164 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.txt for details. +// +//===----------------------------------------------------------------------===// + + +#if HOST_LIBRARY +#include "offload_host.h" +#include "offload_myo_host.h" +#else +#include "compiler_if_target.h" +#include "offload_target.h" +#include "offload_myo_target.h" +#endif + +#ifdef TARGET_WINNT +#define ALLOCATE(name) __declspec(allocate(name)) +#define DLL_LOCAL +#else // TARGET_WINNT +#define ALLOCATE(name) __attribute__((section(name))) +#define DLL_LOCAL __attribute__((visibility("hidden"))) +#endif // TARGET_WINNT + +#if HOST_LIBRARY +// the host program/shared library should always have __offload_target_image +// symbol defined. This symbol specifies the beginning of the target program +// image. +extern "C" DLL_LOCAL const void* __offload_target_image; +#else // HOST_LIBRARY +// Define a weak main which would be used on target side in case usere's +// source file containing main does not have offload code. +#pragma weak main +int main(void) +{ + OFFLOAD_TARGET_MAIN(); + return 0; +} + +#pragma weak MAIN__ +extern "C" int MAIN__(void) +{ + OFFLOAD_TARGET_MAIN(); + return 0; +} +#endif // HOST_LIBRARY + +// offload section prolog +ALLOCATE(OFFLOAD_ENTRY_TABLE_SECTION_START) +#ifdef TARGET_WINNT +__declspec(align(sizeof(FuncTable::Entry))) +#endif // TARGET_WINNT +static FuncTable::Entry __offload_entry_table_start = { 0 }; + +// list element for the current module +static FuncList::Node __offload_entry_node = { + { &__offload_entry_table_start + 1, -1 }, + 0, 0 +}; + +// offload fp section prolog +ALLOCATE(OFFLOAD_FUNC_TABLE_SECTION_START) +#ifdef TARGET_WINNT +__declspec(align(sizeof(FuncTable::Entry))) +#endif // TARGET_WINNT +static FuncTable::Entry __offload_func_table_start = { 0 }; + +// list element for the current module +static FuncList::Node __offload_func_node = { + { &__offload_func_table_start + 1, -1 }, + 0, 0 +}; + +// offload fp section prolog +ALLOCATE(OFFLOAD_VAR_TABLE_SECTION_START) +#ifdef TARGET_WINNT +__declspec(align(sizeof(VarTable::Entry))) +#endif // TARGET_WINNT +static VarTable::Entry __offload_var_table_start = { 0 }; + +// list element for the current module +static VarList::Node __offload_var_node = { + { &__offload_var_table_start + 1 }, + 0, 0 +}; + +#ifdef MYO_SUPPORT + +// offload myo shared var section prolog +ALLOCATE(OFFLOAD_MYO_SHARED_TABLE_SECTION_START) +#ifdef TARGET_WINNT +__declspec(align(sizeof(SharedTableEntry))) +#endif // TARGET_WINNT +static SharedTableEntry __offload_myo_shared_table_start = { 0 }; + +#if HOST_LIBRARY +// offload myo shared var init section prolog +ALLOCATE(OFFLOAD_MYO_SHARED_INIT_TABLE_SECTION_START) +#ifdef TARGET_WINNT +__declspec(align(sizeof(InitTableEntry))) +#endif // TARGET_WINNT +static InitTableEntry __offload_myo_shared_init_table_start = { 0 }; +#endif + +// offload myo fptr section prolog +ALLOCATE(OFFLOAD_MYO_FPTR_TABLE_SECTION_START) +#ifdef TARGET_WINNT +__declspec(align(sizeof(FptrTableEntry))) +#endif // TARGET_WINNT +static FptrTableEntry __offload_myo_fptr_table_start = { 0 }; + +#endif // MYO_SUPPORT + +// init/fini code which adds/removes local lookup data to/from the global list + +static void offload_fini(); + +#ifndef TARGET_WINNT +static void offload_init() __attribute__((constructor(101))); +#else // TARGET_WINNT +static void offload_init(); + +// Place offload initialization before user constructors +ALLOCATE(OFFLOAD_CRTINIT_SECTION_START) +static void (*addressof_offload_init)() = offload_init; +#endif // TARGET_WINNT + +static void offload_init() +{ + // register offload tables + __offload_register_tables(&__offload_entry_node, + &__offload_func_node, + &__offload_var_node); + +#if HOST_LIBRARY + __offload_register_image(&__offload_target_image); + atexit(offload_fini); +#endif // HOST_LIBRARY + +#ifdef MYO_SUPPORT + __offload_myoRegisterTables( +#if HOST_LIBRARY + &__offload_myo_shared_init_table_start + 1, +#endif // HOST_LIBRARY + &__offload_myo_shared_table_start + 1, + &__offload_myo_fptr_table_start + 1 + ); +#endif // MYO_SUPPORT +} + +static void offload_fini() +{ +#if HOST_LIBRARY + __offload_unregister_image(&__offload_target_image); +#endif // HOST_LIBRARY + + // unregister offload tables + __offload_unregister_tables(&__offload_entry_node, + &__offload_func_node, + &__offload_var_node); +} |