summaryrefslogtreecommitdiffstats
path: root/openmp/runtime/src/z_Linux_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/runtime/src/z_Linux_util.c')
-rw-r--r--openmp/runtime/src/z_Linux_util.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/openmp/runtime/src/z_Linux_util.c b/openmp/runtime/src/z_Linux_util.c
index b3eaf2c59a5..9f34d3460ea 100644
--- a/openmp/runtime/src/z_Linux_util.c
+++ b/openmp/runtime/src/z_Linux_util.c
@@ -2619,7 +2619,11 @@ __kmp_get_load_balance( int max )
#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64)
int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
- void *p_argv[] )
+ void *p_argv[]
+#if OMPT_SUPPORT
+ , void **exit_frame_ptr
+#endif
+)
{
int argc_full = argc + 2;
int i;
@@ -2628,6 +2632,9 @@ int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
void *args[argc_full];
void *idp[2];
+#if OMPT_SUPPORT
+ *exit_frame_ptr = __builtin_frame_address(0);
+#endif
/* We're only passing pointers to the target. */
for (i = 0; i < argc_full; i++)
types[i] = &ffi_type_pointer;
@@ -2647,6 +2654,10 @@ int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
ffi_call(&cif, (void (*)(void))pkfn, NULL, args);
+#if OMPT_SUPPORT
+ *exit_frame_ptr = 0;
+#endif
+
return 1;
}
@@ -2659,7 +2670,16 @@ int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
int
__kmp_invoke_microtask( microtask_t pkfn,
int gtid, int tid,
- int argc, void *p_argv[] ) {
+ int argc, void *p_argv[]
+#if OMPT_SUPPORT
+ , void **exit_frame_ptr
+#endif
+)
+{
+#if OMPT_SUPPORT
+ *exit_frame_ptr = __builtin_frame_address(0);
+#endif
+
switch (argc) {
default:
fprintf(stderr, "Too many args to microtask: %d!\n", argc);
@@ -2729,6 +2749,10 @@ __kmp_invoke_microtask( microtask_t pkfn,
break;
}
+#if OMPT_SUPPORT
+ *exit_frame_ptr = 0;
+#endif
+
return 1;
}
OpenPOWER on IntegriCloud