xref: /llvm-project/openmp/runtime/test/ompt/loadtool/tool_available/tool_available.c (revision 77dc7b465313345ab0a5929f6f0386dbcab6594c)
19440c0eeSJoachim Protze // The OpenMP standard defines 3 ways of providing ompt_start_tool:
2b281a05dSIsabel Thärigen 
3b281a05dSIsabel Thärigen // 1. "statically-linking the tool’s definition of ompt_start_tool into an
4b281a05dSIsabel Thärigen //     OpenMP application"
5b281a05dSIsabel Thärigen 
6b281a05dSIsabel Thärigen // RUN: %libomp-compile -DCODE -DTOOL && env OMP_TOOL_VERBOSE_INIT=stdout \
7b281a05dSIsabel Thärigen // RUN:    %libomp-run | FileCheck %s --check-prefixes CHECK,ADDRSPACE
89440c0eeSJoachim Protze 
99440c0eeSJoachim Protze // Note: We should compile the tool without -fopenmp as other tools developer
109440c0eeSJoachim Protze //      would do. Otherwise this test may pass for the wrong reasons on Darwin.
119440c0eeSJoachim Protze 
12b281a05dSIsabel Thärigen // RUN: %clang %flags -DTOOL -shared -fPIC %s -o %T/tool.so
13b281a05dSIsabel Thärigen 
14b281a05dSIsabel Thärigen // 2. "introducing a dynamically-linked library that includes the tool’s
15b281a05dSIsabel Thärigen //    definition of ompt_start_tool into the application’s address space"
16b281a05dSIsabel Thärigen 
17b281a05dSIsabel Thärigen // 2.1 Link with tool during compilation
18b281a05dSIsabel Thärigen 
19b281a05dSIsabel Thärigen // RUN: %libomp-compile -DCODE %no-as-needed-flag %T/tool.so && \
20b281a05dSIsabel Thärigen // RUN:    env OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | FileCheck %s \
21b281a05dSIsabel Thärigen // RUN:    --check-prefixes CHECK,ADDRSPACE
22b281a05dSIsabel Thärigen 
23b281a05dSIsabel Thärigen // 2.2 Link with tool during compilation, but AFTER the runtime
24b281a05dSIsabel Thärigen 
25b281a05dSIsabel Thärigen // RUN: %libomp-compile -DCODE -lomp %no-as-needed-flag %T/tool.so && \
26b281a05dSIsabel Thärigen // RUN:    env OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | FileCheck %s \
27b281a05dSIsabel Thärigen // RUN:    --check-prefixes CHECK,ADDRSPACE
28b281a05dSIsabel Thärigen 
29b281a05dSIsabel Thärigen // 2.3 Inject tool via the dynamic loader
30b281a05dSIsabel Thärigen 
31b281a05dSIsabel Thärigen // RUN: %libomp-compile -DCODE && env OMP_TOOL_VERBOSE_INIT=stdout \
32b281a05dSIsabel Thärigen // RUN:    %preload-tool %libomp-run | FileCheck %s \
33b281a05dSIsabel Thärigen // RUN:    --check-prefixes CHECK,ADDRSPACE
34b281a05dSIsabel Thärigen 
35b281a05dSIsabel Thärigen // 3. "providing the name of a dynamically-linked library appropriate for the
36b281a05dSIsabel Thärigen //    architecture and operating system used by the application in the
37b281a05dSIsabel Thärigen //    tool-libraries-var ICV"
38b281a05dSIsabel Thärigen 
39b281a05dSIsabel Thärigen // 3.1 OMP_TOOL_VERBOSE_INIT not set
40b281a05dSIsabel Thärigen 
41b281a05dSIsabel Thärigen // RUN: %libomp-compile -DCODE && \
42b281a05dSIsabel Thärigen // RUN:    env OMP_TOOL_LIBRARIES=%T/tool.so %libomp-run | FileCheck %s
43b281a05dSIsabel Thärigen 
44b281a05dSIsabel Thärigen // 3.2 OMP_TOOL_VERBOSE_INIT disabled
45b281a05dSIsabel Thärigen 
46b281a05dSIsabel Thärigen // RUN: env OMP_TOOL_LIBRARIES=%T/tool.so OMP_TOOL_VERBOSE_INIT=disabled \
47b281a05dSIsabel Thärigen // RUN:    %libomp-run | FileCheck %s
48b281a05dSIsabel Thärigen 
49b281a05dSIsabel Thärigen // 3.3 OMP_TOOL_VERBOSE_INIT to stdout
50b281a05dSIsabel Thärigen 
51b281a05dSIsabel Thärigen // RUN: %libomp-compile -DCODE && env OMP_TOOL_LIBRARIES=%T/tool.so \
52b281a05dSIsabel Thärigen // RUN:    OMP_TOOL_VERBOSE_INIT=stdout %libomp-run | \
53b281a05dSIsabel Thärigen // RUN:    FileCheck %s -DPARENTPATH=%T --check-prefixes CHECK,TOOLLIB
54b281a05dSIsabel Thärigen 
55b281a05dSIsabel Thärigen // 3.4 OMP_TOOL_VERBOSE_INIT to stderr, check merged stdout and stderr
56b281a05dSIsabel Thärigen 
57b281a05dSIsabel Thärigen // RUN: env OMP_TOOL_LIBRARIES=%T/tool.so OMP_TOOL_VERBOSE_INIT=stderr \
58b281a05dSIsabel Thärigen // RUN:    %libomp-run 2>&1 | \
59b281a05dSIsabel Thärigen // RUN:    FileCheck %s -DPARENTPATH=%T --check-prefixes CHECK,TOOLLIB
60b281a05dSIsabel Thärigen 
61b281a05dSIsabel Thärigen // 3.5 OMP_TOOL_VERBOSE_INIT to stderr, check just stderr
62b281a05dSIsabel Thärigen 
63b281a05dSIsabel Thärigen // RUN: env OMP_TOOL_LIBRARIES=%T/tool.so OMP_TOOL_VERBOSE_INIT=stderr \
64b281a05dSIsabel Thärigen // RUN:    %libomp-run 2>&1 >/dev/null | \
65b281a05dSIsabel Thärigen // RUN:    FileCheck %s -DPARENTPATH=%T --check-prefixes TOOLLIB
66b281a05dSIsabel Thärigen 
67b281a05dSIsabel Thärigen // 3.6 OMP_TOOL_VERBOSE_INIT to file "init.log"
68b281a05dSIsabel Thärigen 
69b281a05dSIsabel Thärigen // RUN: env OMP_TOOL_LIBRARIES=%T/tool.so OMP_TOOL_VERBOSE_INIT=%T/init.log \
70b281a05dSIsabel Thärigen // RUN:    %libomp-run | FileCheck %s && cat %T/init.log | \
71b281a05dSIsabel Thärigen // RUN:    FileCheck %s -DPARENTPATH=%T --check-prefixes TOOLLIB
72b281a05dSIsabel Thärigen 
739440c0eeSJoachim Protze 
749440c0eeSJoachim Protze // REQUIRES: ompt
759440c0eeSJoachim Protze 
769440c0eeSJoachim Protze /*
779440c0eeSJoachim Protze  *  This file contains code for an OMPT shared library tool to be
789440c0eeSJoachim Protze  *  loaded and the code for the OpenMP executable.
799440c0eeSJoachim Protze  *  -DTOOL enables the code for the tool during compilation
809440c0eeSJoachim Protze  *  -DCODE enables the code for the executable during compilation
819440c0eeSJoachim Protze  */
829440c0eeSJoachim Protze 
83b281a05dSIsabel Thärigen // Check if libomp supports the callbacks for this test.
84b281a05dSIsabel Thärigen // CHECK-NOT: {{^}}0: Could not register callback
85b281a05dSIsabel Thärigen 
86b281a05dSIsabel Thärigen // ADDRSPACE: ----- START LOGGING OF TOOL REGISTRATION -----
87*77dc7b46SHansang Bae // ADDRSPACE-NEXT: Search for OMP tool in current address space... Success.
88b281a05dSIsabel Thärigen // ADDRSPACE-NEXT: Tool was started and is using the OMPT interface.
89b281a05dSIsabel Thärigen // ADDRSPACE-NEXT: ----- END LOGGING OF TOOL REGISTRATION -----
90b281a05dSIsabel Thärigen 
91b281a05dSIsabel Thärigen // TOOLLIB: ----- START LOGGING OF TOOL REGISTRATION -----
92b281a05dSIsabel Thärigen // TOOLLIB-NEXT: Search for OMP tool in current address space... Failed.
93b281a05dSIsabel Thärigen // TOOLLIB-NEXT: Searching tool libraries...
94b281a05dSIsabel Thärigen // TOOLLIB-NEXT: OMP_TOOL_LIBRARIES = [[PARENTPATH]]/tool.so
95b281a05dSIsabel Thärigen // TOOLLIB-NEXT: Opening [[PARENTPATH]]/tool.so... Success.
96b281a05dSIsabel Thärigen // TOOLLIB-NEXT: Searching for ompt_start_tool in
97b281a05dSIsabel Thärigen // TOOLLIB-SAME: [[PARENTPATH]]/tool.so... Success.
98b281a05dSIsabel Thärigen // TOOLLIB-NEXT: Tool was started and is using the OMPT interface.
99b281a05dSIsabel Thärigen // TOOLLIB-NEXT: ----- END LOGGING OF TOOL REGISTRATION -----
100b281a05dSIsabel Thärigen 
1019440c0eeSJoachim Protze #ifdef CODE
1029440c0eeSJoachim Protze #include "omp.h"
1039440c0eeSJoachim Protze 
main()1049440c0eeSJoachim Protze int main()
1059440c0eeSJoachim Protze {
1069440c0eeSJoachim Protze   #pragma omp parallel num_threads(2)
1079440c0eeSJoachim Protze   {
1089440c0eeSJoachim Protze   }
1099440c0eeSJoachim Protze 
110b281a05dSIsabel Thärigen   // CHECK-NOT: ----- START LOGGING OF TOOL REGISTRATION -----
111b281a05dSIsabel Thärigen   // CHECK-NOT: ----- END LOGGING OF TOOL REGISTRATION -----
1129440c0eeSJoachim Protze 
1139440c0eeSJoachim Protze   // CHECK: {{^}}0: NULL_POINTER=[[NULL:.*$]]
1149440c0eeSJoachim Protze   // CHECK: {{^}}0: ompt_event_runtime_shutdown
1159440c0eeSJoachim Protze 
1169440c0eeSJoachim Protze   return 0;
1179440c0eeSJoachim Protze }
1189440c0eeSJoachim Protze 
1199440c0eeSJoachim Protze #endif /* CODE */
1209440c0eeSJoachim Protze 
1219440c0eeSJoachim Protze #ifdef TOOL
1229440c0eeSJoachim Protze 
1239440c0eeSJoachim Protze #include <stdio.h>
1242b46d30fSJoachim Protze #include <omp-tools.h>
1259440c0eeSJoachim Protze 
ompt_initialize(ompt_function_lookup_t lookup,int initial_device_num,ompt_data_t * tool_data)1266213ed06SJoachim Protze int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num,
1276213ed06SJoachim Protze                     ompt_data_t *tool_data) {
1289440c0eeSJoachim Protze   printf("0: NULL_POINTER=%p\n", (void*)NULL);
1299440c0eeSJoachim Protze   return 1; //success
1309440c0eeSJoachim Protze }
1319440c0eeSJoachim Protze 
ompt_finalize(ompt_data_t * tool_data)1329440c0eeSJoachim Protze void ompt_finalize(ompt_data_t* tool_data)
1339440c0eeSJoachim Protze {
1349440c0eeSJoachim Protze   printf("0: ompt_event_runtime_shutdown\n");
1359440c0eeSJoachim Protze }
1369440c0eeSJoachim Protze 
ompt_start_tool(unsigned int omp_version,const char * runtime_version)1379440c0eeSJoachim Protze ompt_start_tool_result_t* ompt_start_tool(
1389440c0eeSJoachim Protze   unsigned int omp_version,
1399440c0eeSJoachim Protze   const char *runtime_version)
1409440c0eeSJoachim Protze {
1419440c0eeSJoachim Protze   static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,&ompt_finalize, 0};
1429440c0eeSJoachim Protze   return &ompt_start_tool_result;
1439440c0eeSJoachim Protze }
1449440c0eeSJoachim Protze #endif /* TOOL */
145