summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2023-04-30 15:48:02 +0200
committerEugene Syromyatnikov <evgsyr@gmail.com>2023-04-30 16:27:10 +0200
commit471f3593bf491e9296b9b889a15ba636460850c2 (patch)
tree6412a59511f490610b282adf40368f0b189c52e9
parenteb30d4d6499ab0c68ae5766082a34fa061fac1c4 (diff)
downloadstrace-471f3593bf491e9296b9b889a15ba636460850c2.tar.gz
xlat/gen.sh: allow skipping xlat value checking
This enables storing "wrong" values in xlats, so they can be referenced in cases when there are discrepancies between what UAPI headers provide and what they used to provide. * src/xlat/gen.sh (cond_def): Emit static_assert() only if $nocheckval is not enabled. (cond_xlat): Add is_shift local variable; check whether $m starts with "1<<" and set $is_shift if it is; use print_xval() only if neither is_shift nor nocheckval are set; call print_xlat_pair() if $nocheckval is set. (gen_header): Add nocheckval to local variables; handle "#checkval" and "#nocheckval" directives.
-rwxr-xr-xsrc/xlat/gen.sh34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/xlat/gen.sh b/src/xlat/gen.sh
index f7f32c604..ef67a309c 100755
--- a/src/xlat/gen.sh
+++ b/src/xlat/gen.sh
@@ -59,10 +59,11 @@ cond_def()
[ -n "$unconditional" ] ||
printf '%s\n' \
"#if defined($val) || (defined(HAVE_DECL_$val) && HAVE_DECL_$val)"
- printf '%s\n' \
- "DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE" \
- "static_assert(($val) == ($def), \"$val != $def\");" \
- "DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE"
+ [ -n "$nocheckval" ] ||
+ printf '%s\n' \
+ "DIAG_PUSH_IGNORE_TAUTOLOGICAL_COMPARE" \
+ "static_assert(($val) == ($def), \"$val != $def\");" \
+ "DIAG_POP_IGNORE_TAUTOLOGICAL_COMPARE"
[ -n "$unconditional" ] ||
printf '%s\n' \
"#else" \
@@ -141,17 +142,20 @@ print_xlat_pair()
cond_xlat()
{
echo "$1" | {
- local val def m xlat
+ local val def m is_shift= xlat
read val def
m="${val%%|*}"
+ [ "${m}" = "${m#1<<}" ] || is_shift=1
- if [ "${m}" = "${m#1<<}" ]; then
+ if [ -z "$is_shift$nocheckval" ]; then
xlat="$(print_xlat "${val}")"
- else
+ elif [ -n "$is_shift" ]; then
m="${m#1<<}"
xlat="$(print_xlat_pair "1ULL<<${val#1<<}" "${val}" "$m")"
+ else
+ xlat="$(print_xlat_pair "${def}" "${val}" "$m")"
fi
if [ -z "${def}${unconditional}" ]; then
@@ -203,7 +207,7 @@ gen_header()
EOF
- local unconditional= line
+ local unconditional= nocheckval= line
# 1st pass: output directives.
while read -r line; do
case "$line" in
@@ -220,6 +224,12 @@ gen_header()
'#unconditional')
unconditional=1
;;
+ '#checkval')
+ nocheckval=
+ ;;
+ '#nocheckval')
+ nocheckval=1
+ ;;
'#val_type '*)
# to be processed during 2nd pass
;;
@@ -301,7 +311,7 @@ gen_header()
echo "DIAG_PUSH_IGNORE_TAUTOLOGICAL_CONSTANT_COMPARE"
echo "static const struct xlat_data ${name}_xdata[] = {"
- unconditional= val_type=
+ unconditional= nocheckval= val_type=
# 2nd pass: output everything.
while read -r line; do
case "$line" in
@@ -318,6 +328,12 @@ gen_header()
'#unconditional')
unconditional=1
;;
+ '#checkval')
+ nocheckval=
+ ;;
+ '#nocheckval')
+ nocheckval=1
+ ;;
'#sorted'|'#sorted '*)
;;
'#value_indexed')