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