1; TODO: Add object generation test when visibility for object generation
2;       is implemnted.
3
4; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
5; RUN:     -mattr=-altivec -data-sections=false -xcoff-traceback-table=false < %s | \
6; RUN:   FileCheck --check-prefix=ASM %s
7; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
8; RUN:     -mattr=-altivec -data-sections=false -xcoff-traceback-table=false < %s | \
9; RUN:   FileCheck --check-prefix=ASM %s
10
11@var = global i32 42
12@var1 = alias i32, i32* @var
13@var2 = alias i32, i32* @var1
14@var_l = linkonce_odr alias i32, i32* @var
15@var_i = internal alias i32, i32* @var
16@var_h = hidden alias i32, i32* @var
17@var_p = protected alias i32, i32* @var
18
19@array = global [2 x i32] [i32 1, i32 2], align 4
20@x = global i32* bitcast (i8* getelementptr (i8, i8* bitcast ([2 x i32]* @array to i8*), i64 4) to i32*), align 4
21@bitcast_alias = alias i32*, i32** @x
22
23define i32 @fun() {
24  ret i32 0
25}
26
27%FunTy = type i32()
28@fun_weak = weak alias %FunTy, %FunTy* @fun
29@fun_hidden = hidden alias %FunTy, %FunTy* @fun
30@fun_ptr = global i32()* @fun_weak
31
32define i32 @test() {
33entry:
34   %tmp = load i32, i32* @var1
35   %tmp1 = load i32, i32* @var2
36   %tmp0 = load i32, i32* @var_i
37   %tmp2 = call i32 @fun()
38   %tmp3 = add i32 %tmp, %tmp2
39   %tmp4 = call i32 @fun_weak()
40   %tmp5 = add i32 %tmp3, %tmp4
41   %tmp6 = add i32 %tmp1, %tmp5
42   %tmp7 = add i32 %tmp6, %tmp0
43   %fun_ptr1 = alloca i32 ()*
44   store i32 ()* @fun_weak, i32 ()** %fun_ptr1
45   %callee.knr.cast = bitcast i32 ()** %fun_ptr1 to i32 ()*
46   %tmp8 = call i32 %callee.knr.cast()
47   %tmp9 = call i32 @fun_hidden()
48   %tmp10 = add i32 %tmp7, %tmp8
49   %tmp11 = add i32 %tmp10, %tmp9
50   ret i32 %tmp11
51}
52
53; ASM:         .globl  fun[DS]
54; ASM-NEXT:    .globl  .fun
55; ASM-NEXT:    .align  4
56; ASM-NEXT:    .csect fun[DS]
57; ASM-NEXT:  fun_weak:                               # @fun
58; ASM-NEXT:  fun_hidden:
59; ASM:         .csect .text[PR],5
60; ASM-NEXT:  .fun:
61; ASM-NEXT:  .fun_weak:
62; ASM-NEXT:  .fun_hidden:
63; ASM-NEXT:  # %bb.0:
64; ASM-NEXT:    li 3, 0
65; ASM-NEXT:    blr
66; ASM-NEXT:                                          # -- End function
67; ASM:       .csect .text[PR],5
68; ASM-NEXT:  .test:
69; ASM-NEXT:  # %bb.0:                                # %entry
70; ASM:         bl .fun
71; ASM-NEXT:    nop
72; ASM:         bl .fun_weak
73; ASM-NEXT:    nop
74; ASM:         bl .fun_hidden
75; ASM:                                               # -- End function
76; ASM-NEXT:    .csect .data[RW]
77; ASM-NEXT:    .globl  var
78; ASM-NEXT:    .globl  var1
79; ASM-NEXT:    .globl  var2
80; ASM-NEXT:    .weak   var_l
81; ASM-NEXT:    .lglobl var_i
82; ASM-NEXT:    .globl  var_h,hidden
83; ASM-NEXT:    .globl  var_p,protected
84; ASM:       var:
85; ASM-NEXT:  var1:
86; ASM-NEXT:  var2:
87; ASM-NEXT:  var_l:
88; ASM-NEXT:  var_i:
89; ASM-NEXT:  var_h:
90; ASM-NEXT:  var_p:
91; ASM-NEXT:    .vbyte  4, 42
92; ASM-NEXT:    .globl array
93; ASM:       array:
94; ASM-NEXT:    .vbyte 4, 1 # 0x1
95; ASM-NEXT:    .vbyte 4, 2 # 0x2
96; ASM-NEXT:    .globl x
97; ASM-NEXT:    .globl  bitcast_alias
98; ASM:       x:
99; ASM-NEXT:  bitcast_alias:
100; ASM-NEXT:    .vbyte  {{[0-9]+}}, array+4
101; ASM-NEXT:    .globl  fun_ptr
102; ASM:       fun_ptr:
103; ASM-NEXT:    .vbyte  {{[0-9]+}}, fun_weak
104; ASM-NEXT:    .weak fun_weak
105; ASM-NEXT:    .weak .fun_weak
106; ASM-NEXT:    .globl  fun_hidden,hidden
107; ASM-NEXT:    .globl  .fun_hidden,hidden
108; ASM-NEXT:    .toc
109; ASM-NEXT:  L..C0:
110; ASM-NEXT:    .tc var1[TC],var1
111; ASM-NEXT:  L..C1:
112; ASM-NEXT:    .tc var2[TC],var2
113; ASM-NEXT:  L..C2:
114; ASM-NEXT:    .tc var_i[TC],var_i
115; ASM-NEXT:  L..C3:
116; ASM-NEXT:    .tc fun_weak[TC],fun_weak
117