public inbox for libc-ports@sourceware.org
 help / color / mirror / Atom feed
From: Mike Frysinger <vapier@gentoo.org>
To: libc-ports@sourceware.org
Subject: [PATCH v2] ia64: fix strict aliasing warnings with func descriptors
Date: Mon, 11 Mar 2013 02:12:00 -0000	[thread overview]
Message-ID: <1362968107-20719-1-git-send-email-vapier@gentoo.org> (raw)
In-Reply-To: <1362917653-765-1-git-send-email-vapier@gentoo.org>

Function pointers on ia64 are like parisc -- they're plabels.  While
the parisc port enjoys a gcc builtin for extracting the address here,
ia64 has no such luck.

Casting & dereferencing in one go triggers a strict aliasing warning.
Use a union to fix that.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
v2
	- move magic union to common define
	- update other places w/same problem to use new define

 ports/ChangeLog.ia64                             | 12 ++++++++++++
 ports/sysdeps/ia64/dl-fptr.h                     | 10 ++++++++++
 ports/sysdeps/ia64/dl-machine.h                  |  4 ++--
 ports/sysdeps/ia64/entry.h                       |  5 ++++-
 ports/sysdeps/unix/sysv/linux/ia64/makecontext.c | 16 ++++++----------
 5 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/ports/ChangeLog.ia64 b/ports/ChangeLog.ia64
index 46e2dd9..17ed31c 100644
--- a/ports/ChangeLog.ia64
+++ b/ports/ChangeLog.ia64
@@ -1,5 +1,17 @@
 2013-03-10  Mike Frysinger  <vapier@gentoo.org>
 
+	* sysdeps/ia64/dl-fptr.h (ELF_PTR_TO_FDESC): New definition.
+	* sysdeps/ia64/dl-machine.h (elf_machine_runtime_setup): Change
+	struct fdesc * casts to use new ELF_PTR_TO_FDESC helper.
+	* sysdeps/ia64/entry.h: Include link.h and dl-fptr.h.
+	(ENTRY_POINT): Change cast to use new ELF_PTR_TO_FDESC helper.
+	* sysdeps/unix/sysv/linux/ia64/makecontext.c: Include link.h and
+	dl-fptr.h.
+	(struct fdesc): Remove structure, now redundant.
+	(makecontext): Change casts to use new ELF_PTR_TO_FDESC helper.
+
+2013-03-10  Mike Frysinger  <vapier@gentoo.org>
+
 	* sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h:
 	Change multiple inclusion guard to _LINUX_IA64_DL_SYSDEP_H.
 	Use #include_next.
diff --git a/ports/sysdeps/ia64/dl-fptr.h b/ports/sysdeps/ia64/dl-fptr.h
index c2bef6c..447c098 100644
--- a/ports/sysdeps/ia64/dl-fptr.h
+++ b/ports/sysdeps/ia64/dl-fptr.h
@@ -32,4 +32,14 @@
 #define ELF_MACHINE_LOAD_ADDRESS(var, symbol)	\
   asm ("movl %0 = @gprel (" #symbol ");; add %0 = %0, gp" : "=&r" (var));
 
+/* We don't have a gcc helper to extract the plabel info.  */
+#define ELF_PTR_TO_FDESC(ptr) \
+  ({ union { \
+       void *_ptr; \
+       struct fdesc *_fdesc; \
+     } _u; \
+     _u._ptr = ptr; \
+     _u._fdesc; \
+  })
+
 #endif /* !dl_ia64_fptr_h */
diff --git a/ports/sysdeps/ia64/dl-machine.h b/ports/sysdeps/ia64/dl-machine.h
index 2eb80d7..dd469d7 100644
--- a/ports/sysdeps/ia64/dl-machine.h
+++ b/ports/sysdeps/ia64/dl-machine.h
@@ -119,7 +119,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 
       /* This function will be called to perform the relocation.  */
       if (!profile)
-	doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_resolve)->ip;
+	doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_resolve)->ip;
       else
 	{
 	  if (GLRO(dl_profile) != NULL
@@ -129,7 +129,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 		 want profiling and the timers are started.  */
 	      GL(dl_profile_map) = l;
 	    }
-	  doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_profile)->ip;
+	  doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_profile)->ip;
 	}
 
       reserve[1] = doit;
diff --git a/ports/sysdeps/ia64/entry.h b/ports/sysdeps/ia64/entry.h
index b93e1b6..e11b49f 100644
--- a/ports/sysdeps/ia64/entry.h
+++ b/ports/sysdeps/ia64/entry.h
@@ -1,10 +1,13 @@
+#include <link.h>
+#include <dl-fptr.h>
+
 #ifndef __ASSEMBLY__
 extern void _start (void);
 #endif
 
 /* The function's entry point is stored in the first word of the
    function descriptor (plabel) of _start().  */
-#define ENTRY_POINT (((long int *) _start)[0])
+#define ENTRY_POINT ELF_PTR_TO_FDESC (_start)->ip
 
 /* We have to provide a special declaration.  */
 #define ENTRY_POINT_DECL(class) class void _start (void);
diff --git a/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c b/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c
index 79fa05a..01bb025 100644
--- a/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c
+++ b/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c
@@ -22,14 +22,10 @@
 #include <stdlib.h>
 #include <ucontext.h>
 #include <sys/rse.h>
+#include <link.h>
+#include <dl-fptr.h>
 
 
-struct fdesc
-  {
-    unsigned long ip;
-    unsigned long gp;
-  };
-
 #define PUSH(val)				\
 do {						\
   if (ia64_rse_is_rnat_slot (rbs))		\
@@ -65,16 +61,16 @@ makecontext: does not know how to handle more than 8 arguments\n"));
     }
 
   /* set the entry point and global pointer: */
-  sc->sc_br[0] = ((struct fdesc *) &__start_context)->ip;
-  sc->sc_br[1] = ((struct fdesc *) func)->ip;
-  sc->sc_gr[1] = ((struct fdesc *) func)->gp;
+  sc->sc_br[0] = ELF_PTR_TO_FDESC (&__start_context)->ip;
+  sc->sc_br[1] = ELF_PTR_TO_FDESC (func)->ip;
+  sc->sc_gr[1] = ELF_PTR_TO_FDESC (func)->gp;
 
   /* set up the call frame: */
   sc->sc_ar_pfs = ((sc->sc_ar_pfs & ~0x3fffffffffUL)
 		   | (argc + 2) | ((argc + 2) << 7));
   rbs = (long *) stack_start;
   PUSH((long) ucp->uc_link);
-  PUSH(((struct fdesc *) &__start_context)->gp);
+  PUSH(ELF_PTR_TO_FDESC (&__start_context)->gp);
   va_start (ap, argc);
   for (i = 0; i < argc; ++i)
     PUSH(va_arg (ap, long));
-- 
1.8.1.2

      reply	other threads:[~2013-03-11  2:12 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-10 12:11 [PATCH/RFC] ia64: fix strict aliasing warnings with ENTRY_POINT Mike Frysinger
2013-03-11  2:12 ` Mike Frysinger [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1362968107-20719-1-git-send-email-vapier@gentoo.org \
    --to=vapier@gentoo.org \
    --cc=libc-ports@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).