From 11d695ebbfcc8530525ca58e2e943a096da8796f Mon Sep 17 00:00:00 2001 From: jkeil Date: Fri, 6 Sep 2002 13:31:33 +0000 Subject: 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. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7297 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/open.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libmpdemux/open.c b/libmpdemux/open.c index 6d4473ca46..5b3bf25d14 100644 --- a/libmpdemux/open.c +++ b/libmpdemux/open.c @@ -654,8 +654,23 @@ read_next: 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+ -- cgit v1.2.3