For large application programs it is usually not sufficient to just collect OpenMP related events. The OpenMP compiler should also insert appropriate pomp_begin() and pomp_end() calls at the beginning and end of each user function. In this case the context descriptor describes the user function.
In addition, users may desire to mark arbitrary (non-function) code regions. This can be done with a directive mechanism similar to that described in the last subsection, such as
The directives are translated into pomp_begin() and pomp_end() calls. Again, techniques can be used to avoid extending OpenMP, but with the same disadvantages as described in the last section. Furthermore, the transformation tool / compiler cannot generate the context descriptor for this user defined region, so another (less efficient) mechanism would have to be used here.