| // { 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); |
| } |
| } |