diff mbox

fix PR sanitizer/55617 via qsort

Message ID 20130204202441.GA24850@bromo.med.uc.edu
State New
Headers show

Commit Message

Jack Howarth Feb. 4, 2013, 8:24 p.m. UTC
On Mon, Feb 04, 2013 at 12:12:36PM -0800, Mike Stump wrote:
> 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.

Mike,
   Sorry about that. Complete patch with testcase attached. I am currently testing
the dtors sorting.
        Jack
/gcc

2013-02-04  Alexander Potapenko <glider@google.com>
            Jack Howarth  <howarth@bromo.med.uc.edu>
	    Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/55617
	* config/darwin.c (sort_ctor_records): Stabilized qsort
	on constructor priority by using original position.
	(finalize_ctors): New routine to sort constructors by
	priority before use in assemble_integer.
	(machopic_asm_out_constructor): Use finalize_ctors if needed.

/gcc/testsuite

2013-02-04  Alexander Potapenko <glider@google.com>
            Jack Howarth  <howarth@bromo.med.uc.edu>
	    Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/55617
	* g++.dg/asan/pr55617.C: New test.

Comments

Mike Stump Feb. 4, 2013, 9:08 p.m. UTC | #1
On Feb 4, 2013, at 12:24 PM, Jack Howarth <howarth@bromo.med.uc.edu> wrote:
> Complete patch with testcase attached.

Thanks.

Committed revision 195737.
Jakub Jelinek Feb. 4, 2013, 10:37 p.m. UTC | #2
On Mon, Feb 04, 2013 at 03:24:41PM -0500, Jack Howarth wrote:
> --- /dev/null	2013-02-02 10:53:51.000000000 -0500
> +++ gcc/testsuite/g++.dg/asan/pr55617.C	2013-02-02 10:22:17.000000000 -0500
> @@ -0,0 +1,8 @@
> +// { dg-do run { target { i?86-*-darwin* x86_64-*-darwin* } } }

There is nothing darwin specific on the testcase, is it?
Thus it should be just
// { dg-do run }

> +
> +struct c18 { 
> +  virtual void bar() { }
> +};
> +c18 ret;
> +int main () {
> +}

	Jakub
diff mbox

Patch

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)
     {
--- /dev/null	2013-02-02 10:53:51.000000000 -0500
+++ gcc/testsuite/g++.dg/asan/pr55617.C	2013-02-02 10:22:17.000000000 -0500
@@ -0,0 +1,8 @@ 
+// { dg-do run { target { i?86-*-darwin* x86_64-*-darwin* } } }
+
+struct c18 { 
+  virtual void bar() { }
+};
+c18 ret;
+int main () {
+}