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