• 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-2018 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
31mpers_cc_flags="$1"; shift
32size="$(printf %s "$mpers_name" |tr -cd '[0-9]')"
33[ "$size" -gt 0 ]
34
35srcdir=${0%/*}
36mpers_sh="${srcdir}/mpers.sh"
37
38mpers_dir="mpers-$mpers_name"
39mkdir -p "$mpers_dir"
40
41sample="$mpers_dir/sample.c"
42cat > "$sample" <<EOF
43#include "mpers_type.h"
44#include DEF_MPERS_TYPE(sample_struct)
45typedef struct {
46	struct {
47		void *p;
48		char sc;
49		/* unsigned char mpers_filler_1[1]; */
50		short ss;
51		unsigned char uc;
52		/* unsigned char mpers_filler_2[3]; */
53		int si;
54		unsigned ui;
55		long sl;
56		unsigned short us;
57		/* unsigned char mpers_filler_3[6]; */
58		long long sll __attribute__((__aligned__(8)));
59		unsigned long long ull;
60		unsigned long ul;
61		long asl[3][5][7];
62		char f;
63		/* unsigned char mpers_end_filler_4[7]; */
64	} s;
65	union {
66		long long sll;
67		unsigned long long ull;
68		void *p;
69		long sl;
70		unsigned long ul;
71		int si;
72		unsigned ui;
73		short ss[7][9];
74		unsigned short us[4];
75		char sc;
76		unsigned char uc;
77	} u[3][2];
78	short f[0];
79} sample_struct;
80#include MPERS_DEFS
81EOF
82
83expected="$mpers_dir/sample.expected"
84mpers_ptr_t="uint${size}_t"
85cat > "$expected" <<EOF
86#include <stdint.h>
87#ifndef mpers_ptr_t_is_${mpers_ptr_t}
88typedef ${mpers_ptr_t} mpers_ptr_t;
89#define mpers_ptr_t_is_${mpers_ptr_t}
90#endif
91typedef
92struct {
93struct {
94mpers_ptr_t p;
95char sc;
96unsigned char mpers_filler_1[1];
97int16_t ss;
98unsigned char uc;
99unsigned char mpers_filler_2[3];
100int32_t si;
101uint32_t ui;
102int${size}_t sl;
103uint16_t us;
104unsigned char mpers_filler_3[6];
105int64_t sll;
106uint64_t ull;
107uint${size}_t ul;
108int${size}_t asl[3][5][7];
109char f;
110unsigned char mpers_end_filler_4[7];
111} ATTRIBUTE_PACKED s;
112union {
113int64_t sll;
114uint64_t ull;
115mpers_ptr_t p;
116int${size}_t sl;
117uint${size}_t ul;
118int32_t si;
119uint32_t ui;
120int16_t ss[7][9];
121uint16_t us[4];
122char sc;
123unsigned char uc;
124} u[3][2];
125int16_t f[0];
126} ATTRIBUTE_PACKED ${mpers_name}_sample_struct;
127#define MPERS_${mpers_name}_sample_struct ${mpers_name}_sample_struct
128EOF
129
130CFLAGS="$CPPFLAGS -I${srcdir} -DMPERS_IS_${mpers_name}" \
131CPPFLAGS="$CPPFLAGS -I${srcdir} -DIN_MPERS -DMPERS_IS_${mpers_name}" \
132"$mpers_sh" "$mpers_name" "$mpers_cc_flags" "$sample"
133cmp "$expected" "$mpers_dir"/sample_struct.h > /dev/null
134