This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libc_hidden_proto breaks things for PowerPC64


Roland McGarth writes:

> It seems reasonable enough to me to have a second pair of macros
> libc_hidden_data and libc_hidden_weak_data if some platforms really need
to
> make the distinction.  ...

Ok.

> I don't see anything in configure.in that would define
> HAVE_ASM_GLOBAL_DOT_NAME for powerpc64, so I presume you have that and
> other changes to make your port work.  You can send in the changes for
> libc-symbols.h and the data uses of libc_hidden_def along with the rest.

Yes all this will be in the (series of) patches that introduce PowerPC64
to glibc. I have attached the libc-symbols.h patch for your review
and comment. I hope to have the complete set patches out by EOD Monday.

> However, note that the data definitions are in C and the best way to make
> this stuff work is to fix the compiler support on your platform.  The
> compiler always knows the full details so as to emit the right things for
> whatever kind of symbol.

Unfortunately that would require changing the PowerPC64 ABI in addition to
binutils and gcc changes. This would take some time to work out and
delay the release of our 64-bit work for weeks if not months ...

*** libc23-cvstip-20020815/include/libc-symbols.h     Mon Aug  5 23:29:40
2002
--- libc23/include/libc-symbols.h   Fri Aug 16 13:28:02 2002
***************
*** 81,86 ****
  #endif

! #ifndef C_SYMBOL_DOT_NAME
! # define C_SYMBOL_DOT_NAME(name) .##name
  #endif

--- 81,93 ----
  #endif

! #ifdef HAVE_ASM_GLOBAL_DOT_NAME
! # ifndef C_SYMBOL_DOT_NAME
! #  if defined __GNUC__ && defined __GNUC_MINOR__ \
!       && (__GNUC__ << 16) + __GNUC_MINOR__ >= (3 << 16) + 1
! #   define C_SYMBOL_DOT_NAME(name) .name
! #  else
! #   define C_SYMBOL_DOT_NAME(name) .##name
! #  endif
! # endif
  #endif

***************
*** 110,116 ****
  #  define weak_extern(symbol) _weak_extern (symbol)
  #  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
! #   define _weak_extern(symbol) asm (".weakext " __SYMBOL_PREFIX
#symbol);
  #  else
! #   define _weak_extern(symbol)    asm (".weak " __SYMBOL_PREFIX
#symbol);
  #  endif

--- 117,135 ----
  #  define weak_extern(symbol) _weak_extern (symbol)
  #  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
! #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #    define _weak_extern(symbol) \
!         asm (".weakext " __SYMBOL_PREFIX #symbol "\n\t"   \
!          ".weakext ." __SYMBOL_PREFIX #symbol);
! #   else
! #    define _weak_extern(symbol) asm (".weakext " __SYMBOL_PREFIX
#symbol);
! #   endif
  #  else
! #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #    define _weak_extern(symbol) \
!         asm (".weak " __SYMBOL_PREFIX #symbol "\n\t"      \
!          ".weak ." __SYMBOL_PREFIX #symbol);
! #   else
! #    define _weak_extern(symbol) asm (".weak " __SYMBOL_PREFIX #symbol);
! #   endif
  #  endif

***************
*** 125,142 ****

  # ifdef HAVE_ASM_SET_DIRECTIVE
! #  define strong_alias(original, alias)       \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
    .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
  # else
  #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #   define strong_alias(original, alias)      \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
    C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
  #  else
! #   define strong_alias(original, alias)      \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
    C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
  #  endif
  # endif
--- 144,177 ----

  # ifdef HAVE_ASM_SET_DIRECTIVE
! #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #   define strong_alias(original, alias)                        \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP       \
!   .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original) ASM_LINE_SEP    \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP         \
!   .set C_SYMBOL_DOT_NAME (alias),C_SYMBOL_DOT_NAME (original)
! #   define strong_data_alias(original, alias)                   \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP       \
    .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
+ #  else
+ #   define strong_alias(original, alias)                        \
+   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP       \
+   .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
+ #   define strong_data_alias(original, alias) strong_alias(original,
alias)
+ #  endif
  # else
  #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #   define strong_alias(original, alias)                        \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP       \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP       \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP         \
    C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+ #   define strong_data_alias(original, alias)                   \
+   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP       \
+   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
  #  else
! #   define strong_alias(original, alias)                        \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP       \
    C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+ #   define strong_data_alias(original, alias) strong_alias(original,
alias)
  #  endif
  # endif
***************
*** 144,150 ****
  # ifdef HAVE_WEAK_SYMBOLS
  #  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
! #   define weak_alias(original, alias)  \
    .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
! #   define weak_extern(symbol)    \
    .weakext C_SYMBOL_NAME (symbol)

