test-installation.pl gen-FAQ.pl versions.awk\
gen-sorted.awk abi-versions.awk abilist.awk \
firstversions.awk documented.sh cpp \
- output-format.sed)
+ output-format.sed gen-as-const.awk)
distribute := $(strip $(distribute))
generated := $(generated) stubs.h
endif
+depfiles := $(addprefix $(objpfx),\
$(filter-out $(addsuffix .d,$(omit-deps)),\
- $(+depfiles)))
+ $(+depfiles))) \
+ $(addprefix $(common-objpfx),$(gen-as-const-headers:.sym=.h.d))
ifdef +depfiles
ifneq ($(no_deps),t)
endif
endif
+
+# Generating headers for assembly constants.
+$(common-objpfx)%.h $(common-objpfx)%.h.d: $(..)scripts/gen-as-const.awk %.sym
+ $(AWK) -f $^ \
+ | $(CC) -S -o - $(CFLAGS) $(CPPFLAGS) -x c - \
+ -MD -MF $(@:.h=.h.d)T -MT '$(@:.h=.h.d) $(@:.h.d=.h)' \
+ | sed -n 's/^.*@@@name@@@\([^@]*\)@@@value@@@[^@]*\([0-9Xxa-fA-F-][0-9Xxa-fA-F-]*\).*@@@end@@@.*$$/#define \1 \2/p' > $(@:.h.d=.h)T
+ sed $(sed-remove-objpfx) \
+ -e 's@ *\([^ \/][^ \]*\)@ $$(..)\1@g' \
+ -e 's@ *\.\.\/\([^ \]*\)@ $$(..)\1@g' \
+ $(@:.h=.h.d)T > $(@:.h=.h.d)T2
+ rm -f $(@:.h=.h.d)T
+ mv -f $(@:.h=.h.d)T2 $(@:.h=.h.d)
+ mv -f $(@:.h.d=.h)T $(@:.h.d=.h)
+vpath %.sym $(sysdirs)
+
+before-compile += $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
\f
.PHONY: TAGS
TAGS: $(objpfx)distinfo $(..)MakeTAGS
--- /dev/null
+# Script used in producing headers of assembly constants from C expressions.
+# The input to this script looks like:
+# #cpp-directive ...
+# NAME1
+# NAME2 expression ...
+# The output of this script is C code to be run through gcc -S and then
+# massaged to extract the integer constant values of the given C expressions.
+# A line giving just a name implies an expression consisting of just that name.
+
+BEGIN { started = 0 }
+
+# cpp directives go straight through.
+/^#/ { print; next }
+
+NF >= 1 && !started {
+ print "void dummy(void) {";
+ started = 1;
+}
+
+NF == 1 { sub(/^.*$/, "& &"); }
+
+NF > 1 {
+ name = $1;
+ sub(/^[^ ]+[ ]+/, "");
+ printf "asm (\"@@@name@@@%s@@@value@@@%%0@@@end@@@\" : : \"i\" (%s));\n",
+ name, $0;
+}
+
+END { if (started) print "}" }