Message ID | 20130204172259.GA23606@bromo.med.uc.edu |
---|---|
State | New |
Headers | show |
On Feb 4, 2013, at 9:22 AM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: > Currently darwin is unable to utilize libasan with constructors due to the lack of > constructor priority support on that target. > Okay for gcc trunk? Since asan doesn't need cross translation unit priorities, the patch is sufficient to fix all of the semantics needed for asan. I still have a preference, though small, for stable_sort instead of qsort, absent performance data saying qsort is better. Ok. > ps The issue of inter module priority support remains unresolved (as it is in clang/llvm). > The only solution for both compilers is to reorder the linkage of the modules to insure that the module with the asan constructor appears first. Since asan doesn't care who goes first, we don't need priorities across translation units for it.
On Feb 4, 2013, at 11:23 AM, Mike Stump <mrs@mrs.kithrup.com> wrote: > On Feb 4, 2013, at 9:22 AM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: >> Currently darwin is unable to utilize libasan with constructors due to the lack of >> constructor priority support on that target. > >> Okay for gcc trunk? > > Since asan doesn't need cross translation unit priorities, the patch is sufficient to fix all of the semantics needed for asan. > > I still have a preference, though small, for stable_sort instead of qsort, absent performance data saying qsort is better. > > Ok. Oh, if you could, could you qsort of the dtors as well. The code exactly mirrors the ctors code.
On Feb 4, 2013, at 11:23 AM, Mike Stump <mrs@mrs.kithrup.com> wrote: > On Feb 4, 2013, at 9:22 AM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: >> Currently darwin is unable to utilize libasan with constructors due to the lack of >> constructor priority support on that target. > >> Okay for gcc trunk? > > Since asan doesn't need cross translation unit priorities, the patch is sufficient to fix all of the semantics needed for asan. > Ok. Committed revision 195735. Note, this doesn't have the test case in it. Please repost just the test case, thanks.
Index: gcc/config/darwin.c =================================================================== --- gcc/config/darwin.c (revision 195685) +++ gcc/config/darwin.c (working copy) @@ -83,6 +83,14 @@ along with GCC; see the file COPYING3. kernel) the stubs might still be required, and this will be set true. */ int darwin_emit_branch_islands = false; +typedef struct GTY(()) ctor_record { + rtx symbol; + int priority; /* constructor priority */ + int position; /* original position */ +} ctor_record; + +static GTY(()) vec<ctor_record, va_gc> *ctors = NULL; + /* A flag to determine whether we are running c++ or obj-c++. This has to be settable from non-c-family contexts too (i.e. we can't use the c_dialect_ functions). */ @@ -1708,15 +1716,48 @@ machopic_select_rtx_section (enum machin void machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED) { + ctor_record new_elt = {symbol, priority, vec_safe_length (ctors)}; + + vec_safe_push (ctors, new_elt); + + if (! MACHOPIC_INDIRECT) + fprintf (asm_out_file, ".reference .constructors_used\n"); +} + +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; +} + +static void +finalize_ctors() +{ + unsigned int i; + ctor_record *elt; + if (MACHOPIC_INDIRECT) switch_to_section (darwin_sections[mod_init_section]); else switch_to_section (darwin_sections[constructor_section]); - assemble_align (POINTER_SIZE); - assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); - if (! MACHOPIC_INDIRECT) - fprintf (asm_out_file, ".reference .constructors_used\n"); + if (vec_safe_length (ctors) > 1) + ctors->qsort (sort_ctor_records); + FOR_EACH_VEC_SAFE_ELT (ctors, i, elt) + { + assemble_align (POINTER_SIZE); + assemble_integer (elt->symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); + } } void @@ -2762,6 +2803,8 @@ darwin_file_start (void) void darwin_file_end (void) { + if (!vec_safe_is_empty (ctors)) + finalize_ctors(); machopic_finish (asm_out_file); if (strcmp (lang_hooks.name, "GNU C++") == 0) {