--- 179,191 ----
  # ifdef HAVE_WEAK_SYMBOLS
  #  ifdef HAVE_ASM_WEAKEXT_DIRECTIVE
! #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #    define weak_alias(original, alias)                         \
!   .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) ASM_LINE_SEP \
!   .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
! #   else
! #    define weak_alias(original, alias)                         \
    .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
! #   endif
! #   define weak_extern(symbol)                                  \
    .weakext C_SYMBOL_NAME (symbol)

***************
*** 152,167 ****

  #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #    define weak_alias(original, alias) \
!   .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP                \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
    C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
  #   else
! #    define weak_alias(original, alias) \
!   .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP    \
    C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
  #   endif

! #   define weak_extern(symbol)    \
    .weak C_SYMBOL_NAME (symbol)

--- 193,208 ----

  #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #    define weak_alias(original, alias)                         \
!   .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP                      \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP       \
!   .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP                        \
    C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
  #   else
! #    define weak_alias(original, alias)                         \
!   .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP                      \
    C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
  #   endif

! #   define weak_extern(symbol)                                  \
    .weak C_SYMBOL_NAME (symbol)

***************
*** 335,347 ****
       _default_symbol_version(real, name, version)
  # ifdef __ASSEMBLER__
! #  define _symbol_version(real, name, version) \
       .symver real, name##@##version
! #  define _default_symbol_version(real, name, version) \
       .symver real, name##@##@##version
  # else
! #  define _symbol_version(real, name, version) \
       __asm__ (".symver " #real "," #name "@" #version)
! #  define _default_symbol_version(real, name, version) \
       __asm__ (".symver " #real "," #name "@@" #version)
  # endif
  #else
--- 376,406 ----
       _default_symbol_version(real, name, version)
  # ifdef __ASSEMBLER__
! #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #   define _symbol_version(real, name, version) \
!      .symver real, name##@##version ASM_LINE_SEP                \
!      .symver .##real, .##name##@##version
! #   define _default_symbol_version(real, name, version) \
!      .symver real, name##@##@##version ASM_LINE_SEP             \
!      .symver .##real, .##name##@##@##version
! #  else
! #   define _symbol_version(real, name, version) \
       .symver real, name##@##version
! #   define _default_symbol_version(real, name, version) \
       .symver real, name##@##@##version
+ #  endif
  # else
! #  ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #   define _symbol_version(real, name, version) \
!      __asm__ (".symver " #real "," #name "@" #version "\n\t"    \
!           ".symver ." #real ",." #name "@" #version)
! #   define _default_symbol_version(real, name, version) \
!      __asm__ (".symver " #real "," #name "@@" #version "\n\t"   \
!           ".symver ." #real ",." #name "@@" #version)
! #  else
! #   define _symbol_version(real, name, version) \
       __asm__ (".symver " #real "," #name "@" #version)
! #   define _default_symbol_version(real, name, version) \
       __asm__ (".symver " #real "," #name "@@" #version)
+ #  endif
  # endif
  #else
***************
*** 410,413 ****
--- 469,487 ----
     libc_hidden_weak (foo)

+    Simularly for global data. If references to foo within libc.so should
+    always go to foo defined in libc.so, then in include/foo.h you add:
+
+    libc_hidden_proto (foo)
+
+    line and after foo's definition:
+
+    int foo = INITIAL_FOO_VALUE;
+    libc_hidden_data_def (foo)
+
+    or
+
+    int foo = INITIAL_FOO_VALUE;
+    libc_hidden_data_weak (foo)
+
     If foo is normally just an alias (strong or weak) of some other
function,
     you should use the normal strong_alias first, then add libc_hidden_def
***************
*** 462,476 ****
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
    .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
- #  else
  #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #    define __hidden_def1(original, alias)                \
!   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
!   C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
  #   else
! #    define __hidden_def1(original, alias)                \
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
    C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
  #   endif
  #  endif
--- 536,556 ----
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
    .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
  #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #     define __hidden_dot_def1(original, alias)      ASM_LINE_SEP     \
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
!   .set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
  #   else
! #     define __hidden_dot_def1(original, alias)
! #   endif
! #  else
! #   define __hidden_def1(original, alias)                 \
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \
    C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
+ #   ifdef HAVE_ASM_GLOBAL_DOT_NAME
+ #    define __hidden_dot_def1(original, alias)      ASM_LINE_SEP      \
+   ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
+   C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
+ #   else
+ #    define __hidden_def1(original, alias)
  #   endif
  #  endif
***************
*** 478,483 ****
--- 558,569 ----
  #  define __hidden_def3(...) __hidden_def2 (__VA_ARGS__)
  #  define hidden_def(name)                          \
+   __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name) \
+   __hidden_dot_def1 (__GI_##name, name)));
+ #  define hidden_data_def(name)                           \
    __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name)));
  #  define hidden_ver(local, name)                   \
+   __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name) \
+   __hidden_dot_def1 (local, __GI_##name)));
+ #  define hidden_data_ver(local, name)                    \
    __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name)));
  #  ifdef HAVE_WEAK_SYMBOLS
