A block like
       #pragma omp single
       {
         body;
       }
   becomes
       if (GOMP_single_start ())
         body;
       GOMP_barrier ();
   while
       #pragma omp single copyprivate(x)
         body;
   becomes
       datap = GOMP_single_copy_start ();
       if (datap == NULL)
         {
           body;
           data.x = x;
           GOMP_single_copy_end (&data);
         }
       else
         x = datap->x;
       GOMP_barrier ();