Optimize code if we have only one personality
On i386:
text data bss dec hex filename
238025 672 18980 257677 3ee8d strace.before
237389 704 18944 257037 3ec0d strace
* defs.h: Define PERSONALITY0_WORDSIZE as sizeof(long) if not defined.
Introduce new define, current_wordsize as
(personality_wordsize[current_personality]).
Make set_personality() no-op, current_personality constant zero,
current_wordsize as PERSONALITY0_WORDSIZE if we have only one personality.
* count.c (call_summary): Use current_wordsize instead of
personality_wordsize[current_personality].
* desc.c (printflock): Likewise.
* file.c (sys_utime): Likewise.
* io.c (tprint_iov): Likewise.
* process.c (printargv): Likewise.
* resource.c (decode_rlimit): Likewise.
* signal.c (sys_kill): Likewise.
(sys_rt_sigaction): Likewise.
* time.c (sprinttv): Likewise.
(sprint_timespec): Likewise.
(printitv_bitness): Likewise.
(tprint_timex): Likewise.
(printsigevent): Likewise.
* util.c (dumpiov): Likewise.
(umoven): Likewise.
(umovestr): Likewise.
* syscall.c: Initialize sysent to sysent0 etc.
Make current_personality, personality_wordsize[], set_personality()
conditional on SUPPORTED_PERSONALITIES > 1.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/syscall.c b/syscall.c
index 3f157b2..3ee4417 100644
--- a/syscall.c
+++ b/syscall.c
@@ -183,29 +183,25 @@
int qual_flags2[MAX_QUALS];
#endif
-const struct sysent *sysent;
-const char *const *errnoent;
-const char *const *signalent;
-const struct ioctlent *ioctlent;
-unsigned nsyscalls;
-unsigned nerrnos;
-unsigned nsignals;
-unsigned nioctlents;
-int *qual_flags;
+const struct sysent *sysent = sysent0;
+const char *const *errnoent = errnoent0;
+const char *const *signalent = signalent0;
+const struct ioctlent *ioctlent = ioctlent0;
+unsigned nsyscalls = nsyscalls0;
+unsigned nerrnos = nerrnos0;
+unsigned nsignals = nsignals0;
+unsigned nioctlents = nioctlents0;
+int *qual_flags = qual_flags0;
+#if SUPPORTED_PERSONALITIES > 1
int current_personality;
-#ifndef PERSONALITY0_WORDSIZE
-# define PERSONALITY0_WORDSIZE sizeof(long)
-#endif
const int personality_wordsize[SUPPORTED_PERSONALITIES] = {
PERSONALITY0_WORDSIZE,
-#if SUPPORTED_PERSONALITIES > 1
PERSONALITY1_WORDSIZE,
-#endif
-#if SUPPORTED_PERSONALITIES > 2
+# if SUPPORTED_PERSONALITIES > 2
PERSONALITY2_WORDSIZE,
-#endif
+# endif
};
void
@@ -224,7 +220,6 @@
qual_flags = qual_flags0;
break;
-#if SUPPORTED_PERSONALITIES >= 2
case 1:
errnoent = errnoent1;
nerrnos = nerrnos1;
@@ -236,9 +231,8 @@
nsignals = nsignals1;
qual_flags = qual_flags1;
break;
-#endif
-#if SUPPORTED_PERSONALITIES >= 3
+# if SUPPORTED_PERSONALITIES >= 3
case 2:
errnoent = errnoent2;
nerrnos = nerrnos2;
@@ -250,13 +244,12 @@
nsignals = nsignals2;
qual_flags = qual_flags2;
break;
-#endif
+# endif
}
current_personality = personality;
}
-#if SUPPORTED_PERSONALITIES > 1
static void
update_personality(struct tcb *tcp, int personality)
{
@@ -521,7 +514,7 @@
tcp->scno = SYS_socket_subcall + tcp->u_arg[0];
addr = tcp->u_arg[1];
tcp->u_nargs = sysent[tcp->scno].nargs;
- size = personality_wordsize[current_personality];
+ size = current_wordsize;
for (i = 0; i < tcp->u_nargs; ++i) {
if (size == sizeof(int)) {
unsigned int arg;
@@ -685,8 +678,7 @@
* other: error, trace_syscall() should print error indicator
* ("????" etc) and bail out.
*/
-static
-int
+static int
get_scno(struct tcb *tcp)
{
long scno = 0;
@@ -1682,7 +1674,7 @@
{
unsigned long int max = -(long int) nerrnos;
#if SUPPORTED_PERSONALITIES > 1
- if (personality_wordsize[current_personality] < sizeof(val)) {
+ if (current_wordsize < sizeof(val)) {
val = (unsigned int) val;
max = (unsigned int) max;
}