ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 1) #!/bin/sh
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 2) # SPDX-License-Identifier: GPL-2.0
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 3) # helpers for dealing with atomics.tbl
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 4)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 5) #meta_in(meta, match)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 6) meta_in()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 7) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 8) case "$1" in
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 9) [$2]) return 0;;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 10) esac
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 11)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 12) return 1
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 13) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 14)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 15) #meta_has_ret(meta)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 16) meta_has_ret()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 17) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 18) meta_in "$1" "bBiIfFlR"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 19) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 20)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 21) #meta_has_acquire(meta)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 22) meta_has_acquire()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 23) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 24) meta_in "$1" "BFIlR"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 25) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 26)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 27) #meta_has_release(meta)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 28) meta_has_release()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 29) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 30) meta_in "$1" "BFIRs"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 31) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 32)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 33) #meta_has_relaxed(meta)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 34) meta_has_relaxed()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 35) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 36) meta_in "$1" "BFIR"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 37) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 38)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 39) #find_fallback_template(pfx, name, sfx, order)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 40) find_fallback_template()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 41) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 42) local pfx="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 43) local name="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 44) local sfx="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 45) local order="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 46)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 47) local base=""
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 48) local file=""
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 49)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 50) # We may have fallbacks for a specific case (e.g. read_acquire()), or
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 51) # an entire class, e.g. *inc*().
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 52) #
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 53) # Start at the most specific, and fall back to the most general. Once
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 54) # we find a specific fallback, don't bother looking for more.
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 55) for base in "${pfx}${name}${sfx}${order}" "${name}"; do
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 56) file="${ATOMICDIR}/fallbacks/${base}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 57)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 58) if [ -f "${file}" ]; then
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 59) printf "${file}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 60) break
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 61) fi
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 62) done
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 63) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 64)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 65) #gen_ret_type(meta, int)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 66) gen_ret_type() {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 67) local meta="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 68) local int="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 69)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 70) case "${meta}" in
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 71) [sv]) printf "void";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 72) [bB]) printf "bool";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 73) [aiIfFlR]) printf "${int}";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 74) esac
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 75) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 76)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 77) #gen_ret_stmt(meta)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 78) gen_ret_stmt()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 79) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 80) if meta_has_ret "${meta}"; then
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 81) printf "return ";
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 82) fi
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 83) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 84)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 85) # gen_param_name(arg)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 86) gen_param_name()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 87) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 88) # strip off the leading 'c' for 'cv'
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 89) local name="${1#c}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 90) printf "${name#*:}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 91) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 92)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 93) # gen_param_type(arg, int, atomic)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 94) gen_param_type()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 95) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 96) local type="${1%%:*}"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 97) local int="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 98) local atomic="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 99)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 100) case "${type}" in
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 101) i) type="${int} ";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 102) p) type="${int} *";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 103) v) type="${atomic}_t *";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 104) cv) type="const ${atomic}_t *";;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 105) esac
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 106)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 107) printf "${type}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 108) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 109)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 110) #gen_param(arg, int, atomic)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 111) gen_param()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 112) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 113) local arg="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 114) local int="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 115) local atomic="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 116) local name="$(gen_param_name "${arg}")"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 117) local type="$(gen_param_type "${arg}" "${int}" "${atomic}")"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 118)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 119) printf "${type}${name}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 120) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 121)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 122) #gen_params(int, atomic, arg...)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 123) gen_params()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 124) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 125) local int="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 126) local atomic="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 127)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 128) while [ "$#" -gt 0 ]; do
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 129) gen_param "$1" "${int}" "${atomic}"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 130) [ "$#" -gt 1 ] && printf ", "
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 131) shift;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 132) done
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 133) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 134)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 135) #gen_args(arg...)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 136) gen_args()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 137) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 138) while [ "$#" -gt 0 ]; do
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 139) printf "$(gen_param_name "$1")"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 140) [ "$#" -gt 1 ] && printf ", "
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 141) shift;
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 142) done
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 143) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 144)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 145) #gen_proto_order_variants(meta, pfx, name, sfx, ...)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 146) gen_proto_order_variants()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 147) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 148) local meta="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 149) local pfx="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 150) local name="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 151) local sfx="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 152)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 153) gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 154)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 155) if meta_has_acquire "${meta}"; then
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 156) gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 157) fi
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 158) if meta_has_release "${meta}"; then
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 159) gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 160) fi
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 161) if meta_has_relaxed "${meta}"; then
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 162) gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 163) fi
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 164) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 165)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 166) #gen_proto_variants(meta, name, ...)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 167) gen_proto_variants()
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 168) {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 169) local meta="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 170) local name="$1"; shift
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 171) local pfx=""
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 172) local sfx=""
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 173)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 174) meta_in "${meta}" "fF" && pfx="fetch_"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 175) meta_in "${meta}" "R" && sfx="_return"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 176)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 177) gen_proto_order_variants "${meta}" "${pfx}" "${name}" "${sfx}" "$@"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 178) }
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 179)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 180) #gen_proto(meta, ...)
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 181) gen_proto() {
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 182) local meta="$1"; shift
b14e77f89aca1 (Anders Roxell 2019-02-11 13:20:34 +0000 183) for m in $(echo "${meta}" | grep -o .); do
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 184) gen_proto_variants "${m}" "$@"
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 185) done
ace9bad4df268 (Mark Rutland 2018-09-04 11:48:25 +0100 186) }