diff options
author | Laurent Vivier <laurent@vivier.eu> | 2011-02-13 23:37:34 +0100 |
---|---|---|
committer | Riku Voipio <riku.voipio@nokia.com> | 2011-02-17 11:46:34 +0200 |
commit | c2e3dee6e03527baf8698698cce76b1a3174969a (patch) | |
tree | 40bea1193141b00fba2e0e7827932a9a0861a2f5 | |
parent | 3b6edd1611e25099a1df20771ce3f88939a0e93a (diff) |
linux-user: Define target alignment size
Datatype alignment can be found using following application:
int main(void)
{
printf("alignof(short) %ld\n", __alignof__(short));
printf("alignof(int) %ld\n", __alignof__(int));
printf("alignof(long) %ld\n", __alignof__(long));
printf("alignof(long long) %ld\n", __alignof__(long long));
}
This patch includes following alignments:
i386
alignof(short) 2
alignof(int) 4
alignof(long) 4
alignof(long long) 8
x86_64
alignof(short) 2
alignof(int) 4
alignof(long) 8
alignof(long long) 8
arm
alignof(short) 2
alignof(int) 4
alignof(long) 4
alignof(long long) 4
m68k (680x0)
alignof(short) 2
alignof(int) 2
alignof(long) 2
alignof(long long) 2
mips
alignof(short) 2
alignof(int) 4
alignof(long) 4
alignof(long long) 8
ppc
alignof(short) 2
alignof(int) 4
alignof(long) 4
alignof(long long) 8
for other targets, use by default (2,4,4,8).
Please, update for your favorite target...
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Signed-off-by: Riku Voipio <riku.voipio@nokia.com>
-rwxr-xr-x | configure | 17 | ||||
-rw-r--r-- | cpu-defs.h | 14 |
2 files changed, 27 insertions, 4 deletions
@@ -2962,6 +2962,10 @@ target_nptl="no" interp_prefix1=`echo "$interp_prefix" | sed "s/%M/$target_arch2/g"` echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak gdb_xml_files="" +target_short_alignment=2 +target_int_alignment=4 +target_long_alignment=4 +target_llong_alignment=8 TARGET_ARCH="$target_arch2" TARGET_BASE_ARCH="" @@ -2974,9 +2978,11 @@ case "$target_arch2" in x86_64) TARGET_BASE_ARCH=i386 target_phys_bits=64 + target_long_alignment=8 ;; alpha) target_phys_bits=64 + target_long_alignment=8 target_nptl="yes" ;; arm|armeb) @@ -2985,6 +2991,7 @@ case "$target_arch2" in target_nptl="yes" gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml" target_phys_bits=32 + target_llong_alignment=4 ;; cris) target_nptl="yes" @@ -2994,6 +3001,9 @@ case "$target_arch2" in bflt="yes" gdb_xml_files="cf-core.xml cf-fp.xml" target_phys_bits=32 + target_int_alignment=2 + target_long_alignment=2 + target_llong_alignment=2 ;; microblaze) bflt="yes" @@ -3017,6 +3027,7 @@ case "$target_arch2" in TARGET_BASE_ARCH=mips echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak target_phys_bits=64 + target_long_alignment=8 ;; ppc) gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml" @@ -3035,6 +3046,7 @@ case "$target_arch2" in TARGET_ABI_DIR=ppc gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml" target_phys_bits=64 + target_long_alignment=8 ;; ppc64abi32) TARGET_ARCH=ppc64 @@ -3056,6 +3068,7 @@ case "$target_arch2" in sparc64) TARGET_BASE_ARCH=sparc target_phys_bits=64 + target_long_alignment=8 ;; sparc32plus) TARGET_ARCH=sparc64 @@ -3072,6 +3085,10 @@ case "$target_arch2" in exit 1 ;; esac +echo "TARGET_SHORT_ALIGNMENT=$target_short_alignment" >> $config_target_mak +echo "TARGET_INT_ALIGNMENT=$target_int_alignment" >> $config_target_mak +echo "TARGET_LONG_ALIGNMENT=$target_long_alignment" >> $config_target_mak +echo "TARGET_LLONG_ALIGNMENT=$target_llong_alignment" >> $config_target_mak echo "TARGET_ARCH=$TARGET_ARCH" >> $config_target_mak target_arch_name="`echo $TARGET_ARCH | tr '[:lower:]' '[:upper:]'`" echo "TARGET_$target_arch_name=y" >> $config_target_mak diff --git a/cpu-defs.h b/cpu-defs.h index db809ed465..2b59fa6fb0 100644 --- a/cpu-defs.h +++ b/cpu-defs.h @@ -37,16 +37,22 @@ #define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8) +typedef int16_t target_short __attribute__ ((aligned(TARGET_SHORT_ALIGNMENT))); +typedef uint16_t target_ushort __attribute__((aligned(TARGET_SHORT_ALIGNMENT))); +typedef int32_t target_int __attribute__((aligned(TARGET_INT_ALIGNMENT))); +typedef uint32_t target_uint __attribute__((aligned(TARGET_INT_ALIGNMENT))); +typedef int64_t target_llong __attribute__((aligned(TARGET_LLONG_ALIGNMENT))); +typedef uint64_t target_ullong __attribute__((aligned(TARGET_LLONG_ALIGNMENT))); /* target_ulong is the type of a virtual address */ #if TARGET_LONG_SIZE == 4 -typedef int32_t target_long; -typedef uint32_t target_ulong; +typedef int32_t target_long __attribute__((aligned(TARGET_LONG_ALIGNMENT))); +typedef uint32_t target_ulong __attribute__((aligned(TARGET_LONG_ALIGNMENT))); #define TARGET_FMT_lx "%08x" #define TARGET_FMT_ld "%d" #define TARGET_FMT_lu "%u" #elif TARGET_LONG_SIZE == 8 -typedef int64_t target_long; -typedef uint64_t target_ulong; +typedef int64_t target_long __attribute__((aligned(TARGET_LONG_ALIGNMENT))); +typedef uint64_t target_ulong __attribute__((aligned(TARGET_LONG_ALIGNMENT))); #define TARGET_FMT_lx "%016" PRIx64 #define TARGET_FMT_ld "%" PRId64 #define TARGET_FMT_lu "%" PRIu64 |