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 ();