__libc_start_main: slightly simplify stage2 pointer setup
authorAlexander Monakov <amonakov@ispras.ru>
Sat, 20 Oct 2018 21:27:44 +0000 (00:27 +0300)
committerRich Felker <dalias@aerifal.cx>
Fri, 2 Nov 2018 16:13:53 +0000 (12:13 -0400)
Use "+r" in the asm instead of implementing a non-transparent copy by
applying "0" constraint to the source value. Introduce a typedef for
the function type to avoid spelling it out twice.

src/env/__libc_start_main.c

index b4965d7..7c95f82 100644 (file)
@@ -66,7 +66,8 @@ static void libc_start_init(void)
 
 weak_alias(libc_start_init, __libc_start_init);
 
-static int libc_start_main_stage2(int (*)(int,char **,char **), int, char **);
+typedef int lsm2_fn(int (*)(int,char **,char **), int, char **);
+static lsm2_fn libc_start_main_stage2;
 
 int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
 {
@@ -79,8 +80,8 @@ int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv)
 
        /* Barrier against hoisting application code or anything using ssp
         * or thread pointer prior to its initialization above. */
-       int (*stage2)(int (*)(int,char **,char **), int, char **);
-       __asm__ ( "" : "=r"(stage2) : "0"(libc_start_main_stage2) : "memory" );
+       lsm2_fn *stage2 = libc_start_main_stage2;
+       __asm__ ( "" : "+r"(stage2) : : "memory" );
        return stage2(main, argc, argv);
 }