162306a36Sopenharmony_ci#!/bin/sh 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci# helpers for dealing with atomics.tbl 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#meta_in(meta, match) 662306a36Sopenharmony_cimeta_in() 762306a36Sopenharmony_ci{ 862306a36Sopenharmony_ci case "$1" in 962306a36Sopenharmony_ci [$2]) return 0;; 1062306a36Sopenharmony_ci esac 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci return 1 1362306a36Sopenharmony_ci} 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#meta_has_ret(meta) 1662306a36Sopenharmony_cimeta_has_ret() 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci meta_in "$1" "bBiIfFlR" 1962306a36Sopenharmony_ci} 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#meta_has_acquire(meta) 2262306a36Sopenharmony_cimeta_has_acquire() 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci meta_in "$1" "BFIlR" 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#meta_has_release(meta) 2862306a36Sopenharmony_cimeta_has_release() 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci meta_in "$1" "BFIRs" 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#meta_has_relaxed(meta) 3462306a36Sopenharmony_cimeta_has_relaxed() 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci meta_in "$1" "BFIR" 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#meta_is_implicitly_relaxed(meta) 4062306a36Sopenharmony_cimeta_is_implicitly_relaxed() 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci meta_in "$1" "vls" 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#find_template(tmpltype, pfx, name, sfx, order) 4662306a36Sopenharmony_cifind_template() 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci local tmpltype="$1"; shift 4962306a36Sopenharmony_ci local pfx="$1"; shift 5062306a36Sopenharmony_ci local name="$1"; shift 5162306a36Sopenharmony_ci local sfx="$1"; shift 5262306a36Sopenharmony_ci local order="$1"; shift 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci local base="" 5562306a36Sopenharmony_ci local file="" 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci # We may have fallbacks for a specific case (e.g. read_acquire()), or 5862306a36Sopenharmony_ci # an entire class, e.g. *inc*(). 5962306a36Sopenharmony_ci # 6062306a36Sopenharmony_ci # Start at the most specific, and fall back to the most general. Once 6162306a36Sopenharmony_ci # we find a specific fallback, don't bother looking for more. 6262306a36Sopenharmony_ci for base in "${pfx}${name}${sfx}${order}" "${pfx}${name}${sfx}" "${name}"; do 6362306a36Sopenharmony_ci file="${ATOMICDIR}/${tmpltype}/${base}" 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci if [ -f "${file}" ]; then 6662306a36Sopenharmony_ci printf "${file}" 6762306a36Sopenharmony_ci break 6862306a36Sopenharmony_ci fi 6962306a36Sopenharmony_ci done 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#find_fallback_template(pfx, name, sfx, order) 7362306a36Sopenharmony_cifind_fallback_template() 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci find_template "fallbacks" "$@" 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#find_kerneldoc_template(pfx, name, sfx, order) 7962306a36Sopenharmony_cifind_kerneldoc_template() 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci find_template "kerneldoc" "$@" 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#gen_ret_type(meta, int) 8562306a36Sopenharmony_cigen_ret_type() { 8662306a36Sopenharmony_ci local meta="$1"; shift 8762306a36Sopenharmony_ci local int="$1"; shift 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci case "${meta}" in 9062306a36Sopenharmony_ci [sv]) printf "void";; 9162306a36Sopenharmony_ci [bB]) printf "bool";; 9262306a36Sopenharmony_ci [aiIfFlR]) printf "${int}";; 9362306a36Sopenharmony_ci esac 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#gen_ret_stmt(meta) 9762306a36Sopenharmony_cigen_ret_stmt() 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci if meta_has_ret "${meta}"; then 10062306a36Sopenharmony_ci printf "return "; 10162306a36Sopenharmony_ci fi 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci# gen_param_name(arg) 10562306a36Sopenharmony_cigen_param_name() 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci # strip off the leading 'c' for 'cv' 10862306a36Sopenharmony_ci local name="${1#c}" 10962306a36Sopenharmony_ci printf "${name#*:}" 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci# gen_param_type(arg, int, atomic) 11362306a36Sopenharmony_cigen_param_type() 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci local type="${1%%:*}"; shift 11662306a36Sopenharmony_ci local int="$1"; shift 11762306a36Sopenharmony_ci local atomic="$1"; shift 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci case "${type}" in 12062306a36Sopenharmony_ci i) type="${int} ";; 12162306a36Sopenharmony_ci p) type="${int} *";; 12262306a36Sopenharmony_ci v) type="${atomic}_t *";; 12362306a36Sopenharmony_ci cv) type="const ${atomic}_t *";; 12462306a36Sopenharmony_ci esac 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci printf "${type}" 12762306a36Sopenharmony_ci} 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#gen_param(arg, int, atomic) 13062306a36Sopenharmony_cigen_param() 13162306a36Sopenharmony_ci{ 13262306a36Sopenharmony_ci local arg="$1"; shift 13362306a36Sopenharmony_ci local int="$1"; shift 13462306a36Sopenharmony_ci local atomic="$1"; shift 13562306a36Sopenharmony_ci local name="$(gen_param_name "${arg}")" 13662306a36Sopenharmony_ci local type="$(gen_param_type "${arg}" "${int}" "${atomic}")" 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci printf "${type}${name}" 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#gen_params(int, atomic, arg...) 14262306a36Sopenharmony_cigen_params() 14362306a36Sopenharmony_ci{ 14462306a36Sopenharmony_ci local int="$1"; shift 14562306a36Sopenharmony_ci local atomic="$1"; shift 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci while [ "$#" -gt 0 ]; do 14862306a36Sopenharmony_ci gen_param "$1" "${int}" "${atomic}" 14962306a36Sopenharmony_ci [ "$#" -gt 1 ] && printf ", " 15062306a36Sopenharmony_ci shift; 15162306a36Sopenharmony_ci done 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#gen_args(arg...) 15562306a36Sopenharmony_cigen_args() 15662306a36Sopenharmony_ci{ 15762306a36Sopenharmony_ci while [ "$#" -gt 0 ]; do 15862306a36Sopenharmony_ci printf "$(gen_param_name "$1")" 15962306a36Sopenharmony_ci [ "$#" -gt 1 ] && printf ", " 16062306a36Sopenharmony_ci shift; 16162306a36Sopenharmony_ci done 16262306a36Sopenharmony_ci} 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci#gen_desc_return(meta) 16562306a36Sopenharmony_cigen_desc_return() 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci local meta="$1"; shift 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci case "${meta}" in 17062306a36Sopenharmony_ci [v]) 17162306a36Sopenharmony_ci printf "Return: Nothing." 17262306a36Sopenharmony_ci ;; 17362306a36Sopenharmony_ci [Ff]) 17462306a36Sopenharmony_ci printf "Return: The original value of @v." 17562306a36Sopenharmony_ci ;; 17662306a36Sopenharmony_ci [R]) 17762306a36Sopenharmony_ci printf "Return: The updated value of @v." 17862306a36Sopenharmony_ci ;; 17962306a36Sopenharmony_ci [l]) 18062306a36Sopenharmony_ci printf "Return: The value of @v." 18162306a36Sopenharmony_ci ;; 18262306a36Sopenharmony_ci esac 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci#gen_template_kerneldoc(template, class, meta, pfx, name, sfx, order, atomic, int, args...) 18662306a36Sopenharmony_cigen_template_kerneldoc() 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci local template="$1"; shift 18962306a36Sopenharmony_ci local class="$1"; shift 19062306a36Sopenharmony_ci local meta="$1"; shift 19162306a36Sopenharmony_ci local pfx="$1"; shift 19262306a36Sopenharmony_ci local name="$1"; shift 19362306a36Sopenharmony_ci local sfx="$1"; shift 19462306a36Sopenharmony_ci local order="$1"; shift 19562306a36Sopenharmony_ci local atomic="$1"; shift 19662306a36Sopenharmony_ci local int="$1"; shift 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci local atomicname="${atomic}_${pfx}${name}${sfx}${order}" 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci local ret="$(gen_ret_type "${meta}" "${int}")" 20162306a36Sopenharmony_ci local retstmt="$(gen_ret_stmt "${meta}")" 20262306a36Sopenharmony_ci local params="$(gen_params "${int}" "${atomic}" "$@")" 20362306a36Sopenharmony_ci local args="$(gen_args "$@")" 20462306a36Sopenharmony_ci local desc_order="" 20562306a36Sopenharmony_ci local desc_instrumentation="" 20662306a36Sopenharmony_ci local desc_return="" 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci if [ ! -z "${order}" ]; then 20962306a36Sopenharmony_ci desc_order="${order##_}" 21062306a36Sopenharmony_ci elif meta_is_implicitly_relaxed "${meta}"; then 21162306a36Sopenharmony_ci desc_order="relaxed" 21262306a36Sopenharmony_ci else 21362306a36Sopenharmony_ci desc_order="full" 21462306a36Sopenharmony_ci fi 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci if [ -z "${class}" ]; then 21762306a36Sopenharmony_ci desc_noinstr="Unsafe to use in noinstr code; use raw_${atomicname}() there." 21862306a36Sopenharmony_ci else 21962306a36Sopenharmony_ci desc_noinstr="Safe to use in noinstr code; prefer ${atomicname}() elsewhere." 22062306a36Sopenharmony_ci fi 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci desc_return="$(gen_desc_return "${meta}")" 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci . ${template} 22562306a36Sopenharmony_ci} 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#gen_kerneldoc(class, meta, pfx, name, sfx, order, atomic, int, args...) 22862306a36Sopenharmony_cigen_kerneldoc() 22962306a36Sopenharmony_ci{ 23062306a36Sopenharmony_ci local class="$1"; shift 23162306a36Sopenharmony_ci local meta="$1"; shift 23262306a36Sopenharmony_ci local pfx="$1"; shift 23362306a36Sopenharmony_ci local name="$1"; shift 23462306a36Sopenharmony_ci local sfx="$1"; shift 23562306a36Sopenharmony_ci local order="$1"; shift 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci local atomicname="${atomic}_${pfx}${name}${sfx}${order}" 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci local tmpl="$(find_kerneldoc_template "${pfx}" "${name}" "${sfx}" "${order}")" 24062306a36Sopenharmony_ci if [ -z "${tmpl}" ]; then 24162306a36Sopenharmony_ci printf "/*\n" 24262306a36Sopenharmony_ci printf " * No kerneldoc available for ${class}${atomicname}\n" 24362306a36Sopenharmony_ci printf " */\n" 24462306a36Sopenharmony_ci else 24562306a36Sopenharmony_ci gen_template_kerneldoc "${tmpl}" "${class}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@" 24662306a36Sopenharmony_ci fi 24762306a36Sopenharmony_ci} 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci#gen_proto_order_variants(meta, pfx, name, sfx, ...) 25062306a36Sopenharmony_cigen_proto_order_variants() 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci local meta="$1"; shift 25362306a36Sopenharmony_ci local pfx="$1"; shift 25462306a36Sopenharmony_ci local name="$1"; shift 25562306a36Sopenharmony_ci local sfx="$1"; shift 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@" 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci if meta_has_acquire "${meta}"; then 26062306a36Sopenharmony_ci gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@" 26162306a36Sopenharmony_ci fi 26262306a36Sopenharmony_ci if meta_has_release "${meta}"; then 26362306a36Sopenharmony_ci gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@" 26462306a36Sopenharmony_ci fi 26562306a36Sopenharmony_ci if meta_has_relaxed "${meta}"; then 26662306a36Sopenharmony_ci gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@" 26762306a36Sopenharmony_ci fi 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci#gen_proto_variants(meta, name, ...) 27162306a36Sopenharmony_cigen_proto_variants() 27262306a36Sopenharmony_ci{ 27362306a36Sopenharmony_ci local meta="$1"; shift 27462306a36Sopenharmony_ci local name="$1"; shift 27562306a36Sopenharmony_ci local pfx="" 27662306a36Sopenharmony_ci local sfx="" 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci meta_in "${meta}" "fF" && pfx="fetch_" 27962306a36Sopenharmony_ci meta_in "${meta}" "R" && sfx="_return" 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci gen_proto_order_variants "${meta}" "${pfx}" "${name}" "${sfx}" "$@" 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci#gen_proto(meta, ...) 28562306a36Sopenharmony_cigen_proto() { 28662306a36Sopenharmony_ci local meta="$1"; shift 28762306a36Sopenharmony_ci for m in $(echo "${meta}" | grep -o .); do 28862306a36Sopenharmony_ci gen_proto_variants "${m}" "$@" 28962306a36Sopenharmony_ci done 29062306a36Sopenharmony_ci} 291