***************
*** 485,502 ****
  #    define __hidden_weak1(original, alias)               \
    .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
- #   else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
  #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #     define __hidden_weak1(original, alias)              \
    .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP                \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) ASM_LINE_SEP \
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
    C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
  #    else
! #     define __hidden_weak1(original, alias)              \
!   .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP                \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
  #    endif
  #   endif
  #   define hidden_weak(name)                              \
    __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name)));
  #  else
--- 571,596 ----
  #    define __hidden_weak1(original, alias)               \
    .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original)
  #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #     define __hidden_dot_weak1(original, alias)    ASM_LINE_SEP      \
!   .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original)
! #    else
! #     define __hidden_dot_weak1(original, alias)
! #    endif
! #   else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */
! #    define __hidden_weak1(original, alias)               \
    .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP                \
!   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
! #    ifdef HAVE_ASM_GLOBAL_DOT_NAME
! #     define __hidden_dot_weak1(original, alias)    ASM_LINE_SEP      \
    ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP   \
    C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original)
  #    else
! #     define __hidden_dot_weak1(original, alias)
  #    endif
  #   endif
  #   define hidden_weak(name)                              \
+   __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name) \
+   __hidden_dot_weak1 (__GI_##name, name)));
+ #   define hidden_data_weak(name)                         \
    __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name)));
  #  else
***************
*** 516,519 ****
--- 610,616 ----
  #  define hidden_weak(name) hidden_def (name)
  #  define hidden_ver(local, name) strong_alias (local, __GI_##name)
+ #  define hidden_data_def(name)   strong_data_alias (name, __GI_##name)
+ #  define hidden_data_weak(name)  hidden_data_def (name)
+ #  define hidden_data_ver(local, name) strong_data_alias (local,
__GI_##name)
  #  define HIDDEN_JUMPTARGET(name) __GI_##name
  # endif
***************
*** 527,530 ****
--- 624,630 ----
  # define hidden_def(name)
  # define hidden_ver(local, name)
+ # define hidden_data_weak(name)
+ # define hidden_data_def(name)
+ # define hidden_data_ver(local, name)
  #endif

***************
*** 534,537 ****
--- 634,640 ----
  # define libc_hidden_weak(name) hidden_weak (name)
  # define libc_hidden_ver(local, name) hidden_ver (local, name)
+ # define libc_hidden_data_def(name) hidden_data_def (name)
+ # define libc_hidden_data_weak(name) hidden_data_weak (name)
+ # define libc_hidden_data_ver(local, name) hidden_data_ver (local, name)
  #else
  # define libc_hidden_proto(name)
***************
*** 539,542 ****
--- 642,648 ----
  # define libc_hidden_weak(name)
  # define libc_hidden_ver(local, name)
+ # define libc_hidden_data_def(name)
+ # define libc_hidden_data_weak(name)
+ # define libc_hidden_data_ver(local, name)
  #endif

***************
*** 546,549 ****
--- 652,658 ----
  # define rtld_hidden_weak(name) hidden_weak (name)
  # define rtld_hidden_ver(local, name) hidden_ver (local, name)
+ # define rtld_hidden_data_def(name) hidden_data_def (name)
+ # define rtld_hidden_data_weak(name) hidden_data_weak (name)
+ # define rtld_hidden_data_ver(local, name) hidden_data_ver (local, name)
  #else
  # define rtld_hidden_proto(name)
***************
*** 551,554 ****
--- 660,666 ----
  # define rtld_hidden_weak(name)
  # define rtld_hidden_ver(local, name)
+ # define rtld_hidden_data_def(name)
+ # define rtld_hidden_data_weak(name)
+ # define rtld_hidden_data_ver(local, name)
  #endif

***************
*** 558,561 ****
--- 670,676 ----
  # define libm_hidden_weak(name) hidden_weak (name)
  # define libm_hidden_ver(local, name) hidden_ver (local, name)
+ # define libm_hidden_data_def(name) hidden_data_def (name)
+ # define libm_hidden_data_weak(name) hidden_data_weak (name)
+ # define libm_hidden_data_ver(local, name) hidden_data_ver (local, name)
  #else
  # define libm_hidden_proto(name)
***************
*** 563,566 ****
--- 678,684 ----
  # define libm_hidden_weak(name)
  # define libm_hidden_ver(local, name)
+ # define libm_hidden_data_def(name)
+ # define libm_hidden_data_weak(name)
+ # define libm_hidden_data_ver(local, name)
  #endif




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]