atomic-tbl.sh 3.3 KB

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