Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/gcc.dg/torture/pr58079.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
/* { dg-options "-mlong-calls" { target mips*-*-* } } */ typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int __kernel_size_t; typedef __kernel_size_t size_t; struct list_head { struct list_head *next; }; struct dmx_ts_feed { int is_filtering; }; struct dmx_section_feed { u16 secbufp; u16 seclen; u16 tsfeedp; }; typedef int (*dmx_ts_cb) ( const u8 * buffer1, size_t buffer1_length, const u8 * buffer2, size_t buffer2_length ); struct dvb_demux_feed { union { struct dmx_ts_feed ts; struct dmx_section_feed sec; } feed; union { dmx_ts_cb ts; } cb; int type; u16 pid; int ts_type; struct list_head list_head; }; struct dvb_demux { int (*stop_feed)(struct dvb_demux_feed *feed); struct list_head feed_list; }; int dvb_dmx_swfilter_section_packet (struct dvb_demux_feed *, const u8 *); static inline __attribute__((always_inline)) u8 payload(const u8 *tsp) { if (tsp[3] & 0x20) { return 184 - 1 - tsp[4]; } return 184; } static inline __attribute__((always_inline)) int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed, const u8 *buf) { int count = payload(buf); int p; if (count == 0) return -1; return feed->cb.ts(&buf[p], count, ((void *)0), 0); } static inline __attribute__((always_inline)) void dvb_dmx_swfilter_packet_type(struct dvb_demux_feed *feed, const u8 *buf) { switch (feed->type) { case 0: if (feed->ts_type & 1) { dvb_dmx_swfilter_payload(feed, buf); } if (dvb_dmx_swfilter_section_packet(feed, buf) < 0) feed->feed.sec.seclen = feed->feed.sec.secbufp = 0; } } static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) { struct dvb_demux_feed *feed; int dvr_done = 0; for (feed = ({ const typeof( ((typeof(*feed) *)0)->list_head ) *__mptr = ((&demux->feed_list)->next); (typeof(*feed) *)( (char *)__mptr - __builtin_offsetof(typeof(*feed),list_head) );}); __builtin_prefetch(feed->list_head.next), &feed->list_head != (&demux->feed_list); feed = ({ const typeof( ((typeof(*feed) *)0)->list_head ) *__mptr = (feed->list_head.next); (typeof(*feed) *)( (char *)__mptr - __builtin_offsetof(typeof(*feed),list_head) );})) { if (((((feed)->type == 0) && ((feed)->feed.ts.is_filtering) && (((feed)->ts_type & (1 | 8)) == 1))) && (dvr_done++)) dvb_dmx_swfilter_packet_type(feed, buf); else if (feed->pid == 0x2000) feed->cb.ts(buf, 188, ((void *)0), 0); } } void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t count) { while (count--) { dvb_dmx_swfilter_packet(demux, buf); } }