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