154d9f743SYonghong Song; RUN: opt -O2 %s | llvm-dis > %t1
254d9f743SYonghong Song; RUN: llc -filetype=asm -o - %t1 | FileCheck -check-prefixes=CHECK %s
354d9f743SYonghong Song; RUN: llc -mattr=+alu32 -filetype=asm -o - %t1 | FileCheck -check-prefixes=CHECK %s
4d3d88d08SYonghong Song; Source code:
5d3d88d08SYonghong Song;   struct net_device {
6d3d88d08SYonghong Song;     int dev_id;
7d3d88d08SYonghong Song;     int others;
8d3d88d08SYonghong Song;   };
9d3d88d08SYonghong Song;   struct sk_buff {
10d3d88d08SYonghong Song;     int i;
11d3d88d08SYonghong Song;     struct net_device dev[10];
12d3d88d08SYonghong Song;   };
13d3d88d08SYonghong Song;   #define _(x) (__builtin_preserve_access_index(x))
14d3d88d08SYonghong Song;   static int (*bpf_probe_read)(void *dst, int size, void *unsafe_ptr)
15d3d88d08SYonghong Song;       = (void *) 4;
16d3d88d08SYonghong Song;
17d3d88d08SYonghong Song;   int bpf_prog(struct sk_buff *ctx) {
18d3d88d08SYonghong Song;     int dev_id;
19d3d88d08SYonghong Song;     bpf_probe_read(&dev_id, sizeof(int), _(&ctx->dev[5].dev_id));
20d3d88d08SYonghong Song;     return dev_id;
21d3d88d08SYonghong Song;   }
22d3d88d08SYonghong Song; Compilation flag:
2354d9f743SYonghong Song;   clang -target bpf -O2 -g -S -emit-llvm -Xclang -disable-llvm-passes test.c
2454d9f743SYonghong Song
2554d9f743SYonghong Songtarget triple = "bpf"
26d3d88d08SYonghong Song
27d3d88d08SYonghong Song%struct.sk_buff = type { i32, [10 x %struct.net_device] }
28d3d88d08SYonghong Song%struct.net_device = type { i32, i32 }
29d3d88d08SYonghong Song
30d3d88d08SYonghong Song; Function Attrs: nounwind
31d3d88d08SYonghong Songdefine dso_local i32 @bpf_prog(%struct.sk_buff*) local_unnamed_addr #0 !dbg !15 {
32d3d88d08SYonghong Song  %2 = alloca i32, align 4
33d3d88d08SYonghong Song  call void @llvm.dbg.value(metadata %struct.sk_buff* %0, metadata !31, metadata !DIExpression()), !dbg !33
34d3d88d08SYonghong Song  %3 = bitcast i32* %2 to i8*, !dbg !34
35d3d88d08SYonghong Song  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #4, !dbg !34
36*be5af50eSNikita Popov  %4 = tail call [10 x %struct.net_device]* @llvm.preserve.struct.access.index.p0a10s_struct.net_devices.p0s_struct.sk_buffs(%struct.sk_buff* elementtype(%struct.sk_buff) %0, i32 1, i32 1), !dbg !35, !llvm.preserve.access.index !19
37*be5af50eSNikita Popov  %5 = tail call %struct.net_device* @llvm.preserve.array.access.index.p0s_struct.net_devices.p0a10s_struct.net_devices([10 x %struct.net_device]* elementtype([10 x %struct.net_device]) %4, i32 1, i32 5), !dbg !35, !llvm.preserve.access.index !23
38*be5af50eSNikita Popov  %6 = tail call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.net_devices(%struct.net_device* elementtype(%struct.net_device) %5, i32 0, i32 0), !dbg !35, !llvm.preserve.access.index !24
39d3d88d08SYonghong Song  %7 = bitcast i32* %6 to i8*, !dbg !35
40d3d88d08SYonghong Song  %8 = call i32 inttoptr (i64 4 to i32 (i8*, i32, i8*)*)(i8* nonnull %3, i32 4, i8* %7) #4, !dbg !36
41d3d88d08SYonghong Song  %9 = load i32, i32* %2, align 4, !dbg !37, !tbaa !38
42d3d88d08SYonghong Song  call void @llvm.dbg.value(metadata i32 %9, metadata !32, metadata !DIExpression()), !dbg !33
43d3d88d08SYonghong Song  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %3) #4, !dbg !42
44d3d88d08SYonghong Song  ret i32 %9, !dbg !43
45d3d88d08SYonghong Song}
46d3d88d08SYonghong Song
47d3d88d08SYonghong Song; CHECK:             .section        .BTF,"",@progbits
48d3d88d08SYonghong Song; CHECK-NEXT:        .short  60319                   # 0xeb9f
49d3d88d08SYonghong Song; CHECK-NEXT:        .byte   1
50d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
51d3d88d08SYonghong Song; CHECK-NEXT:        .long   24
52d3d88d08SYonghong Song; CHECK-NEXT:        .long   0
53d3d88d08SYonghong Song; CHECK-NEXT:        .long   172
54d3d88d08SYonghong Song; CHECK-NEXT:        .long   172
55d3d88d08SYonghong Song; CHECK-NEXT:        .long   128
56d3d88d08SYonghong Song; CHECK-NEXT:        .long   0                       # BTF_KIND_PTR(id = 1)
57d3d88d08SYonghong Song; CHECK-NEXT:        .long   33554432                # 0x2000000
58d3d88d08SYonghong Song; CHECK-NEXT:        .long   2
59d3d88d08SYonghong Song; CHECK-NEXT:        .long   1                       # BTF_KIND_STRUCT(id = 2)
60d3d88d08SYonghong Song; CHECK-NEXT:        .long   67108866                # 0x4000002
61d3d88d08SYonghong Song; CHECK-NEXT:        .long   84
62d3d88d08SYonghong Song; CHECK-NEXT:        .long   9
63d3d88d08SYonghong Song; CHECK-NEXT:        .long   3
64d3d88d08SYonghong Song; CHECK-NEXT:        .long   0                       # 0x0
65d3d88d08SYonghong Song; CHECK-NEXT:        .long   11
66d3d88d08SYonghong Song; CHECK-NEXT:        .long   5
67d3d88d08SYonghong Song; CHECK-NEXT:        .long   32                      # 0x20
68d3d88d08SYonghong Song; CHECK-NEXT:        .long   15                      # BTF_KIND_INT(id = 3)
69d3d88d08SYonghong Song; CHECK-NEXT:        .long   16777216                # 0x1000000
70d3d88d08SYonghong Song; CHECK-NEXT:        .long   4
71d3d88d08SYonghong Song; CHECK-NEXT:        .long   16777248                # 0x1000020
72d3d88d08SYonghong Song; CHECK-NEXT:        .long   19                      # BTF_KIND_STRUCT(id = 4)
73d3d88d08SYonghong Song; CHECK-NEXT:        .long   67108866                # 0x4000002
74d3d88d08SYonghong Song; CHECK-NEXT:        .long   8
75d3d88d08SYonghong Song; CHECK-NEXT:        .long   30
76d3d88d08SYonghong Song; CHECK-NEXT:        .long   3
77d3d88d08SYonghong Song; CHECK-NEXT:        .long   0                       # 0x0
78d3d88d08SYonghong Song; CHECK-NEXT:        .long   37
79d3d88d08SYonghong Song; CHECK-NEXT:        .long   3
80d3d88d08SYonghong Song; CHECK-NEXT:        .long   32                      # 0x20
81d3d88d08SYonghong Song; CHECK-NEXT:        .long   0                       # BTF_KIND_ARRAY(id = 5)
82d3d88d08SYonghong Song; CHECK-NEXT:        .long   50331648                # 0x3000000
83d3d88d08SYonghong Song; CHECK-NEXT:        .long   0
84d3d88d08SYonghong Song; CHECK-NEXT:        .long   4
85d3d88d08SYonghong Song; CHECK-NEXT:        .long   6
86d3d88d08SYonghong Song; CHECK-NEXT:        .long   10
87d3d88d08SYonghong Song; CHECK-NEXT:        .long   44                      # BTF_KIND_INT(id = 6)
88d3d88d08SYonghong Song; CHECK-NEXT:        .long   16777216                # 0x1000000
89d3d88d08SYonghong Song; CHECK-NEXT:        .long   4
90d3d88d08SYonghong Song; CHECK-NEXT:        .long   32                      # 0x20
91d3d88d08SYonghong Song; CHECK-NEXT:        .long   0                       # BTF_KIND_FUNC_PROTO(id = 7)
92d3d88d08SYonghong Song; CHECK-NEXT:        .long   218103809               # 0xd000001
93d3d88d08SYonghong Song; CHECK-NEXT:        .long   3
94d3d88d08SYonghong Song; CHECK-NEXT:        .long   64
95d3d88d08SYonghong Song; CHECK-NEXT:        .long   1
96d3d88d08SYonghong Song; CHECK-NEXT:        .long   68                      # BTF_KIND_FUNC(id = 8)
97fbb64aa6SYonghong Song; CHECK-NEXT:        .long   201326593               # 0xc000001
98d3d88d08SYonghong Song; CHECK-NEXT:        .long   7
99d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0                       # string offset=0
100d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "sk_buff"               # string offset=1
101d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
102d3d88d08SYonghong Song; CHECK-NEXT:        .byte   105                     # string offset=9
103d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
104d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "dev"                   # string offset=11
105d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
106d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "int"                   # string offset=15
107d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
108d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "net_device"            # string offset=19
109d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
110d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "dev_id"                # string offset=30
111d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
112d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "others"                # string offset=37
113d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
114d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "__ARRAY_SIZE_TYPE__"   # string offset=44
115d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
116d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "ctx"                   # string offset=64
117d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
118d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "bpf_prog"              # string offset=68
119d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
120d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  ".text"                 # string offset=77
121d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
122d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "/tmp/home/yhs/work/tests/llvm/test.c" # string offset=83
123d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
124d3d88d08SYonghong Song; CHECK-NEXT:        .ascii  "0:1:5:0"               # string offset=120
125d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
126d3d88d08SYonghong Song; CHECK-NEXT:        .section        .BTF.ext,"",@progbits
127d3d88d08SYonghong Song; CHECK-NEXT:        .short  60319                   # 0xeb9f
128d3d88d08SYonghong Song; CHECK-NEXT:        .byte   1
129d3d88d08SYonghong Song; CHECK-NEXT:        .byte   0
130d46a6a9eSYonghong Song; CHECK-NEXT:        .long   32
131d3d88d08SYonghong Song; CHECK-NEXT:        .long   0
132d3d88d08SYonghong Song; CHECK-NEXT:        .long   20
133d3d88d08SYonghong Song; CHECK-NEXT:        .long   20
134a27c998cSYonghong Song; CHECK-NEXT:        .long   {{[0-9]+}}
135a27c998cSYonghong Song; CHECK-NEXT:        .long   {{[0-9]+}}
13605e46979SYonghong Song; CHECK-NEXT:        .long   28
137d3d88d08SYonghong Song; CHECK-NEXT:        .long   8                       # FuncInfo
138d3d88d08SYonghong Song
13905e46979SYonghong Song; CHECK:             .long   16                      # FieldReloc
14005e46979SYonghong Song; CHECK-NEXT:        .long   77                      # Field reloc section string offset=77
141d3d88d08SYonghong Song; CHECK-NEXT:        .long   1
142d46a6a9eSYonghong Song; CHECK-NEXT:        .long   .Ltmp{{[0-9]+}}
143d3d88d08SYonghong Song; CHECK-NEXT:        .long   2
144d3d88d08SYonghong Song; CHECK-NEXT:        .long   120
14505e46979SYonghong Song; CHECK-NEXT:        .long   0
146d3d88d08SYonghong Song
147d3d88d08SYonghong Song; Function Attrs: argmemonly nounwind
148d3d88d08SYonghong Songdeclare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #1
149d3d88d08SYonghong Song
150d3d88d08SYonghong Song; Function Attrs: nounwind readnone
151d3d88d08SYonghong Songdeclare [10 x %struct.net_device]* @llvm.preserve.struct.access.index.p0a10s_struct.net_devices.p0s_struct.sk_buffs(%struct.sk_buff*, i32 immarg, i32 immarg) #2
152d3d88d08SYonghong Song
153d3d88d08SYonghong Song; Function Attrs: nounwind readnone
154d3d88d08SYonghong Songdeclare %struct.net_device* @llvm.preserve.array.access.index.p0s_struct.net_devices.p0a10s_struct.net_devices([10 x %struct.net_device]*, i32 immarg, i32 immarg) #2
155d3d88d08SYonghong Song
156d3d88d08SYonghong Song; Function Attrs: nounwind readnone
157d3d88d08SYonghong Songdeclare i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.net_devices(%struct.net_device*, i32 immarg, i32 immarg) #2
158d3d88d08SYonghong Song
159d3d88d08SYonghong Song; Function Attrs: argmemonly nounwind
160d3d88d08SYonghong Songdeclare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #1
161d3d88d08SYonghong Song
162d3d88d08SYonghong Song; Function Attrs: nounwind readnone speculatable
163d3d88d08SYonghong Songdeclare void @llvm.dbg.value(metadata, metadata, metadata) #3
164d3d88d08SYonghong Song
1654ab3041aSserge-sans-pailleattributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "frame-pointer"="all" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
166d3d88d08SYonghong Songattributes #1 = { argmemonly nounwind }
167d3d88d08SYonghong Songattributes #2 = { nounwind readnone }
168d3d88d08SYonghong Songattributes #3 = { nounwind readnone speculatable }
169d3d88d08SYonghong Songattributes #4 = { nounwind }
170d3d88d08SYonghong Song
171d3d88d08SYonghong Song!llvm.dbg.cu = !{!0}
172d3d88d08SYonghong Song!llvm.module.flags = !{!11, !12, !13}
173d3d88d08SYonghong Song!llvm.ident = !{!14}
174d3d88d08SYonghong Song
175d3d88d08SYonghong Song!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 9.0.0 (trunk 360739) (llvm/trunk 360747)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, nameTableKind: None)
176d3d88d08SYonghong Song!1 = !DIFile(filename: "test.c", directory: "/tmp/home/yhs/work/tests/llvm")
177d3d88d08SYonghong Song!2 = !{}
178d3d88d08SYonghong Song!3 = !{!4}
179d3d88d08SYonghong Song!4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
180d3d88d08SYonghong Song!5 = distinct !DIGlobalVariable(name: "bpf_probe_read", scope: !0, file: !1, line: 10, type: !6, isLocal: true, isDefinition: true)
181d3d88d08SYonghong Song!6 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64)
182d3d88d08SYonghong Song!7 = !DISubroutineType(types: !8)
183d3d88d08SYonghong Song!8 = !{!9, !10, !9, !10}
184d3d88d08SYonghong Song!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
185d3d88d08SYonghong Song!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null, size: 64)
186d3d88d08SYonghong Song!11 = !{i32 2, !"Dwarf Version", i32 4}
187d3d88d08SYonghong Song!12 = !{i32 2, !"Debug Info Version", i32 3}
188d3d88d08SYonghong Song!13 = !{i32 1, !"wchar_size", i32 4}
189d3d88d08SYonghong Song!14 = !{!"clang version 9.0.0 (trunk 360739) (llvm/trunk 360747)"}
190d3d88d08SYonghong Song!15 = distinct !DISubprogram(name: "bpf_prog", scope: !1, file: !1, line: 13, type: !16, scopeLine: 13, flags: DIFlagPrototyped, isLocal: false, isDefinition: true, isOptimized: true, unit: !0, retainedNodes: !30)
191d3d88d08SYonghong Song!16 = !DISubroutineType(types: !17)
192d3d88d08SYonghong Song!17 = !{!9, !18}
193d3d88d08SYonghong Song!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
194d3d88d08SYonghong Song!19 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "sk_buff", file: !1, line: 5, size: 672, elements: !20)
195d3d88d08SYonghong Song!20 = !{!21, !22}
196d3d88d08SYonghong Song!21 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !19, file: !1, line: 6, baseType: !9, size: 32)
197d3d88d08SYonghong Song!22 = !DIDerivedType(tag: DW_TAG_member, name: "dev", scope: !19, file: !1, line: 7, baseType: !23, size: 640, offset: 32)
198d3d88d08SYonghong Song!23 = !DICompositeType(tag: DW_TAG_array_type, baseType: !24, size: 640, elements: !28)
199d3d88d08SYonghong Song!24 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "net_device", file: !1, line: 1, size: 64, elements: !25)
200d3d88d08SYonghong Song!25 = !{!26, !27}
201d3d88d08SYonghong Song!26 = !DIDerivedType(tag: DW_TAG_member, name: "dev_id", scope: !24, file: !1, line: 2, baseType: !9, size: 32)
202d3d88d08SYonghong Song!27 = !DIDerivedType(tag: DW_TAG_member, name: "others", scope: !24, file: !1, line: 3, baseType: !9, size: 32, offset: 32)
203d3d88d08SYonghong Song!28 = !{!29}
204d3d88d08SYonghong Song!29 = !DISubrange(count: 10)
205d3d88d08SYonghong Song!30 = !{!31, !32}
206d3d88d08SYonghong Song!31 = !DILocalVariable(name: "ctx", arg: 1, scope: !15, file: !1, line: 13, type: !18)
207d3d88d08SYonghong Song!32 = !DILocalVariable(name: "dev_id", scope: !15, file: !1, line: 14, type: !9)
208d3d88d08SYonghong Song!33 = !DILocation(line: 0, scope: !15)
209d3d88d08SYonghong Song!34 = !DILocation(line: 14, column: 3, scope: !15)
210d3d88d08SYonghong Song!35 = !DILocation(line: 15, column: 40, scope: !15)
211d3d88d08SYonghong Song!36 = !DILocation(line: 15, column: 3, scope: !15)
212d3d88d08SYonghong Song!37 = !DILocation(line: 16, column: 10, scope: !15)
213d3d88d08SYonghong Song!38 = !{!39, !39, i64 0}
214d3d88d08SYonghong Song!39 = !{!"int", !40, i64 0}
215d3d88d08SYonghong Song!40 = !{!"omnipotent char", !41, i64 0}
216d3d88d08SYonghong Song!41 = !{!"Simple C/C++ TBAA"}
217d3d88d08SYonghong Song!42 = !DILocation(line: 17, column: 1, scope: !15)
218d3d88d08SYonghong Song!43 = !DILocation(line: 16, column: 3, scope: !15)
219