2002-12-27 Roland McGrath <roland@redhat.com>
authorRoland McGrath <roland@gnu.org>
Fri, 27 Dec 2002 23:05:53 +0000 (23:05 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 27 Dec 2002 23:05:53 +0000 (23:05 +0000)
* scripts/gen-as-const.awk: New file.
* Makefile (distribute): Add it.
* Makerules ($(common-objpfx)%.h %.h.d: %.sym): New pattern rule.
(before-compile): Add $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
to the list.
(+depfiles): Add $(addprefix $(common-objpfx),$(gen-as-const-headers)).

Makefile
Makerules
scripts/gen-as-const.awk [new file with mode: 0644]

index 3a92ccb..b48738c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -280,7 +280,7 @@ distribute  :=      README README.libm INSTALL FAQ FAQ.in NOTES NEWS BUGS   \
                            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
index df56d7a..7e31ef7 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -663,7 +663,8 @@ ifeq ($(build-programs),yes)
 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)
@@ -1177,6 +1178,23 @@ common-generated += libc.symlist
 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
diff --git a/scripts/gen-as-const.awk b/scripts/gen-as-const.awk
new file mode 100644 (file)
index 0000000..b29656e
--- /dev/null
@@ -0,0 +1,29 @@
+# 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 "}" }