]> granicus.if.org Git - strace/commitdiff
Generate scno.h without invoking a generated executable helper
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 1 Jan 2017 20:59:11 +0000 (20:59 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 1 Jan 2017 20:59:11 +0000 (20:59 +0000)
Generate scno.h using only those tools that are available for cross
build.  This allows to use scno.h during the build of strace itself.

* scno.am: New file.
* scno.head: New file.
* Makefile.am (EXTRA_DIST): Add it.
* tests/generate_scno.c: Remove.
* tests/.gitignore: Remove generate_scno.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(CLEANFILES): Remove scno.h.
(scno.h, $(scno_dependants)): Remove rules.
(scno_dependants): Remove.
($(objects)): New rule.
Include ../scno.am.

Makefile.am
scno.am [new file with mode: 0644]
scno.head [new file with mode: 0644]
tests/.gitignore
tests/Makefile.am
tests/generate_scno.c [deleted file]

index 0e157dbc0fb3264050ef5b8afaef2106549579ec..53b61955cdb01f2c34234e9f563eaeaea450b855 100644 (file)
@@ -746,6 +746,7 @@ EXTRA_DIST =                                \
        mpers.sh                        \
        mpers_test.sh                   \
        mpers_xlat.h                    \
+       scno.head                       \
        signalent.sh                    \
        strace-graph                    \
        strace-log-merge                \
diff --git a/scno.am b/scno.am
new file mode 100644 (file)
index 0000000..12745f1
--- /dev/null
+++ b/scno.am
@@ -0,0 +1,44 @@
+# scno.h make rules for strace.
+#
+# Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+SCNO_CPPFLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+               $(ARCH_MFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS)
+
+syscallent.i: $(top_srcdir)/$(OS)/$(ARCH)/syscallent.h
+       $(CPP) -P $(SCNO_CPPFLAGS) $^ -o $@
+
+digits = [[:digit:]][[:digit:]]*
+al_nums = [[:alnum:]_][[:alnum:]_]*
+SCNO_SED = /TRACE_INDIRECT_SUBCALL/d; s/^\[[[:space:]]*\($(digits)\)\][[:space:]]*=[[:space:]]*{[^,]*,[^,]*,[^,]*,[[:space:]]*"\($(al_nums)\)"[[:space:]]*},.*/\#ifndef __NR_\2\n\# define __NR_\2 (SYSCALL_BIT | \1)\n\#endif/p
+
+scno.h: $(top_srcdir)/scno.head syscallent.i
+       echo '/* Generated by Makefile from $^; do not edit. */' > $@-t
+       cat $< >> $@-t
+       LC_ALL=C sed -n '$(SCNO_SED)' $(filter-out $<,$^) >> $@-t
+       mv $@-t $@
+
+CLEANFILES += syscallent.i scno.h
diff --git a/scno.head b/scno.head
new file mode 100644 (file)
index 0000000..a640102
--- /dev/null
+++ b/scno.head
@@ -0,0 +1,6 @@
+#if defined __X32_SYSCALL_BIT && defined __NR_read \
+ && (__X32_SYSCALL_BIT & __NR_read) == __X32_SYSCALL_BIT
+# define SYSCALL_BIT __X32_SYSCALL_BIT
+#else
+# define SYSCALL_BIT 0
+#endif
index 3270176ff2a1471e9aa17ef4c49bbea1bd4ba940..87a846eb0598a0d2d54720921f853d8f330690f5 100644 (file)
@@ -80,7 +80,6 @@ ftruncate
 ftruncate64
 futex
 futimesat
-generate_scno
 get_mempolicy
 getcpu
 getcwd
index 57dd8b95f6632631c948790a829c7abc83289744..bd8f3d54abfc54ba265ffbe9997c7a1c9de5ac03 100644 (file)
@@ -142,7 +142,6 @@ check_PROGRAMS = \
        ftruncate64 \
        futex \
        futimesat \
-       generate_scno \
        get_mempolicy \
        getcpu \
        getcwd \
@@ -929,11 +928,9 @@ ksysent.h: $(srcdir)/ksysent.sed
 
 ksysent.$(OBJEXT): ksysent.h
 
-scno.h: generate_scno
-       ./$< > $@-t && mv $@-t $@
-
 objects = $(filter %.$(OBJEXT),$(SOURCES:.c=.$(OBJEXT)))
-scno_dependants = $(filter-out generate_scno.$(OBJEXT),$(objects))
-$(scno_dependants): scno.h
+$(objects): scno.h
+
+CLEANFILES = ksysent.h $(TESTS:=.tmp)
 
-CLEANFILES = ksysent.h scno.h $(TESTS:=.tmp)
+include ../scno.am
diff --git a/tests/generate_scno.c b/tests/generate_scno.c
deleted file mode 100644 (file)
index 66e8036..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Generate scno.h file.
- *
- * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "tests.h"
-#include "sysent.h"
-#include <stdio.h>
-#include <string.h>
-#include <asm/unistd.h>
-
-#define TD 0
-#define TF 0
-#define TI 0
-#define TN 0
-#define TP 0
-#define TS 0
-#define TM 0
-#define NF 0
-#define MA 0
-#define SI 0
-#define SE 0
-#define CST 0
-#define SEN(arg) 0,0
-
-static const struct_sysent syscallent[] = {
-#include "syscallent.h"
-};
-
-#undef syscall_bit
-#if defined __x86_64__ && defined __ILP32__ && defined __X32_SYSCALL_BIT
-# define syscall_bit __X32_SYSCALL_BIT
-#endif
-#ifndef syscall_bit
-# define syscall_bit 0
-#endif
-
-static char al_num[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789";
-
-int
-main(void)
-{
-       unsigned int i;
-
-       for (i = 0; i < ARRAY_SIZE(syscallent); ++i) {
-               const char *name = syscallent[i].sys_name;
-
-               if (!name || strspn(name, al_num) < strlen(name)
-#ifdef SYS_socket_nsubcalls
-                   || (i >= SYS_socket_subcall &&
-                       i < SYS_socket_subcall + SYS_socket_nsubcalls)
-#endif
-#ifdef SYS_ipc_nsubcalls
-                   || (i >= SYS_ipc_subcall &&
-                       i < SYS_ipc_subcall + SYS_ipc_nsubcalls)
-#endif
-#ifdef ARM_FIRST_SHUFFLED_SYSCALL
-                   || (i >= ARM_FIRST_SHUFFLED_SYSCALL &&
-                       i <= ARM_FIRST_SHUFFLED_SYSCALL +
-                           ARM_LAST_SPECIAL_SYSCALL + 1)
-#endif
-                  )
-                       continue;
-
-               printf("#ifndef __NR_%s\n# define __NR_%s %u\n#endif\n",
-                      name, name, syscall_bit + i);
-       }
-
-       return 0;
-}