changeset 7296:f4710b873abd

SPARC gcc generates bad code accessing an unaligned and packed structure member (See gcc problem report PR c/7847); mplayer crashes with SIGBUS signal. Added a workaround: copy the unaligned stucture member to a temporary local variable using memcpy, and use that in the code.
author jkeil
date Fri, 06 Sep 2002 13:31:33 +0000
parents e3b3b2f28073
children 832298d8c84d
files libmpdemux/open.c
diffstat 1 files changed, 15 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/open.c	Fri Sep 06 11:28:49 2002 +0000
+++ b/libmpdemux/open.c	Fri Sep 06 13:31:33 2002 +0000
@@ -654,8 +654,23 @@
 
 	    if(d->angle_seek){
 		int i,skip=0;
+#if defined(__GNUC__) && defined(__sparc__)
+		// workaround for a bug in the sparc version of gcc 2.95.X ... 3.2,
+		// it generates incorrect code for unaligned access to a packed
+		// structure member, resulting in an mplayer crash with a SIGBUS
+		// signal.
+		//
+		// See also gcc problem report PR c/7847:
+		// http://gcc.gnu.org/cgi-bin/gnatsweb.pl?database=gcc&cmd=view+audit-trail&pr=7847
+		for(i=0;i<9;i++){	// check if all values zero:
+		    typeof(d->dsi_pack.sml_agli.data[i].address) tmp_addr;
+		    memcpy(&tmp_addr,&d->dsi_pack.sml_agli.data[i].address,sizeof(tmp_addr));
+		    if((skip=tmp_addr)!=0) break;
+		}
+#else
 		for(i=0;i<9;i++)	// check if all values zero:
 		    if((skip=d->dsi_pack.sml_agli.data[i].address)!=0) break;
+#endif
 		if(skip){
 		    // sml_agli table has valid data (at least one non-zero):
 		    d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+