Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 727e8415 authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

ANDROID: HACK: init: ensure initcall ordering with LTO



With LTO, LLVM sorts initcalls in a single translation unit alphabetically
based on the name of the function (or actually, the variable stored in
the initcall section). Use __COUNTER__ in the variable name in an attempt
to preserve the intended order.

Bug: 62093296
Bug: 67506682
Change-Id: I4fa3cb93cba967a1440ac53328eb6b8ac649ff36
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
parent 0cdcef50
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -153,6 +153,15 @@ extern bool initcall_debug;

#ifndef __ASSEMBLY__

#ifdef CONFIG_LTO_CLANG
  /* prepend the variable name with __COUNTER__ to ensure correct ordering */
  #define ___initcall_name2(c, fn, id) 	__initcall_##c##_##fn##id
  #define ___initcall_name1(c, fn, id)	___initcall_name2(c, fn, id)
  #define __initcall_name(fn, id) 	___initcall_name1(__COUNTER__, fn, id)
#else
  #define __initcall_name(fn, id) 	__initcall_##fn##id
#endif

/*
 * initcalls are now grouped by functionality into separate
 * subsections. Ordering inside the subsections is determined
@@ -170,7 +179,7 @@ extern bool initcall_debug;
 */

#define __define_initcall(fn, id) \
	static initcall_t __initcall_##fn##id __used \
	static initcall_t __initcall_name(fn, id) __used \
	__attribute__((__section__(".initcall" #id ".init"))) = fn;

/*