Commit | Line | Data |
---|---|---|
ace9bad4 MR |
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 | |
b14e77f8 | 183 | for m in $(echo "${meta}" | grep -o .); do |
ace9bad4 MR |
184 | gen_proto_variants "${m}" "$@" |
185 | done | |
186 | } |