Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0
0003 # helpers for dealing with atomics.tbl
0004 
0005 #meta_in(meta, match)
0006 meta_in()
0007 {
0008         case "$1" in
0009         [$2]) return 0;;
0010         esac
0011 
0012         return 1
0013 }
0014 
0015 #meta_has_ret(meta)
0016 meta_has_ret()
0017 {
0018         meta_in "$1" "bBiIfFlR"
0019 }
0020 
0021 #meta_has_acquire(meta)
0022 meta_has_acquire()
0023 {
0024         meta_in "$1" "BFIlR"
0025 }
0026 
0027 #meta_has_release(meta)
0028 meta_has_release()
0029 {
0030         meta_in "$1" "BFIRs"
0031 }
0032 
0033 #meta_has_relaxed(meta)
0034 meta_has_relaxed()
0035 {
0036         meta_in "$1" "BFIR"
0037 }
0038 
0039 #find_fallback_template(pfx, name, sfx, order)
0040 find_fallback_template()
0041 {
0042         local pfx="$1"; shift
0043         local name="$1"; shift
0044         local sfx="$1"; shift
0045         local order="$1"; shift
0046 
0047         local base=""
0048         local file=""
0049 
0050         # We may have fallbacks for a specific case (e.g. read_acquire()), or
0051         # an entire class, e.g. *inc*().
0052         #
0053         # Start at the most specific, and fall back to the most general. Once
0054         # we find a specific fallback, don't bother looking for more.
0055         for base in "${pfx}${name}${sfx}${order}" "${name}"; do
0056                 file="${ATOMICDIR}/fallbacks/${base}"
0057 
0058                 if [ -f "${file}" ]; then
0059                         printf "${file}"
0060                         break
0061                 fi
0062         done
0063 }
0064 
0065 #gen_ret_type(meta, int)
0066 gen_ret_type() {
0067         local meta="$1"; shift
0068         local int="$1"; shift
0069 
0070         case "${meta}" in
0071         [sv]) printf "void";;
0072         [bB]) printf "bool";;
0073         [aiIfFlR]) printf "${int}";;
0074         esac
0075 }
0076 
0077 #gen_ret_stmt(meta)
0078 gen_ret_stmt()
0079 {
0080         if meta_has_ret "${meta}"; then
0081                 printf "return ";
0082         fi
0083 }
0084 
0085 # gen_param_name(arg)
0086 gen_param_name()
0087 {
0088         # strip off the leading 'c' for 'cv'
0089         local name="${1#c}"
0090         printf "${name#*:}"
0091 }
0092 
0093 # gen_param_type(arg, int, atomic)
0094 gen_param_type()
0095 {
0096         local type="${1%%:*}"; shift
0097         local int="$1"; shift
0098         local atomic="$1"; shift
0099 
0100         case "${type}" in
0101         i) type="${int} ";;
0102         p) type="${int} *";;
0103         v) type="${atomic}_t *";;
0104         cv) type="const ${atomic}_t *";;
0105         esac
0106 
0107         printf "${type}"
0108 }
0109 
0110 #gen_param(arg, int, atomic)
0111 gen_param()
0112 {
0113         local arg="$1"; shift
0114         local int="$1"; shift
0115         local atomic="$1"; shift
0116         local name="$(gen_param_name "${arg}")"
0117         local type="$(gen_param_type "${arg}" "${int}" "${atomic}")"
0118 
0119         printf "${type}${name}"
0120 }
0121 
0122 #gen_params(int, atomic, arg...)
0123 gen_params()
0124 {
0125         local int="$1"; shift
0126         local atomic="$1"; shift
0127 
0128         while [ "$#" -gt 0 ]; do
0129                 gen_param "$1" "${int}" "${atomic}"
0130                 [ "$#" -gt 1 ] && printf ", "
0131                 shift;
0132         done
0133 }
0134 
0135 #gen_args(arg...)
0136 gen_args()
0137 {
0138         while [ "$#" -gt 0 ]; do
0139                 printf "$(gen_param_name "$1")"
0140                 [ "$#" -gt 1 ] && printf ", "
0141                 shift;
0142         done
0143 }
0144 
0145 #gen_proto_order_variants(meta, pfx, name, sfx, ...)
0146 gen_proto_order_variants()
0147 {
0148         local meta="$1"; shift
0149         local pfx="$1"; shift
0150         local name="$1"; shift
0151         local sfx="$1"; shift
0152 
0153         gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
0154 
0155         if meta_has_acquire "${meta}"; then
0156                 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
0157         fi
0158         if meta_has_release "${meta}"; then
0159                 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
0160         fi
0161         if meta_has_relaxed "${meta}"; then
0162                 gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@"
0163         fi
0164 }
0165 
0166 #gen_proto_variants(meta, name, ...)
0167 gen_proto_variants()
0168 {
0169         local meta="$1"; shift
0170         local name="$1"; shift
0171         local pfx=""
0172         local sfx=""
0173 
0174         meta_in "${meta}" "fF" && pfx="fetch_"
0175         meta_in "${meta}" "R" && sfx="_return"
0176 
0177         gen_proto_order_variants "${meta}" "${pfx}" "${name}" "${sfx}" "$@"
0178 }
0179 
0180 #gen_proto(meta, ...)
0181 gen_proto() {
0182         local meta="$1"; shift
0183         for m in $(echo "${meta}" | grep -o .); do
0184                 gen_proto_variants "${m}" "$@"
0185         done
0186 }