On Mon, Feb 04, 2013 at 10:38:29AM +0100, Jakub Jelinek wrote: > On Mon, Feb 04, 2013 at 10:22:48AM +0100, Richard Biener wrote: > > > Okay for gcc trunk? > > > > But that does not work across translation units, no? ISTR collect2 has > > support > > to handle constructor priorities all by itself (at link time, > > considering all inputs). > > I wonder why the patch turned from initially at least supporting intra-CU > support for ctor priorities into an ugly hack for asan. I guess asan > doesn't care too much about inter-CU ctor priorities, it just needs its > ctors to run before anything in the same CU is called (mainly the > __asan_init call), other CUs either won't be asan instrumented, then it > doesn't matter, or will be, but they will have their own __asan_init call.
Jakub, I switched to the simple insertion of the asan priorities for two reasons... 1) Mike seemed unconvinced that the single qsort with the proposed sort_ctor_records of... +static int +sort_ctor_records (const void * a, const void * b) +{ + const ctor_record *ca = (const ctor_record *)a; + const ctor_record *cb = (const ctor_record *)b; + if (ca->priority > cb->priority) + return 1; + if (ca->priority < cb->priority) + return -1; + if (ca->position > cb->position) + return -1; + if (ca->position < cb->position) + return 1; + return 0; +} would really be stable in absence of a second call to qsort. 2) Once I realized that darwin sets the default priority of constructors to DEFAULT_INIT_PRIORITY 65535, the desired sorting method seemed rather unclear. I assume we need to really sort these so that the priorities from MAX_INIT_PRIORITY-1 through 0 appear first in the queue and then those with MAX_INIT_PRIORITY, right? It isn't obvious how we can achieve that in sort_ctor_record with a single pass through qsort. Jack > > > I wonder why darwin cannot use that mechanism to support init priorities? > > But sure, if collect2 can be used for full init prio support, the better. > > Jakub