1ace9bad4SMark Rutland#!/bin/sh 2ace9bad4SMark Rutland# SPDX-License-Identifier: GPL-2.0 3ace9bad4SMark Rutland# helpers for dealing with atomics.tbl 4ace9bad4SMark Rutland 5ace9bad4SMark Rutland#meta_in(meta, match) 6ace9bad4SMark Rutlandmeta_in() 7ace9bad4SMark Rutland{ 8ace9bad4SMark Rutland case "$1" in 9ace9bad4SMark Rutland [$2]) return 0;; 10ace9bad4SMark Rutland esac 11ace9bad4SMark Rutland 12ace9bad4SMark Rutland return 1 13ace9bad4SMark Rutland} 14ace9bad4SMark Rutland 15ace9bad4SMark Rutland#meta_has_ret(meta) 16ace9bad4SMark Rutlandmeta_has_ret() 17ace9bad4SMark Rutland{ 18ace9bad4SMark Rutland meta_in "$1" "bBiIfFlR" 19ace9bad4SMark Rutland} 20ace9bad4SMark Rutland 21ace9bad4SMark Rutland#meta_has_acquire(meta) 22ace9bad4SMark Rutlandmeta_has_acquire() 23ace9bad4SMark Rutland{ 24ace9bad4SMark Rutland meta_in "$1" "BFIlR" 25ace9bad4SMark Rutland} 26ace9bad4SMark Rutland 27ace9bad4SMark Rutland#meta_has_release(meta) 28ace9bad4SMark Rutlandmeta_has_release() 29ace9bad4SMark Rutland{ 30ace9bad4SMark Rutland meta_in "$1" "BFIRs" 31ace9bad4SMark Rutland} 32ace9bad4SMark Rutland 33ace9bad4SMark Rutland#meta_has_relaxed(meta) 34ace9bad4SMark Rutlandmeta_has_relaxed() 35ace9bad4SMark Rutland{ 36ace9bad4SMark Rutland meta_in "$1" "BFIR" 37ace9bad4SMark Rutland} 38ace9bad4SMark Rutland 39*ad811070SMark Rutland#meta_is_implicitly_relaxed(meta) 40*ad811070SMark Rutlandmeta_is_implicitly_relaxed() 41ace9bad4SMark Rutland{ 42*ad811070SMark Rutland meta_in "$1" "vls" 43*ad811070SMark Rutland} 44*ad811070SMark Rutland 45*ad811070SMark Rutland#find_template(tmpltype, pfx, name, sfx, order) 46*ad811070SMark Rutlandfind_template() 47*ad811070SMark Rutland{ 48*ad811070SMark Rutland local tmpltype="$1"; shift 49ace9bad4SMark Rutland local pfx="$1"; shift 50ace9bad4SMark Rutland local name="$1"; shift 51ace9bad4SMark Rutland local sfx="$1"; shift 52ace9bad4SMark Rutland local order="$1"; shift 53ace9bad4SMark Rutland 54ace9bad4SMark Rutland local base="" 55ace9bad4SMark Rutland local file="" 56ace9bad4SMark Rutland 57ace9bad4SMark Rutland # We may have fallbacks for a specific case (e.g. read_acquire()), or 58ace9bad4SMark Rutland # an entire class, e.g. *inc*(). 59ace9bad4SMark Rutland # 60ace9bad4SMark Rutland # Start at the most specific, and fall back to the most general. Once 61ace9bad4SMark Rutland # we find a specific fallback, don't bother looking for more. 62*ad811070SMark Rutland for base in "${pfx}${name}${sfx}${order}" "${pfx}${name}${sfx}" "${name}"; do 63*ad811070SMark Rutland file="${ATOMICDIR}/${tmpltype}/${base}" 64ace9bad4SMark Rutland 65ace9bad4SMark Rutland if [ -f "${file}" ]; then 66ace9bad4SMark Rutland printf "${file}" 67ace9bad4SMark Rutland break 68ace9bad4SMark Rutland fi 69ace9bad4SMark Rutland done 70ace9bad4SMark Rutland} 71ace9bad4SMark Rutland 72*ad811070SMark Rutland#find_fallback_template(pfx, name, sfx, order) 73*ad811070SMark Rutlandfind_fallback_template() 74*ad811070SMark Rutland{ 75*ad811070SMark Rutland find_template "fallbacks" "$@" 76*ad811070SMark Rutland} 77*ad811070SMark Rutland 78*ad811070SMark Rutland#find_kerneldoc_template(pfx, name, sfx, order) 79*ad811070SMark Rutlandfind_kerneldoc_template() 80*ad811070SMark Rutland{ 81*ad811070SMark Rutland find_template "kerneldoc" "$@" 82*ad811070SMark Rutland} 83*ad811070SMark Rutland 84ace9bad4SMark Rutland#gen_ret_type(meta, int) 85ace9bad4SMark Rutlandgen_ret_type() { 86ace9bad4SMark Rutland local meta="$1"; shift 87ace9bad4SMark Rutland local int="$1"; shift 88ace9bad4SMark Rutland 89ace9bad4SMark Rutland case "${meta}" in 90ace9bad4SMark Rutland [sv]) printf "void";; 91ace9bad4SMark Rutland [bB]) printf "bool";; 92ace9bad4SMark Rutland [aiIfFlR]) printf "${int}";; 93ace9bad4SMark Rutland esac 94ace9bad4SMark Rutland} 95ace9bad4SMark Rutland 96ace9bad4SMark Rutland#gen_ret_stmt(meta) 97ace9bad4SMark Rutlandgen_ret_stmt() 98ace9bad4SMark Rutland{ 99ace9bad4SMark Rutland if meta_has_ret "${meta}"; then 100ace9bad4SMark Rutland printf "return "; 101ace9bad4SMark Rutland fi 102ace9bad4SMark Rutland} 103ace9bad4SMark Rutland 104ace9bad4SMark Rutland# gen_param_name(arg) 105ace9bad4SMark Rutlandgen_param_name() 106ace9bad4SMark Rutland{ 107ace9bad4SMark Rutland # strip off the leading 'c' for 'cv' 108ace9bad4SMark Rutland local name="${1#c}" 109ace9bad4SMark Rutland printf "${name#*:}" 110ace9bad4SMark Rutland} 111ace9bad4SMark Rutland 112ace9bad4SMark Rutland# gen_param_type(arg, int, atomic) 113ace9bad4SMark Rutlandgen_param_type() 114ace9bad4SMark Rutland{ 115ace9bad4SMark Rutland local type="${1%%:*}"; shift 116ace9bad4SMark Rutland local int="$1"; shift 117ace9bad4SMark Rutland local atomic="$1"; shift 118ace9bad4SMark Rutland 119ace9bad4SMark Rutland case "${type}" in 120ace9bad4SMark Rutland i) type="${int} ";; 121ace9bad4SMark Rutland p) type="${int} *";; 122ace9bad4SMark Rutland v) type="${atomic}_t *";; 123ace9bad4SMark Rutland cv) type="const ${atomic}_t *";; 124ace9bad4SMark Rutland esac 125ace9bad4SMark Rutland 126ace9bad4SMark Rutland printf "${type}" 127ace9bad4SMark Rutland} 128ace9bad4SMark Rutland 129ace9bad4SMark Rutland#gen_param(arg, int, atomic) 130ace9bad4SMark Rutlandgen_param() 131ace9bad4SMark Rutland{ 132ace9bad4SMark Rutland local arg="$1"; shift 133ace9bad4SMark Rutland local int="$1"; shift 134ace9bad4SMark Rutland local atomic="$1"; shift 135ace9bad4SMark Rutland local name="$(gen_param_name "${arg}")" 136ace9bad4SMark Rutland local type="$(gen_param_type "${arg}" "${int}" "${atomic}")" 137ace9bad4SMark Rutland 138ace9bad4SMark Rutland printf "${type}${name}" 139ace9bad4SMark Rutland} 140ace9bad4SMark Rutland 141ace9bad4SMark Rutland#gen_params(int, atomic, arg...) 142ace9bad4SMark Rutlandgen_params() 143ace9bad4SMark Rutland{ 144ace9bad4SMark Rutland local int="$1"; shift 145ace9bad4SMark Rutland local atomic="$1"; shift 146ace9bad4SMark Rutland 147ace9bad4SMark Rutland while [ "$#" -gt 0 ]; do 148ace9bad4SMark Rutland gen_param "$1" "${int}" "${atomic}" 149ace9bad4SMark Rutland [ "$#" -gt 1 ] && printf ", " 150ace9bad4SMark Rutland shift; 151ace9bad4SMark Rutland done 152ace9bad4SMark Rutland} 153ace9bad4SMark Rutland 154ace9bad4SMark Rutland#gen_args(arg...) 155ace9bad4SMark Rutlandgen_args() 156ace9bad4SMark Rutland{ 157ace9bad4SMark Rutland while [ "$#" -gt 0 ]; do 158ace9bad4SMark Rutland printf "$(gen_param_name "$1")" 159ace9bad4SMark Rutland [ "$#" -gt 1 ] && printf ", " 160ace9bad4SMark Rutland shift; 161ace9bad4SMark Rutland done 162ace9bad4SMark Rutland} 163ace9bad4SMark Rutland 164*ad811070SMark Rutland#gen_desc_return(meta) 165*ad811070SMark Rutlandgen_desc_return() 166*ad811070SMark Rutland{ 167*ad811070SMark Rutland local meta="$1"; shift 168*ad811070SMark Rutland 169*ad811070SMark Rutland case "${meta}" in 170*ad811070SMark Rutland [v]) 171*ad811070SMark Rutland printf "Return: Nothing." 172*ad811070SMark Rutland ;; 173*ad811070SMark Rutland [Ff]) 174*ad811070SMark Rutland printf "Return: The original value of @v." 175*ad811070SMark Rutland ;; 176*ad811070SMark Rutland [R]) 177*ad811070SMark Rutland printf "Return: The updated value of @v." 178*ad811070SMark Rutland ;; 179*ad811070SMark Rutland [l]) 180*ad811070SMark Rutland printf "Return: The value of @v." 181*ad811070SMark Rutland ;; 182*ad811070SMark Rutland esac 183*ad811070SMark Rutland} 184*ad811070SMark Rutland 185*ad811070SMark Rutland#gen_template_kerneldoc(template, class, meta, pfx, name, sfx, order, atomic, int, args...) 186*ad811070SMark Rutlandgen_template_kerneldoc() 187*ad811070SMark Rutland{ 188*ad811070SMark Rutland local template="$1"; shift 189*ad811070SMark Rutland local class="$1"; shift 190*ad811070SMark Rutland local meta="$1"; shift 191*ad811070SMark Rutland local pfx="$1"; shift 192*ad811070SMark Rutland local name="$1"; shift 193*ad811070SMark Rutland local sfx="$1"; shift 194*ad811070SMark Rutland local order="$1"; shift 195*ad811070SMark Rutland local atomic="$1"; shift 196*ad811070SMark Rutland local int="$1"; shift 197*ad811070SMark Rutland 198*ad811070SMark Rutland local atomicname="${atomic}_${pfx}${name}${sfx}${order}" 199*ad811070SMark Rutland 200*ad811070SMark Rutland local ret="$(gen_ret_type "${meta}" "${int}")" 201*ad811070SMark Rutland local retstmt="$(gen_ret_stmt "${meta}")" 202*ad811070SMark Rutland local params="$(gen_params "${int}" "${atomic}" "$@")" 203*ad811070SMark Rutland local args="$(gen_args "$@")" 204*ad811070SMark Rutland local desc_order="" 205*ad811070SMark Rutland local desc_instrumentation="" 206*ad811070SMark Rutland local desc_return="" 207*ad811070SMark Rutland 208*ad811070SMark Rutland if [ ! -z "${order}" ]; then 209*ad811070SMark Rutland desc_order="${order##_}" 210*ad811070SMark Rutland elif meta_is_implicitly_relaxed "${meta}"; then 211*ad811070SMark Rutland desc_order="relaxed" 212*ad811070SMark Rutland else 213*ad811070SMark Rutland desc_order="full" 214*ad811070SMark Rutland fi 215*ad811070SMark Rutland 216*ad811070SMark Rutland if [ -z "${class}" ]; then 217*ad811070SMark Rutland desc_noinstr="Unsafe to use in noinstr code; use raw_${atomicname}() there." 218*ad811070SMark Rutland else 219*ad811070SMark Rutland desc_noinstr="Safe to use in noinstr code; prefer ${atomicname}() elsewhere." 220*ad811070SMark Rutland fi 221*ad811070SMark Rutland 222*ad811070SMark Rutland desc_return="$(gen_desc_return "${meta}")" 223*ad811070SMark Rutland 224*ad811070SMark Rutland . ${template} 225*ad811070SMark Rutland} 226*ad811070SMark Rutland 227*ad811070SMark Rutland#gen_kerneldoc(class, meta, pfx, name, sfx, order, atomic, int, args...) 228*ad811070SMark Rutlandgen_kerneldoc() 229*ad811070SMark Rutland{ 230*ad811070SMark Rutland local class="$1"; shift 231*ad811070SMark Rutland local meta="$1"; shift 232*ad811070SMark Rutland local pfx="$1"; shift 233*ad811070SMark Rutland local name="$1"; shift 234*ad811070SMark Rutland local sfx="$1"; shift 235*ad811070SMark Rutland local order="$1"; shift 236*ad811070SMark Rutland 237*ad811070SMark Rutland local atomicname="${atomic}_${pfx}${name}${sfx}${order}" 238*ad811070SMark Rutland 239*ad811070SMark Rutland local tmpl="$(find_kerneldoc_template "${pfx}" "${name}" "${sfx}" "${order}")" 240*ad811070SMark Rutland if [ -z "${tmpl}" ]; then 241*ad811070SMark Rutland printf "/*\n" 242*ad811070SMark Rutland printf " * No kerneldoc available for ${class}${atomicname}\n" 243*ad811070SMark Rutland printf " */\n" 244*ad811070SMark Rutland else 245*ad811070SMark Rutland gen_template_kerneldoc "${tmpl}" "${class}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@" 246*ad811070SMark Rutland fi 247*ad811070SMark Rutland} 248*ad811070SMark Rutland 249ace9bad4SMark Rutland#gen_proto_order_variants(meta, pfx, name, sfx, ...) 250ace9bad4SMark Rutlandgen_proto_order_variants() 251ace9bad4SMark Rutland{ 252ace9bad4SMark Rutland local meta="$1"; shift 253ace9bad4SMark Rutland local pfx="$1"; shift 254ace9bad4SMark Rutland local name="$1"; shift 255ace9bad4SMark Rutland local sfx="$1"; shift 256ace9bad4SMark Rutland 257ace9bad4SMark Rutland gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" 258ace9bad4SMark Rutland 259ace9bad4SMark Rutland if meta_has_acquire "${meta}"; then 260ace9bad4SMark Rutland gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" 261ace9bad4SMark Rutland fi 262ace9bad4SMark Rutland if meta_has_release "${meta}"; then 263ace9bad4SMark Rutland gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" 264ace9bad4SMark Rutland fi 265ace9bad4SMark Rutland if meta_has_relaxed "${meta}"; then 266ace9bad4SMark Rutland gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@" 267ace9bad4SMark Rutland fi 268ace9bad4SMark Rutland} 269ace9bad4SMark Rutland 270ace9bad4SMark Rutland#gen_proto_variants(meta, name, ...) 271ace9bad4SMark Rutlandgen_proto_variants() 272ace9bad4SMark Rutland{ 273ace9bad4SMark Rutland local meta="$1"; shift 274ace9bad4SMark Rutland local name="$1"; shift 275ace9bad4SMark Rutland local pfx="" 276ace9bad4SMark Rutland local sfx="" 277ace9bad4SMark Rutland 278ace9bad4SMark Rutland meta_in "${meta}" "fF" && pfx="fetch_" 279ace9bad4SMark Rutland meta_in "${meta}" "R" && sfx="_return" 280ace9bad4SMark Rutland 281ace9bad4SMark Rutland gen_proto_order_variants "${meta}" "${pfx}" "${name}" "${sfx}" "$@" 282ace9bad4SMark Rutland} 283ace9bad4SMark Rutland 284ace9bad4SMark Rutland#gen_proto(meta, ...) 285ace9bad4SMark Rutlandgen_proto() { 286ace9bad4SMark Rutland local meta="$1"; shift 287b14e77f8SAnders Roxell for m in $(echo "${meta}" | grep -o .); do 288ace9bad4SMark Rutland gen_proto_variants "${m}" "$@" 289ace9bad4SMark Rutland done 290ace9bad4SMark Rutland} 291