Solaris 64-bit Developer's Guide

Appendix A Changes in Derived Types

The default 32-bit compilation environment is identical to historical Solaris operating environment releases with respect to derived types and their sizes. In the 64-bit compilation environment, some changes in derived types are necessary. These changed derived types are highlighted in the tables that follow.

Notice that although the 32-bit and 64-bit compilation environments differ, the same set of headers is used for both, with the appropriate definitions determined by the compilation options. To better understand the options available to the applications developer, it helps to understand the _ILP32 and _LP64 feature test macros.

Table A–1 Feature Test Macros

Feature Test Macro 

Description 

_ILP32

The _ILP32 feature test macro is used to specify the ILP32 data model where ints, longs and pointers are 32-bit quantities. By itself, the use of this macro makes visible those derived types and sizes identical to historical Solaris implementations. This is the default compilation environment when building 32-bit applications. It ensures complete binary and source compatibility for both C and C++ applications.

_LP64

The _LP64 feature test macro is used to specify the _LP64 data model where ints are 32 bit quantities and longs and pointers are 64 bit quantities. _LP64 is defined by default when compiling in 64–bit mode. Other than making sure that either <sys/types.h> or <sys/feature_tests.h> is included in source in order to make visible the _LP64 definition, the developer needs to do nothing else.

The following examples illustrate the use of feature test macros so that the correct definitions are visible, depending on the compilation environment.


Example A–1 size_t Defined in _LP64

#if defined(_LP64)
typedef ulong_t size_t;   /* size of something in bytes */
#else
typedef uint_t size_t;    /* (historical version) */
#endif

When building a 64-bit application with the definition in this example, size_t is a ulong_t, or unsigned long, which is a 64-bit quantity in the LP64 model. In contrast, when building a 32-bit application, size_t is defined as an uint_t, or unsigned int, a 32-bit quantity in either in the ILP32 or the LP64 models.


Example A–2 uid_t Defined in _LP64

#if defined(_LP64)
typedef int     uid_t;          /* UID type             */
#else
typedef long    uid_t;          /* (historical version) */
#endif

In either of these examples, the same end result would have been obtained had the ILP32 type representation been identical to the LP64 type representation. For example, if in the 32-bit application environment, size_t was changed to a ulong_t, or uid_t was changed to an int, these would still represent 32-bit quantities. However, retaining the historical type representation ensures consistency within 32-bit C and C++ applications, as well as complete binary and source compatibility with prior releases of the Solaris operating environment.

Table A–2 lists the derived types that have changed. Notice that the types listed under the _ILP32 feature test macro match those in Solaris 2.6, before 64–bit support was added to the Solaris software. When building a 32-bit application, the derived types available to the developer match those in the _ILP32 column. When building a 64-bit application, the derived types match those listed in the _LP64 column. All of these types are defined in <sys/types.h>, with the exception of the wchar_t and wint_t types, which are defined in <wchar.h>.

When reviewing these tables, remember that in the 32-bit environment, ints, longs, and pointers are 32-bit quantities. In the 64-bit environment, ints are 32-bit quantities while longs and pointers are 64-bit quantities.

Table A–2 Changed Derived Types — General

Derived Types 

Solaris 2.6 

_ILP32

_LP64

blkcnt_t

longlong_t

longlong_t

long

id_t

long

long

int

major_t

ulong_t

ulong_t

uint_t

minor_t

ulong_t

ulong_t

uint_t

mode_t

ulong_t

ulong_t

uint_t

nlink_t

ulong_t

ulong_t

uint_t

paddr_t

ulong_t

ulong_t

not defined

pid_t

long

long

int

ptrdiff_t

int

int

long

size_t

uint_t

uint_t

ulong_t

ssize_t

int

int

long

uid_t

long

long

int

wchar_t

long

long

int

wint_t

long

long

int

Table A–3 lists the derived types specific to the Large Files compilation environment. These types are only defined if the feature test macro _LARGEFILE64_SOURCE is defined. Notice that the ILP32 compilation environment has been preserved with the previous Solaris 2.6 release.

Table A–3 Changed Derived Types — Large File Specific

Derived Types 

Solaris 2.6 

_ILP32

_LP64

blkcnt64_t

longlong_t

longlong_t

blkcnt_t

fsblkcnt64_t

u_longlong_t

u_longlong_t

blkcnt_t

fsfilcnt64_t

u_longlong_t

u_longlong_t

fsfilcnt_t

ino64_t

u_longlong_t

u_longlong_t

ino_t

off64_t

longlong_t

longlong_t

off_t

Table A–4 lists the changed derived types with respect to the value of _FILE_OFFSET_BITS. You cannot compile an application with both _LP64 defined and _FILE_OFFSET_BITS==32. By default, if _LP64 is defined, then _FILE_OFFSET_BITS==64. If _ILP32 is defined, and _FILE_OFFSET_BITS is not defined, then by default, _FILE_OFFSET_BITS==32. These rules are defined in the <sys/feature_tests.h> header file.

Table A–4 Changed Derived Types — FILE_OFFSET_BITS Value

Derived Types 

_ILP32 _FILE_ OFFSET_BITS ==32

_ILP32 _FILE_ OFFSET_BITS ==64

_LP64 _FILE_ OFFSET_BITS==64

ino_t

ulong_t

u_longlong_t

ulong_t

blkcnt_t

long

longlong_t

long

fsblkcnt_t

ulong_t

u_longlong_t

ulong_t

fsfilcnt_t

ulong_t

u_longlong_t

ulong_t

off_t

long

longlong_t

long