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