Differences between revisions 36 and 37
Revision 36 as of 2009-09-13 16:52:56
Size: 4462
Editor: BastianBlank
Comment:
Revision 37 as of 2009-09-13 19:53:28
Size: 4546
Editor: BastianBlank
Comment:
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
||feature ||alpha ||[[DebianAMD64|amd64]], kfreebsd-amd64 ||arm ||[[ArmEabiPort|armel]] ||hppa ||[[i386]], kfreebsd-i386, hurd-i386 ||ia64 ||[[M68k|m68k]] ||[[MIPSPort|mips]] ||[[MIPSPort|mipsel]] ||[[PowerPC|powerpc]] ||s390 ||[[PortsSparc|sparc]] || ||'''feature''' ||'''alpha''' ||'''[[DebianAMD64|amd64]], kfreebsd-amd64''' ||'''arm''' ||'''[[ArmEabiPort|armel]]''' ||'''hppa''' ||'''[[i386]], kfreebsd-i386, hurd-i386''' ||'''ia64''' ||'''[[M68k|m68k]]''' ||['''[MIPSPort|mips]]''' ||'''[[MIPSPort|mipsel]]''' ||'''[[PowerPC|powerpc]]''' ||'''s390''' ||'''[[PortsSparc|sparc]]''' ||

This page is a draft. Please help enhancing it by adding lines and filling tables. Comments at the bottom of the text are also welcome.

This is just a quick array to recall some of the specifics of the architectures found in the Debian project.

feature

alpha

amd64, kfreebsd-amd64

arm

armel

hppa

i386, kfreebsd-i386, hurd-i386

ia64

m68k

[[MIPSPort|mips]]

mipsel

powerpc

s390

sparc

size of short

2

2

2

2

2

2

2

2

2

2

2

2

2

size of int

4

4

4

4

4

4

4

4

4

4

4

4

4

size of long

8

8

4

4

4

4

8

4

4

4

4

4

4

size of long long

8

8

8

8

8

8

8

8

8

8

8

8

8

size of float

4

4

4

4

4

4

4

4

4

4

4

4

4

size of double

8

8

8

8

8

8

8

8

8

8

8

8

8

size of long double

16 (8)

16

8

8

8

12

16

12

8

8

16 (8)

16 (8)

16 (8)

size of data pointer

8

8

4

4

4

4

8

4

4

4

4

4

4

max alignment

8

8

4

8

?

4 (16)

8

?

8

8

?

?

?

unaligned access OK

no

yes

yes

yes

no

yes

no

yes

no

no

yes

yes

no

endianness

little

little

little

little

big

little

little

big

big

little

big

big

big

char signedness

s

s

u

u

s

s

s

s

s

s

u

u

s

stack grows

down

down

down

down

up

down

down

down

down

down

down

?

down

func param location

regs

regs

regs

regs

?

stack

regs

stack

regs

regs

regs

regs

regs

func return ptr location

reg

stack

reg

reg

?

stack

reg

stack

reg

reg

reg

?

reg

page size(s)

8K

4K, 2M

4K

4K

?

4K, 2M/4M

?

4K

4K-64K

4K-64K

?

4K

?

C/C++ Preprocessor Symbols

Generally, GNU C tends to define the symbol

__arch__

A list of some common arch-specific symbols can be found on the Pre-defined Architecture Macros page.

Signedness

When programming in C, variables can be signed or unsigned.

Example:

unsigned char c;

explicit unsigned, 0 <= c <= 255

signed char c;

explicit signed, -128 <= c <= 127

char c;

implicit (un)signedness, depending on architecture

To force a signedness, either declare it explicitly or use the gcc command line option -f(un)signed-char. The gcc defaults differ only due to optimisation. Other compilers may not have this issue.

Obtaining this information

via a special tool

#include <endian.h>
#include <stddef.h>
#include <stdio.h>

static void test_size_align(const char *name, size_t size, size_t align) {
  printf("sizeof(%s) = %zd\n", name, size);
  if (size == align) printf("alignment(%s) = natural\n", name);
  else printf("alignment(%s) = %zd\n", name, align);
}

#define TEST_SIZE_ALIGN(type, name) \
  struct test_align_##name { char a; type b; }; \
  test_size_align(#type, sizeof(type), offsetof(struct test_align_##name, b))

static void test_endian(void) {
#if __BYTE_ORDER == __LITTLE_ENDIAN
  printf("byte order = little endian\n");
#elif __BYTE_ORDER == __BIG_ENDIAN
  printf("byte order = big endian\n");
#endif
}

static void test_char(void) {
  if ((int)(char)-1 == -1) printf("char signedness = signed\n");
  else if ((int)(char)-1 == 255) printf("char signedness = unsigned\n");
}

int main(void) {
  TEST_SIZE_ALIGN(short, short);
  TEST_SIZE_ALIGN(int, int);
  TEST_SIZE_ALIGN(long, long);
  TEST_SIZE_ALIGN(long long, long_long);
  TEST_SIZE_ALIGN(float, float);
  TEST_SIZE_ALIGN(double, double);
  TEST_SIZE_ALIGN(long double, long_double);
  TEST_SIZE_ALIGN(void *, pointer);
  test_endian();
  test_char();
}

via autoconf

AC_INIT(archtest, 0.1)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)
AC_CHECK_SIZEOF(float)
AC_CHECK_SIZEOF(double)
AC_CHECK_SIZEOF(long double)
AC_CHECK_SIZEOF(void*)
AC_C_BIGENDIAN()
AC_C_CHAR_UNSIGNED()