← Commit list

6f9442ff3

Denys Vlasenko
Denys Vlasenko
2018-01-28
SUCCESS Duration: 144s

Subject

ash: make it possible to disable "const global ptr" optimization

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash.c+16 -3
@@ -263,6 +263,19 @@ typedef long arith_t;
# error "Do not even bother, ash will not run on NOMMU machine"
#endif
+/* We use a trick to have more optimized code (fewer pointer reloads):
+ * ash.c: extern struct globals *const ash_ptr_to_globals;
+ * ash_ptr_hack.c: struct globals *ash_ptr_to_globals;
+ * This way, compiler in ash.c knows the pointer can not change.
+ *
+ * However, this may break on weird arches or toolchains. In this case,
+ * set "-DBB_GLOBAL_CONST=''" in CONFIG_EXTRA_CFLAGS to disable
+ * this optimization.
+ */
+#ifndef BB_GLOBAL_CONST
+# define BB_GLOBAL_CONST const
+#endif
+
/* ============ Hash table sizes. Configurable. */
@@ -400,7 +413,7 @@ struct globals_misc {
#endif
pid_t backgndpid; /* pid of last background process */
};
-extern struct globals_misc *const ash_ptr_to_globals_misc;
+extern struct globals_misc *BB_GLOBAL_CONST ash_ptr_to_globals_misc;
#define G_misc (*ash_ptr_to_globals_misc)
#define exitstatus (G_misc.exitstatus )
#define back_exitstatus (G_misc.back_exitstatus )
@@ -1473,7 +1486,7 @@ struct globals_memstack {
size_t g_stacknleft; // = MINSIZE;
struct stack_block stackbase;
};
-extern struct globals_memstack *const ash_ptr_to_globals_memstack;
+extern struct globals_memstack *BB_GLOBAL_CONST ash_ptr_to_globals_memstack;
#define G_memstack (*ash_ptr_to_globals_memstack)
#define g_stackp (G_memstack.g_stackp )
#define g_stacknxt (G_memstack.g_stacknxt )
@@ -2062,7 +2075,7 @@ struct globals_var {
int lineno;
char linenovar[sizeof("LINENO=") + sizeof(int)*3];
};
-extern struct globals_var *const ash_ptr_to_globals_var;
+extern struct globals_var *BB_GLOBAL_CONST ash_ptr_to_globals_var;
#define G_var (*ash_ptr_to_globals_var)
#define shellparam (G_var.shellparam )
//#define redirlist (G_var.redirlist )