Home | History | Annotate | Download | only in strace
      1 #!/bin/sh -efu
      2 #
      3 # Copyright (c) 2015 Elvira Khabirova <lineprinter0 (at] gmail.com>
      4 # Copyright (c) 2015 Dmitry V. Levin <ldv (at] altlinux.org>
      5 # All rights reserved.
      6 #
      7 # Redistribution and use in source and binary forms, with or without
      8 # modification, are permitted provided that the following conditions
      9 # are met:
     10 # 1. Redistributions of source code must retain the above copyright
     11 #    notice, this list of conditions and the following disclaimer.
     12 # 2. Redistributions in binary form must reproduce the above copyright
     13 #    notice, this list of conditions and the following disclaimer in the
     14 #    documentation and/or other materials provided with the distribution.
     15 # 3. The name of the author may not be used to endorse or promote products
     16 #    derived from this software without specific prior written permission.
     17 #
     18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 mpers_name="$1"; shift
     30 size="$(printf %s "$mpers_name" |tr -cd '[0-9]')"
     31 [ "$size" -gt 0 ]
     32 
     33 srcdir=${0%/*}
     34 mpers_sh="${srcdir}/mpers.sh"
     35 
     36 mpers_dir="mpers-$mpers_name"
     37 mkdir -p "$mpers_dir"
     38 
     39 sample="$mpers_dir/sample.c"
     40 cat > "$sample" <<EOF
     41 #include "mpers_type.h"
     42 #include DEF_MPERS_TYPE(sample_struct)
     43 typedef struct {
     44 	struct {
     45 		void *p;
     46 		char sc;
     47 		/* unsigned char mpers_filler_1[1]; */
     48 		short ss;
     49 		unsigned char uc;
     50 		/* unsigned char mpers_filler_2[3]; */
     51 		int si;
     52 		unsigned ui;
     53 		long sl;
     54 		unsigned short us;
     55 		/* unsigned char mpers_filler_3[6]; */
     56 		long long sll __attribute__((__aligned__(8)));
     57 		unsigned long long ull;
     58 		unsigned long ul;
     59 		long asl[3];
     60 		char f;
     61 		/* unsigned char mpers_end_filler_4[7]; */
     62 	} s;
     63 	union {
     64 		long long sll;
     65 		unsigned long long ull;
     66 		void *p;
     67 		long sl;
     68 		unsigned long ul;
     69 		int si;
     70 		unsigned ui;
     71 		short ss;
     72 		unsigned short us;
     73 		char sc;
     74 		unsigned char uc;
     75 	} u[3];
     76 	short f[0];
     77 } sample_struct;
     78 #include MPERS_DEFS
     79 EOF
     80 
     81 expected="$mpers_dir/sample.expected"
     82 cat > "$expected" <<EOF
     83 #include <inttypes.h>
     84 typedef uint${size}_t mpers_ptr_t;
     85 typedef
     86 struct {
     87 struct {
     88 mpers_ptr_t p;
     89 char sc;
     90 unsigned char mpers_filler_1[1];
     91 int16_t ss;
     92 unsigned char uc;
     93 unsigned char mpers_filler_2[3];
     94 int32_t si;
     95 uint32_t ui;
     96 int${size}_t sl;
     97 uint16_t us;
     98 unsigned char mpers_filler_3[6];
     99 int64_t sll;
    100 uint64_t ull;
    101 uint${size}_t ul;
    102 int${size}_t asl[3];
    103 char f;
    104 unsigned char mpers_end_filler_4[7];
    105 } ATTRIBUTE_PACKED s;
    106 union {
    107 int64_t sll;
    108 uint64_t ull;
    109 mpers_ptr_t p;
    110 int${size}_t sl;
    111 uint${size}_t ul;
    112 int32_t si;
    113 uint32_t ui;
    114 int16_t ss;
    115 uint16_t us;
    116 char sc;
    117 unsigned char uc;
    118 } u[3];
    119 int16_t f[0];
    120 } ATTRIBUTE_PACKED ${mpers_name}_sample_struct;
    121 #define MPERS_${mpers_name}_sample_struct ${mpers_name}_sample_struct
    122 EOF
    123 
    124 CFLAGS="$CPPFLAGS -I${srcdir}" \
    125 CPPFLAGS="$CPPFLAGS -I${srcdir} -DIN_MPERS -DMPERS_IS_${mpers_name}" \
    126 "$mpers_sh" "-$mpers_name" "$sample"
    127 cmp "$expected" "$mpers_dir"/sample_struct.h > /dev/null
    128