1*cf84ac9aSAndroid Build Coastguard Worker#!/bin/sh -efu 2*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2018 Dmitry V. Levin <[email protected]> 3*cf84ac9aSAndroid Build Coastguard Worker# All rights reserved. 4*cf84ac9aSAndroid Build Coastguard Worker# 5*cf84ac9aSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 6*cf84ac9aSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions 7*cf84ac9aSAndroid Build Coastguard Worker# are met: 8*cf84ac9aSAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright 9*cf84ac9aSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 10*cf84ac9aSAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright 11*cf84ac9aSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 12*cf84ac9aSAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 13*cf84ac9aSAndroid Build Coastguard Worker# 3. The name of the author may not be used to endorse or promote products 14*cf84ac9aSAndroid Build Coastguard Worker# derived from this software without specific prior written permission. 15*cf84ac9aSAndroid Build Coastguard Worker# 16*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*cf84ac9aSAndroid Build Coastguard Worker# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*cf84ac9aSAndroid Build Coastguard Worker# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*cf84ac9aSAndroid Build Coastguard Worker# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*cf84ac9aSAndroid Build Coastguard Worker# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*cf84ac9aSAndroid Build Coastguard Worker# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*cf84ac9aSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*cf84ac9aSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*cf84ac9aSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*cf84ac9aSAndroid Build Coastguard Worker 27*cf84ac9aSAndroid Build Coastguard Workerinput="$1" 28*cf84ac9aSAndroid Build Coastguard Workershift 29*cf84ac9aSAndroid Build Coastguard Worker 30*cf84ac9aSAndroid Build Coastguard Workercat <<EOF 31*cf84ac9aSAndroid Build Coastguard Worker/* Generated by $0 from $input; do not edit. */ 32*cf84ac9aSAndroid Build Coastguard Worker#include "defs.h" 33*cf84ac9aSAndroid Build Coastguard Worker#ifdef HAVE_LINUX_BPF_H 34*cf84ac9aSAndroid Build Coastguard Worker# include <linux/bpf.h> 35*cf84ac9aSAndroid Build Coastguard Worker# include "bpf_attr.h" 36*cf84ac9aSAndroid Build Coastguard Worker# include "static_assert.h" 37*cf84ac9aSAndroid Build Coastguard Worker 38*cf84ac9aSAndroid Build Coastguard Worker# define SoM(type_, member_) (sizeof(((type_ *)0)->member_)) 39*cf84ac9aSAndroid Build Coastguard WorkerEOF 40*cf84ac9aSAndroid Build Coastguard Worker 41*cf84ac9aSAndroid Build Coastguard Workerfor struct in $(sed -n 's/^struct \([^[:space:]]\+_struct\) .*/\1/p' < "$input"); do 42*cf84ac9aSAndroid Build Coastguard Worker case "$struct" in 43*cf84ac9aSAndroid Build Coastguard Worker BPF_*) type_name='union bpf_attr' ;; 44*cf84ac9aSAndroid Build Coastguard Worker *) type_name="struct ${struct%_struct}" ;; 45*cf84ac9aSAndroid Build Coastguard Worker esac 46*cf84ac9aSAndroid Build Coastguard Worker TYPE_NAME="$(printf %s "$type_name" |tr '[:lower:] ' '[:upper:]_')" 47*cf84ac9aSAndroid Build Coastguard Worker 48*cf84ac9aSAndroid Build Coastguard Worker enum="$(sed -n 's/^struct '"$struct"' \/\* \([^[:space:]]\+\) \*\/ {.*/\1/p' < "$input")" 49*cf84ac9aSAndroid Build Coastguard Worker ENUM="$(printf %s "$enum" |tr '[:lower:]' '[:upper:]')" 50*cf84ac9aSAndroid Build Coastguard Worker enum="$enum${enum:+.}" 51*cf84ac9aSAndroid Build Coastguard Worker ENUM="$ENUM${ENUM:+_}" 52*cf84ac9aSAndroid Build Coastguard Worker sed -n '/^struct '"$struct"' [^{]*{/,/^};$/p' < "$input" | 53*cf84ac9aSAndroid Build Coastguard Worker sed -n 's/^[[:space:]]\+[^][;]*[[:space:]]\([^][[:space:];]\+\)\(\[[^;]*\]\)\?;$/\1/p' | 54*cf84ac9aSAndroid Build Coastguard Worker while read field; do 55*cf84ac9aSAndroid Build Coastguard Worker FIELD="$(printf %s "$field" |tr '[:lower:]' '[:upper:]')" 56*cf84ac9aSAndroid Build Coastguard Worker cat <<EOF 57*cf84ac9aSAndroid Build Coastguard Worker 58*cf84ac9aSAndroid Build Coastguard Worker# ifdef HAVE_${TYPE_NAME}_$ENUM$FIELD 59*cf84ac9aSAndroid Build Coastguard Worker static_assert(SoM(struct $struct, $field) == SoM($type_name, $enum$field), 60*cf84ac9aSAndroid Build Coastguard Worker "$struct.$field size mismatch"); 61*cf84ac9aSAndroid Build Coastguard Worker static_assert(offsetof(struct $struct, $field) == offsetof($type_name, $enum$field), 62*cf84ac9aSAndroid Build Coastguard Worker "$struct.$field offset mismatch"); 63*cf84ac9aSAndroid Build Coastguard Worker# endif /* HAVE_${TYPE_NAME}_$ENUM$FIELD */ 64*cf84ac9aSAndroid Build Coastguard WorkerEOF 65*cf84ac9aSAndroid Build Coastguard Worker done 66*cf84ac9aSAndroid Build Coastguard Worker cat <<EOF 67*cf84ac9aSAndroid Build Coastguard Worker 68*cf84ac9aSAndroid Build Coastguard Workerstatic_assert(${struct}_size == expected_${struct}_size, 69*cf84ac9aSAndroid Build Coastguard Worker "${struct}_size mismatch"); 70*cf84ac9aSAndroid Build Coastguard WorkerEOF 71*cf84ac9aSAndroid Build Coastguard Worker 72*cf84ac9aSAndroid Build Coastguard Workerdone 73*cf84ac9aSAndroid Build Coastguard Worker 74*cf84ac9aSAndroid Build Coastguard Workercat <<'EOF' 75*cf84ac9aSAndroid Build Coastguard Worker 76*cf84ac9aSAndroid Build Coastguard Worker#endif /* HAVE_LINUX_BPF_H */ 77*cf84ac9aSAndroid Build Coastguard WorkerEOF 78