1 // The OpenMP standard defines 3 ways of providing ompt_start_tool:
2
3 // 1. "statically-linking the tool’s definition of ompt_start_tool into an
4 // OpenMP application"
5
6 // RUN: %libomp-compile -DCODE -DTOOL && \
7 // RUN: env OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | \
8 // RUN: FileCheck %s --check-prefixes CHECK,ADDRSPACE
9
10 // Note: We should compile the tool without -fopenmp as other tools developer
11 // would do. Otherwise this test may pass for the wrong reasons on Darwin.
12
13 // RUN: %clang %flags -DTOOL -shared -fPIC %s -o %T/tool.so
14
15 // 2. "introducing a dynamically-linked library that includes the tool’s
16 // definition of ompt_start_tool into the application’s address space"
17
18 // 2.1 Link with tool during compilation
19
20 // RUN: %libomp-compile -DCODE %no-as-needed-flag %T/tool.so && \
21 // RUN: env OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | \
22 // RUN: FileCheck %s --check-prefixes CHECK,ADDRSPACE
23
24 // 2.2 Link with tool during compilation, but AFTER the runtime
25
26 // RUN: %libomp-compile -DCODE -lomp %no-as-needed-flag %T/tool.so && \
27 // RUN: env OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | \
28 // RUN: FileCheck %s --check-prefixes CHECK,ADDRSPACE
29
30 // 2.3 Inject tool via the dynamic loader
31
32 // RUN: %libomp-compile -DCODE && \
33 // RUN: env OMP_TOOL_VERBOSE_INIT=stdout %preload-tool %libomp-run | \
34 // RUN: FileCheck %s --check-prefixes CHECK,ADDRSPACE
35
36 // 3. "providing the name of a dynamically-linked library appropriate for the
37 // architecture and operating system used by the application in the
38 // tool-libraries-var ICV"
39
40 // RUN: %libomp-compile -DCODE && env OMP_TOOL_LIBRARIES=%T/tool.so \
41 // RUN: OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | \
42 // RUN: FileCheck %s -DPARENTPATH=%T --check-prefixes CHECK,TOOLLIB
43
44 // REQUIRES: ompt
45
46 /*
47 * This file contains code for an OMPT shared library tool to be
48 * loaded and the code for the OpenMP executable.
49 * -DTOOL enables the code for the tool during compilation
50 * -DCODE enables the code for the executable during compilation
51 */
52
53 #ifdef CODE
54 #include "stdio.h"
55 #include "omp.h"
56 #include "omp-tools.h"
57
main()58 int main()
59 {
60 #pragma omp parallel num_threads(2)
61 {
62 #pragma omp master
63 {
64 int result = omp_control_tool(omp_control_tool_start, 0, NULL);
65 printf("0: control_tool()=%d\n", result);
66 }
67 }
68
69
70 // Check if libomp supports the callbacks for this test.
71 // CHECK-NOT: {{^}}0: Could not register callback
72
73 // ADDRSPACE: ----- START LOGGING OF TOOL REGISTRATION -----
74 // ADDRSPACE-NEXT: Search for OMP tool in current address space...
75
76 // TOOLLIB: ----- START LOGGING OF TOOL REGISTRATION -----
77 // TOOLLIB-NEXT: Search for OMP tool in current address space... Failed.
78 // TOOLLIB-NEXT: Searching tool libraries...
79 // TOOLLIB-NEXT: OMP_TOOL_LIBRARIES = [[PARENTPATH]]/tool.so
80 // TOOLLIB-NEXT: Opening [[PARENTPATH]]/tool.so... Success.
81 // TOOLLIB-NEXT: Searching for ompt_start_tool in
82 // TOOLLIB-SAME: [[PARENTPATH]]/tool.so...
83
84 // CHECK: 0: Do not initialize tool
85
86 // ADDRSPACE-NEXT: Failed.
87 // ADDRSPACE-NEXT: No OMP_TOOL_LIBRARIES defined.
88 // ADDRSPACE-NEXT: ...searching tool libraries failed.
89 // ADDRSPACE: No OMP tool loaded.
90 // ADDRSPACE-NEXT: ----- END LOGGING OF TOOL REGISTRATION -----
91
92 // TOOLLIB-NEXT: Found but not using the OMPT interface.
93 // TOOLLIB-NEXT: Continuing search...
94 // TOOLLIB-NEXT: ...searching tool libraries failed.
95 // TOOLLIB: No OMP tool loaded.
96 // TOOLLIB-NEXT: ----- END LOGGING OF TOOL REGISTRATION -----
97
98 // CHECK: {{^}}0: control_tool()=-2
99
100
101 return 0;
102 }
103
104 #endif /* CODE */
105
106 #ifdef TOOL
107
108 #include <omp-tools.h>
109 #include "stdio.h"
110
ompt_start_tool(unsigned int omp_version,const char * runtime_version)111 ompt_start_tool_result_t* ompt_start_tool(
112 unsigned int omp_version,
113 const char *runtime_version)
114 {
115 printf("0: Do not initialize tool\n");
116 return NULL;
117 }
118 #endif /* TOOL */
119