Add declare_object_symbol_alias for assembly codes (BZ #28128)

There are 2 problems in:

 #define declare_symbol_alias(symbol, original, type, size) \
  declare_symbol_alias_1 (symbol, original, type, size)
 #ifdef __ASSEMBLER__
 # define declare_symbol_alias_1(symbol, original, type, size) \
   strong_alias (original, symbol); \
   .type C_SYMBOL_NAME (symbol), %##type; \
   .size C_SYMBOL_NAME (symbol), size

1. .type and .size are substituted by arguments.
2. %##type is expanded to "% type" due to the GCC bug:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101613

But assembler doesn't support "% type".

Workaround BZ #28128 by

1. Don't define declare_symbol_alias for assembly codes.
2. Define declare_object_symbol_alias for assembly codes.

Reviewed-by: Fangrui Song <maskray@google.com>
This commit is contained in:
H.J. Lu 2022-04-06 10:06:37 -03:00 committed by Adhemerval Zanella
parent 9bcd12d223
commit 111254f3e1

View File

@ -324,14 +324,16 @@ for linking")
This is only necessary when defining something in assembly, or playing This is only necessary when defining something in assembly, or playing
funny alias games where the size should be other than what the compiler funny alias games where the size should be other than what the compiler
thinks it is. */ thinks it is. */
#define declare_symbol_alias(symbol, original, type, size) \
declare_symbol_alias_1 (symbol, original, type, size)
#ifdef __ASSEMBLER__ #ifdef __ASSEMBLER__
# define declare_symbol_alias_1(symbol, original, type, size) \ # define declare_object_symbol_alias(symbol, original, size) \
strong_alias (original, symbol); \ declare_object_symbol_alias_1 (symbol, original, size)
.type C_SYMBOL_NAME (symbol), %##type; \ # define declare_object_symbol_alias_1(symbol, original, s_size) \
.size C_SYMBOL_NAME (symbol), size strong_alias (original, symbol) ASM_LINE_SEP \
.type C_SYMBOL_NAME (symbol), %object ASM_LINE_SEP \
.size C_SYMBOL_NAME (symbol), s_size ASM_LINE_SEP
#else /* Not __ASSEMBLER__. */ #else /* Not __ASSEMBLER__. */
# define declare_symbol_alias(symbol, original, type, size) \
declare_symbol_alias_1 (symbol, original, type, size)
# define declare_symbol_alias_1(symbol, original, type, size) \ # define declare_symbol_alias_1(symbol, original, type, size) \
asm (".globl " __SYMBOL_PREFIX #symbol \ asm (".globl " __SYMBOL_PREFIX #symbol \
"\n\t" declare_symbol_alias_1_alias (symbol, original) \ "\n\t" declare_symbol_alias_1_alias (symbol, original) \