Difference between revisions of "Porting/Macros"

From RCS Wiki
Jump to navigation Jump to search
(C/C++ preprocessor macros for PPC64 porting)
 
(2 intermediate revisions by the same user not shown)
Line 31: Line 31:
 
<pre>__PPC__, __powerpc__, __PPC64__ and __powerpc64__</pre> [https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/rs6000/linux64.h;h=98b7255c95f1b55ec5c97726cfcb9dc6fb9ebf56;hb=HEAD#l293 gcc/config/rs6000/linux64.h]
 
<pre>__PPC__, __powerpc__, __PPC64__ and __powerpc64__</pre> [https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/rs6000/linux64.h;h=98b7255c95f1b55ec5c97726cfcb9dc6fb9ebf56;hb=HEAD#l293 gcc/config/rs6000/linux64.h]
  
Example from Debian ppc64le packages:
+
''Example from Debian ppc64le package: libtbb-dev, version 2020.3-1, /usr/include/tbb/machine/gcc_arm.h:''
 
 
''libtbb-dev, version 2020.3-1, /usr/include/tbb/machine/gcc_arm.h:''
 
  
 
<pre>
 
<pre>
Line 45: Line 43:
 
</pre>
 
</pre>
  
''Example from GCC/libstdc++-v3 source code:''
+
''Example from GCC/libstdc++-v3 source code: libstdc++-v3/src/c++17/fast_float/fast_float.h''
  
 
<pre>
 
<pre>
Line 54: Line 52:
  
 
That refers to "ppc64le" variants, but those are not canonical.  It's better to check endianess separately.
 
That refers to "ppc64le" variants, but those are not canonical.  It's better to check endianess separately.
 +
 +
[[Category:Ports]]

Latest revision as of 10:54, 14 September 2023

Some projects have been ported to Apple ppc64. In that case, they may test macros like this:

#if defined(__ppc64__)
#endif

GCC does not define __ppc64__ (lowercase). It defines __PPC64__ (uppercase). To make the above code also build on Debian ppc64le or ppc64 (big endian) change the above code to:

#if defined(__ppc64__) || defined(__PPC64__)
#endif

Details discussed on #talos-workstation:

Apple's gcc (4.0.1) in MacOS 10.5, ppc32 headers define:

__POWERPC__ and __ppc__

with -m64, the following are defined:

__POWERPC__, __ppc__, and __ppc64__

GCC compiling for the Linux kernel defines, for ppc32:

__PPC__ and __powerpc__

gcc/config/rs6000/linux.h

and for ppc64:

__PPC__, __powerpc__, __PPC64__ and __powerpc64__

gcc/config/rs6000/linux64.h

Example from Debian ppc64le package: libtbb-dev, version 2020.3-1, /usr/include/tbb/machine/gcc_arm.h:

#if __powerpc64__ || __ppc64__
    // IBM XL documents __powerpc64__ (and __PPC64__).
    // Apple documents __ppc64__ (with __ppc__ only on 32-bit).
    #define __TBB_WORDSIZE 8
#else
    #define __TBB_WORDSIZE 4
#endif

Example from GCC/libstdc++-v3 source code: libstdc++-v3/src/c++17/fast_float/fast_float.h

[...] || (defined(__ppc64__) || defined(__PPC64__) || defined(__ppc64le__) || defined(__PPC64LE__)) )

libstdc++-v3 fast_float.h

That refers to "ppc64le" variants, but those are not canonical. It's better to check endianess separately.