aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/s390/larl-1.c
blob: 5ef2ef63f82f06347b2f41d06d7eaf8261490d73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* Check if load-address-relative instructions are created */

/* { dg-do compile { target { s390*-*-* } } } */
/* { dg-options "-O2 -march=z10 -mzarch -fno-section-anchors" } */

/* An explicitely misaligned symbol.  This symbol is NOT aligned as
   mandated by our ABI.  However, the back-end needs to handle that in
   order to make things like __attribute__((packed)) work.  The symbol
   address is expected to be loaded from literal pool.  */
/* { dg-final { scan-assembler "lgrl\t%r2," { target { lp64 } } } } */
/* { dg-final { scan-assembler "lrl\t%r2," { target { ! lp64 } } } } */
extern char align1 __attribute__((aligned(1)));

/* { dg-final { scan-assembler "larl\t%r2,align2" } } */
extern char align2 __attribute__((aligned(2)));

/* { dg-final { scan-assembler "larl\t%r2,align4" } } */
extern char align4 __attribute__((aligned(4)));

/* An external char symbol without explicit alignment has a DECL_ALIGN
   of just 8. In contrast to local definitions DATA_ABI_ALIGNMENT is
   NOT applied to DECL_ALIGN in that case.  Make sure the backend
   still assumes this symbol to be aligned according to ABI
   requirements.  */
/* { dg-final { scan-assembler "larl\t%r2,align_default" } } */
extern char align_default;

char * foo1 () { return &align1; }
char * foo2 () { return &align2; }
char * foo3 () { return &align4; }
char * foo4 () { return &align_default; }