brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · c401878 Raw
155 lines · cpp
1/*2 * ompd-specific.cpp -- OpenMP debug support3 */4 5//===----------------------------------------------------------------------===//6//7// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.8// See https://llvm.org/LICENSE.txt for license information.9// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception10//11//===----------------------------------------------------------------------===//12 13#include "ompd-specific.h"14 15#if OMPD_SUPPORT16 17/**18 * Declaration of symbols to hold struct size and member offset information19 */20 21#define ompd_declare_access(t, m) uint64_t ompd_access__##t##__##m;22OMPD_FOREACH_ACCESS(ompd_declare_access)23#undef ompd_declare_access24 25#define ompd_declare_sizeof_member(t, m) uint64_t ompd_sizeof__##t##__##m;26OMPD_FOREACH_ACCESS(ompd_declare_sizeof_member)27#undef ompd_declare_sizeof_member28 29#define ompd_declare_bitfield(t, m) uint64_t ompd_bitfield__##t##__##m;30OMPD_FOREACH_BITFIELD(ompd_declare_bitfield)31#undef ompd_declare_bitfield32 33#define ompd_declare_sizeof(t) uint64_t ompd_sizeof__##t;34OMPD_FOREACH_SIZEOF(ompd_declare_sizeof)35#undef ompd_declare_sizeof36 37volatile const char **ompd_dll_locations = NULL;38uint64_t ompd_state = 0;39 40char *ompd_env_block = NULL;41ompd_size_t ompd_env_block_size = 0;42 43void ompd_init() {44 45  static int ompd_initialized = 0;46 47  if (ompd_initialized)48    return;49 50    /**51     * Calculate member offsets for structs and unions52     */53 54#define ompd_init_access(t, m)                                                 \55  ompd_access__##t##__##m = (uint64_t) & (((t *)0)->m);56  OMPD_FOREACH_ACCESS(ompd_init_access)57#undef ompd_init_access58 59  /**60   * Create bit mask for bitfield access61   */62 63#define ompd_init_bitfield(t, m)                                               \64  ompd_bitfield__##t##__##m = 0;                                               \65  ((t *)(&ompd_bitfield__##t##__##m))->m = 1;66  OMPD_FOREACH_BITFIELD(ompd_init_bitfield)67#undef ompd_init_bitfield68 69  /**70   * Calculate type size information71   */72 73#define ompd_init_sizeof_member(t, m)                                          \74  ompd_sizeof__##t##__##m = sizeof(((t *)0)->m);75  OMPD_FOREACH_ACCESS(ompd_init_sizeof_member)76#undef ompd_init_sizeof_member77 78#define ompd_init_sizeof(t) ompd_sizeof__##t = sizeof(t);79  OMPD_FOREACH_SIZEOF(ompd_init_sizeof)80#undef ompd_init_sizeof81 82  char *libname = NULL;83 84#if KMP_OS_UNIX85  // Find the location of libomp.so thru dladdr and replace the libomp with86  // libompd to get the full path of libompd87  Dl_info dl_info;88  int ret = dladdr((void *)ompd_init, &dl_info);89  if (!ret) {90    fprintf(stderr, "%s\n", dlerror());91  }92  int lib_path_length;93  if (strrchr(dl_info.dli_fname, '/')) {94    lib_path_length = strrchr(dl_info.dli_fname, '/') - dl_info.dli_fname;95    libname =96        (char *)malloc(lib_path_length + 12 /*for '/libompd.so' and '\0'*/);97    strncpy(libname, dl_info.dli_fname, lib_path_length);98    memcpy(libname + lib_path_length, "/libompd.so\0", 12);99  }100#endif101 102  const char *ompd_env_var = getenv("OMP_DEBUG");103  if (ompd_env_var && !strcmp(ompd_env_var, "enabled")) {104    fprintf(stderr, "OMP_OMPD active\n");105    ompt_enabled.enabled = 1;106    ompd_state |= OMPD_ENABLE_BP;107  }108 109  ompd_initialized = 1;110  ompd_dll_locations = (volatile const char **)malloc(3 * sizeof(const char *));111  ompd_dll_locations[0] = "libompd.so";112  ompd_dll_locations[1] = libname;113  ompd_dll_locations[2] = NULL;114  ompd_dll_locations_valid();115}116 117void __attribute__((noinline)) ompd_dll_locations_valid(void) {118  /* naive way of implementing hard to opt-out empty function119     we might want to use a separate object file? */120  asm("");121}122 123void ompd_bp_parallel_begin(void) {124  /* naive way of implementing hard to opt-out empty function125     we might want to use a separate object file? */126  asm("");127}128void ompd_bp_parallel_end(void) {129  /* naive way of implementing hard to opt-out empty function130     we might want to use a separate object file? */131  asm("");132}133void ompd_bp_task_begin(void) {134  /* naive way of implementing hard to opt-out empty function135     we might want to use a separate object file? */136  asm("");137}138void ompd_bp_task_end(void) {139  /* naive way of implementing hard to opt-out empty function140     we might want to use a separate object file? */141  asm("");142}143void ompd_bp_thread_begin(void) {144  /* naive way of implementing hard to opt-out empty function145     we might want to use a separate object file? */146  asm("");147}148void ompd_bp_thread_end(void) {149  /* naive way of implementing hard to opt-out empty function150     we might want to use a separate object file? */151  asm("");152}153 154#endif /* OMPD_SUPPORT */155