#!/bin/sh # SPDX-License-Identifier: GPL-2.0 ATOMICDIR=$(dirname $0) . ${ATOMICDIR}/atomic-tbl.sh #gen_template_fallback(template, meta, pfx, name, sfx, order, atomic, int, args...) gen_template_fallback() { local template="$1"; shift local meta="$1"; shift local pfx="$1"; shift local name="$1"; shift local sfx="$1"; shift local order="$1"; shift local atomic="$1"; shift local int="$1"; shift local atomicname="arch_${atomic}_${pfx}${name}${sfx}${order}" local ret="$(gen_ret_type "${meta}" "${int}")" local retstmt="$(gen_ret_stmt "${meta}")" local params="$(gen_params "${int}" "${atomic}" "$@")" local args="$(gen_args "$@")" if [ ! -z "${template}" ]; then printf "#ifndef ${atomicname}\n" . ${template} printf "#define ${atomicname} ${atomicname}\n" printf "#endif\n\n" fi } #gen_order_fallback(meta, pfx, name, sfx, order, atomic, int, args...) gen_order_fallback() { local meta="$1"; shift local pfx="$1"; shift local name="$1"; shift local sfx="$1"; shift local order="$1"; shift local tmpl_order=${order#_} local tmpl="${ATOMICDIR}/fallbacks/${tmpl_order:-fence}" gen_template_fallback "${tmpl}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@" } #gen_proto_fallback(meta, pfx, name, sfx, order, atomic, int, args...) gen_proto_fallback() { local meta="$1"; shift local pfx="$1"; shift local name="$1"; shift local sfx="$1"; shift local order="$1"; shift local tmpl="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")" gen_template_fallback "${tmpl}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@" } #gen_basic_fallbacks(basename) gen_basic_fallbacks() { local basename="$1"; shift cat << EOF #define ${basename}_acquire ${basename} #define ${basename}_release ${basename} #define ${basename}_relaxed ${basename} EOF } #gen_proto_order_variants(meta, pfx, name, sfx, atomic, int, args...) gen_proto_order_variants() { local meta="$1"; shift local pfx="$1"; shift local name="$1"; shift local sfx="$1"; shift local atomic="$1" local basename="arch_${atomic}_${pfx}${name}${sfx}" local template="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "")" # If we don't have relaxed atomics, then we don't bother with ordering fallbacks # read_acquire and set_release need to be templated, though if ! meta_has_relaxed "${meta}"; then gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" if meta_has_acquire "${meta}"; then gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" fi if meta_has_release "${meta}"; then gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" fi return fi printf "#ifndef ${basename}_relaxed\n" if [ ! -z "${template}" ]; then printf "#ifdef ${basename}\n" fi gen_basic_fallbacks "${basename}" if [ ! -z "${template}" ]; then printf "#endif /* ${basename} */\n\n" gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@" fi printf "#else /* ${basename}_relaxed */\n\n" gen_order_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" gen_order_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" gen_order_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" printf "#endif /* ${basename}_relaxed */\n\n" } gen_order_fallbacks() { local xchg="$1"; shift cat < EOF for xchg in "arch_xchg" "arch_cmpxchg" "arch_cmpxchg64" "arch_cmpxchg128"; do gen_xchg_fallbacks "${xchg}" done for cmpxchg in "cmpxchg" "cmpxchg64" "cmpxchg128"; do gen_try_cmpxchg_fallbacks "${cmpxchg}" done for cmpxchg in "cmpxchg_local" "cmpxchg64_local"; do gen_try_cmpxchg_fallback "${cmpxchg}" "" done grep '^[a-z]' "$1" | while read name meta args; do gen_proto "${meta}" "${name}" "atomic" "int" ${args} done cat < #endif EOF grep '^[a-z]' "$1" | while read name meta args; do gen_proto "${meta}" "${name}" "atomic64" "s64" ${args} done cat <