aboutsummaryrefslogtreecommitdiff
path: root/test/NaCl/Bitcode/globalvars.ll
blob: 3bd9890aa8285ea9726bd379d29d0c4e3be454dd (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
; RUN: llvm-as < %s | pnacl-freeze | pnacl-thaw | llvm-dis - | FileCheck %s
; RUN: llvm-as < %s | pnacl-freeze | pnacl-bcanalyzer -dump-records \
; RUN:              | FileCheck %s -check-prefix=BC

; Test that we generate appropriate bitcode values for global variables.

; Make sure that no struct/array/pointer types are generated by the
; global variables.
; BC: <TYPE_BLOCK_ID
; BC-NEXT: <NUMENTRY
; BC-NEXT: <VOID/>
; BC-NEXT: <FUNCTION
; BC-NEXT: </TYPE_BLOCK_ID>

; Make sure that the function declaration for function func (below)
; appears before the global variables block.
; BC: <FUNCTION op0=1 op1=0 op2=0 op3=0/>

; Make sure we begin the globals block after function declarations.
; BC-NEXT: <GLOBALVAR_BLOCK
; BC-NEXT: <COUNT op0=15/>

@bytes = internal global [7 x i8] c"abcdefg"
; CHECK: @bytes = internal global [7 x i8] c"abcdefg"
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <DATA op0=97 op1=98 op2=99 op3=100 op4=101 op5=102 op6=103/>


@ptr_to_ptr = internal global i32 ptrtoint (i32* @ptr to i32)
; CHECK: @ptr_to_ptr = internal global i32 ptrtoint (i32* @ptr to i32)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=5/>

@ptr_to_func = internal global i32 ptrtoint (void ()* @func to i32)
; CHECK: @ptr_to_func = internal global i32 ptrtoint (void ()* @func to i32)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=0/>

@compound = internal global <{ [3 x i8], i32 }> <{ [3 x i8] c"foo", i32 ptrtoint (void ()* @func to i32) }>
; CHECK: @compound = internal global <{ [3 x i8], i32 }> <{ [3 x i8] c"foo", i32 ptrtoint (void ()* @func to i32) }>
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <COMPOUND op0=2/>
; BC-NEXT: <DATA op0=102 op1=111 op2=111/>
; BC-NEXT: <RELOC op0=0/>

@ptr = internal global i32 ptrtoint ([7 x i8]* @bytes to i32)
; CHECK: @ptr = internal global i32 ptrtoint ([7 x i8]* @bytes to i32)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=1/>

@addend_ptr = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 1)
; CHECK: @addend_ptr = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 1)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=5 op1=1/>

@addend_negative = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 -1)
; CHECK: @addend_negative = internal global i32 add (i32 ptrtoint (i32* @ptr to i32), i32 -1)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=5 op1=4294967295/>

@addend_array1 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 1)
; CHECK: @addend_array1 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 1)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=1 op1=1/>

@addend_array2 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 7)
; CHECK: @addend_array2 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 7)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=1 op1=7/>

@addend_array3 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 9)
; CHECK: @addend_array3 = internal global i32 add (i32 ptrtoint ([7 x i8]* @bytes to i32), i32 9)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=1 op1=9/>

@addend_struct1 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 1)
; CHECK: @addend_struct1 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 1)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=4 op1=1/>

@addend_struct2 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 4)
; CHECK: @addend_struct2 = internal global i32 add (i32 ptrtoint (<{ [3 x i8], i32 }>* @compound to i32), i32 4)
; BC-NEXT: <VAR op0=0 op1=0/>
; BC-NEXT: <RELOC op0=4 op1=4/>

@ptr_to_func_align = internal global i32 ptrtoint (void ()* @func to i32), align 8
; CHECK: @ptr_to_func_align = internal global i32 ptrtoint (void ()* @func to i32), align 8
; BC-NEXT: <VAR op0=4 op1=0/>
; BC-NEXT: <RELOC op0=0/>

@char = internal constant [1 x i8] c"0"
; CHECK: @char = internal constant [1 x i8] c"0"
; BC-NEXT: <VAR op0=0 op1=1/>
; BC-NEXT: <DATA op0=48/>

@short = internal constant [2 x i8] zeroinitializer
; CHECK: @short = internal constant [2 x i8] zeroinitializer
; BC-NEXT:  <VAR op0=0 op1=1/>
; BC-NEXT:  <ZEROFILL op0=2/>

; BC-NEXT: </GLOBALVAR_BLOCK>

define void @func() {
  ret void
}