// { dg-do assemble } // { dg-options "-O" } // GROUPS passed old-abort typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned long ulong; extern int swap_endian; inline ushort swapshort(ushort value) { value &= 0xffff; return ((value << 8) | (value >> 8)); } struct eshort { ushort data; operator ushort() { return swap_endian ? swapshort(data) : data;} eshort(ushort t) { data = swap_endian ? swapshort(t) : t;} eshort() {} }; inline ulong swaplong(ulong value) { ulong v = (value << 16) | (value >> 16); return ((v >> 8) & 0x00ff00ff) | ((v << 8) & 0xff00ff00); } struct elong { ulong data; operator ulong() { return swap_endian ? swaplong(data) : data;} elong(ulong t) { data = swap_endian ? swaplong(t) : t; } elong() {} }; struct digiheader { uchar type[2]; eshort soft_version; eshort lo_boot_rev; eshort hi_boot_rev; eshort load_segment; eshort length; eshort exec_start; eshort image_offset; elong startup_code[2]; elong checksum; }; extern void uncompress(uchar* buf, ulong len); extern ulong compress(char* filename, uchar* buffer, ulong); struct filehdr { eshort f_magic; eshort f_nscns; elong f_timdat; elong f_symptr; elong f_nsyms; eshort f_opthdr; eshort f_flags; }; struct aouthdr { eshort magic; eshort vstamp; elong tsize; elong dsize; elong bsize; elong entry; elong text_start; elong data_start; elong bss_start; elong gprmask; elong cprmask[4]; elong gp_value; }; struct scnhdr { char s_name[8]; elong s_paddr; elong s_vaddr; elong s_size; elong s_scnptr; elong s_relptr; elong s_lnnoptr; eshort s_nreloc; eshort s_nlnno; elong s_flags; }; int file_little_endian; int host_little_endian; int swap_endian; int docheck; int expand; ulong memsize; ulong compression_quality; char *compressfile; int debug_level; extern "C" int getopt (int, char**, const char*); int main(int argc, char** argv) { uchar checksum; uchar docrc; ulong len; ulong maxlen; int i; int c; int magic; int tsize; int dsize; int quality; char dummy; uchar* code; uchar* buf; char* ap; digiheader *dh; compression_quality = 10000; docheck = 0; while ((c = getopt(argc, argv, "Ccdf:k:q:x:")) != -1) { switch (c) { default: goto usage; } } if ((expand && (docheck || compressfile || quality)) || (quality && !compressfile)) { usage: return(2); } if (compressfile) { dh->image_offset = len; len += compress(compressfile, code + len, maxlen - len); } }