162 lines · c
1// clang-format off2// RUN: %libomp-compile-and-run | %sort-threads | FileCheck %s3// REQUIRES: ompt4// UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-75// clang-format on6#define TEST_NEED_PRINT_FRAME_FROM_OUTLINED_FN7#include "callback.h"8#include <omp.h>9#include <math.h>10 11int main() {12 omp_set_nested(0);13 print_frame(0);14#pragma omp parallel num_threads(2)15 {16 print_frame_from_outlined_fn(1);17 print_ids(0);18 print_ids(1);19 print_frame(0);20#pragma omp master21 {22 print_ids(0);23 void *creator_frame = get_frame_address(0);24 int t = (int)sin(0.1);25#pragma omp task if (t)26 {27 if (creator_frame == get_frame_address(0)) {28 printf("Assume this code was inlined which the compiler is allowed "29 "to do:\n");30 print_frame(0);31 } else if (creator_frame == get_frame_address(1)) {32 printf("Assume this code was called from the application:\n");33 print_frame(1);34 } else {35 // The exit frame must be our parent!36 printf("Assume this code was not inlined, exit frame must be our "37 "parent:\n");38 print_frame_from_outlined_fn(1);39 }40 print_ids(0);41 print_ids(1);42 print_ids(2);43 }44 print_fuzzy_address(1);45 print_ids(0);46 }47 print_ids(0);48 }49 50 // clang-format off51 // Check if libomp supports the callbacks for this test.52 // CHECK-NOT: {{^}}0: Could not register callback53 54 // CHECK: {{^}}0: NULL_POINTER=[[NULL:.*$]]55 56 // make sure initial data pointers are null57 // CHECK-NOT: 0: new_task_data initially not null58 59 // CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_initial_task_begin: parallel_id={{[0-f]+}}60 // CHECK-SAME: task_id={{[0-f]+}}, actual_parallelism=1, index=1, flags=1 61 62 // CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address(0)63 // CHECK-SAME: =[[MAIN_REENTER:(0x)?[0-f]+]]64 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_begin65 // CHECK-SAME: parent_task_id=[[PARENT_TASK_ID:[0-f]+]]66 // CHECK-SAME: parent_task_frame.exit=[[NULL]]67 // CHECK-SAME: parent_task_frame.reenter={{(0x)?[0-f]+}}68 // CHECK-SAME: parallel_id=[[PARALLEL_ID:[0-f]+]], requested_team_size=269 // CHECK-SAME: codeptr_ra={{(0x)?[0-f]+}}, invoker={{[0-9]+}}70 71 // nested parallel masters72 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_begin73 // CHECK-SAME: parallel_id=[[PARALLEL_ID]]74 // CHECK-SAME: task_id=[[IMPLICIT_TASK_ID:[0-f]+]]75 // CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address76 // CHECK-SAME: =[[EXIT:(0x)?[0-f]+]]77 78 // CHECK: {{^}}[[MASTER_ID]]: task level 079 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]80 // CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[NULL]]81 82 // CHECK: {{^}}[[MASTER_ID]]: task level 183 // CHECK-SAME: parallel_id=[[IMPLICIT_PARALLEL_ID:[0-f]+]]84 // CHECK-SAME: task_id=[[PARENT_TASK_ID]],85 // CHECK-SAME: exit_frame=[[NULL]], reenter_frame={{(0x)?[0-f]+}}86 87 // CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address(0)=[[REENTER:(0x)?[0-f]+]]88 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_create89 // CHECK-SAME: parent_task_id=[[IMPLICIT_TASK_ID]]90 // CHECK-SAME: parent_task_frame.exit=[[EXIT]]91 // CHECK-SAME: parent_task_frame.reenter={{(0x)?[0-f]+}}92 // CHECK-SAME: new_task_id=[[TASK_ID:[0-f]+]]93 // CHECK-SAME: codeptr_ra=[[RETURN_ADDRESS:(0x)?[0-f]+]]{{[0-f][0-f]}}94 95 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_schedule:96 // CHECK-SAME: first_task_id=[[IMPLICIT_TASK_ID]], second_task_id=[[TASK_ID]]97 // CHECK: {{^}}[[MASTER_ID]]: __builtin_frame_address98 // CHECK-SAME: =[[TASK_EXIT:(0x)?[0-f]+]]99 // CHECK: {{^}}[[MASTER_ID]]: task level 0100 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[TASK_ID]]101 // CHECK-SAME: exit_frame=[[TASK_EXIT]], reenter_frame=[[NULL]]102 103 // CHECK: {{^}}[[MASTER_ID]]: task level 1104 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]105 // CHECK-SAME: exit_frame=[[EXIT]], reenter_frame={{(0x)?[0-f]+}}106 107 // CHECK: {{^}}[[MASTER_ID]]: task level 2108 // CHECK-SAME: parallel_id=[[IMPLICIT_PARALLEL_ID]]109 // CHECK-SAME: task_id=[[PARENT_TASK_ID]]110 // CHECK-SAME: exit_frame=[[NULL]], reenter_frame={{(0x)?[0-f]+}}111 112 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_schedule113 // CHECK-SAME: first_task_id=[[TASK_ID]], second_task_id=[[IMPLICIT_TASK_ID]]114 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_end: task_id=[[TASK_ID]]115 // CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[RETURN_ADDRESS]]116 117 // CHECK: {{^}}[[MASTER_ID]]: task level 0118 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]119 // CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[NULL]]120 121 // implicit barrier parallel122 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_barrier_implicit_parallel_begin123 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]124 // CHECK: {{^}}[[MASTER_ID]]: task level 0125 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]126 // CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[NULL]]127 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_barrier_implicit_parallel_end128 // parallel_id is 0 because the region ended in the barrier!129 // CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]130 // CHECK: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end131 // CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]132 133 // CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_implicit_task_begin134 // CHECK-SAME: parallel_id=[[PARALLEL_ID]]135 // CHECK-SAME: task_id=[[IMPLICIT_TASK_ID:[0-f]+]]136 // CHECK: {{^}}[[THREAD_ID]]: __builtin_frame_address137 // CHECK-SAME: =[[EXIT:(0x)?[0-f]+]]138 // CHECK: {{^}}[[THREAD_ID]]: task level 0139 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]140 // CHECK-SAME: exit_frame=[[EXIT]], reenter_frame=[[NULL]]141 // CHECK: {{^}}[[THREAD_ID]]: task level 1142 // CHECK-SAME: parallel_id=[[IMPLICIT_PARALLEL_ID]]143 // CHECK-SAME: task_id=[[PARENT_TASK_ID]]144 // CHECK-SAME: exit_frame=[[NULL]], reenter_frame={{(0x)?[0-f]+}}145 146 // CHECK: {{^}}[[THREAD_ID]]: __builtin_frame_address(0)={{(0x)?[0-f]+}}147 // CHECK: {{^}}[[THREAD_ID]]: ompt_event_barrier_implicit_parallel_begin148 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]149 // CHECK: {{^}}[[THREAD_ID]]: task level 0150 // CHECK-SAME: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]]151 // CHECK-SAME: exit_frame=[[NULL]], reenter_frame=[[NULL]]152 // parallel_id is 0 because the region ended in the barrier!153 // CHECK: {{^}}[[THREAD_ID]]: ompt_event_barrier_implicit_parallel_end154 // CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]155 156 // CHECK: {{^}}[[THREAD_ID]]: ompt_event_implicit_task_end157 // CHECK-SAME: parallel_id=0, task_id=[[IMPLICIT_TASK_ID]]158 // clang-format on159 160 return 0;161}162