forked from bpftrace/bpftrace
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Since bpftrace PR [1] support offsetof() function. As previously discussed [2], the current offsetof() does not support sub-fields, and this PR implements offsetof(struct foo, a.b.c), implement [1] unfinished features. Example: struct Foo { struct e { int a; int b; struct c { int a, b, c; } c; } e; } struct offsetof { struct { int comm; int ustack; } kstack; } BEGIN { printf("struct Foo e.b offset %ld\n", offsetof(struct Foo, e.b)); printf("struct Foo e.c offset %ld\n", offsetof(struct Foo, e.c)); printf("struct Foo e.c.b offset %ld\n", offsetof(struct Foo, e.c.b)); printf("struct offsetof kstack.ustack offset %ld\n", offsetof(struct offsetof, kstack.ustack)); exit(); } Link: bpftrace#2579 [1] merged Link: bpftrace#2216 [2] Signed-off-by: Rong Tao <rongtao@cestc.cn>
- Loading branch information
Showing
13 changed files
with
269 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
; ModuleID = 'bpftrace' | ||
source_filename = "bpftrace" | ||
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128" | ||
target triple = "bpf-pc-linux" | ||
|
||
%"struct map_t" = type { ptr, ptr, ptr, ptr } | ||
%"struct map_t.0" = type { ptr, ptr } | ||
%"struct map_t.1" = type { ptr, ptr, ptr, ptr } | ||
%exit_t = type <{ i64, i8 }> | ||
|
||
@LICENSE = global [4 x i8] c"GPL\00", section "license" | ||
@AT_x = dso_local global %"struct map_t" zeroinitializer, section ".maps", !dbg !0 | ||
@ringbuf = dso_local global %"struct map_t.0" zeroinitializer, section ".maps", !dbg !16 | ||
@event_loss_counter = dso_local global %"struct map_t.1" zeroinitializer, section ".maps", !dbg !30 | ||
|
||
; Function Attrs: nounwind | ||
declare i64 @llvm.bpf.pseudo(i64 %0, i64 %1) #0 | ||
|
||
define i64 @BEGIN_1(ptr %0) section "s_BEGIN_1" !dbg !45 { | ||
entry: | ||
%key = alloca i32, align 4 | ||
%exit = alloca %exit_t, align 8 | ||
%"@x_val" = alloca i64, align 8 | ||
%"@x_key" = alloca i64, align 8 | ||
call void @llvm.lifetime.start.p0(i64 -1, ptr %"@x_key") | ||
store i64 0, ptr %"@x_key", align 8 | ||
call void @llvm.lifetime.start.p0(i64 -1, ptr %"@x_val") | ||
store i64 0, ptr %"@x_val", align 8 | ||
%update_elem = call i64 inttoptr (i64 2 to ptr)(ptr @AT_x, ptr %"@x_key", ptr %"@x_val", i64 0) | ||
call void @llvm.lifetime.end.p0(i64 -1, ptr %"@x_val") | ||
call void @llvm.lifetime.end.p0(i64 -1, ptr %"@x_key") | ||
call void @llvm.lifetime.start.p0(i64 -1, ptr %exit) | ||
%1 = getelementptr %exit_t, ptr %exit, i64 0, i32 0 | ||
store i64 30000, ptr %1, align 8 | ||
%2 = getelementptr %exit_t, ptr %exit, i64 0, i32 1 | ||
store i8 0, ptr %2, align 1 | ||
%ringbuf_output = call i64 inttoptr (i64 130 to ptr)(ptr @ringbuf, ptr %exit, i64 9, i64 0) | ||
%ringbuf_loss = icmp slt i64 %ringbuf_output, 0 | ||
br i1 %ringbuf_loss, label %event_loss_counter, label %counter_merge | ||
|
||
event_loss_counter: ; preds = %entry | ||
call void @llvm.lifetime.start.p0(i64 -1, ptr %key) | ||
store i32 0, ptr %key, align 4 | ||
%lookup_elem = call ptr inttoptr (i64 1 to ptr)(ptr @event_loss_counter, ptr %key) | ||
%map_lookup_cond = icmp ne ptr %lookup_elem, null | ||
br i1 %map_lookup_cond, label %lookup_success, label %lookup_failure | ||
|
||
counter_merge: ; preds = %lookup_merge, %entry | ||
call void @llvm.lifetime.end.p0(i64 -1, ptr %exit) | ||
ret i64 0 | ||
|
||
lookup_success: ; preds = %event_loss_counter | ||
%3 = atomicrmw add ptr %lookup_elem, i64 1 seq_cst, align 8 | ||
br label %lookup_merge | ||
|
||
lookup_failure: ; preds = %event_loss_counter | ||
br label %lookup_merge | ||
|
||
lookup_merge: ; preds = %lookup_failure, %lookup_success | ||
call void @llvm.lifetime.end.p0(i64 -1, ptr %key) | ||
br label %counter_merge | ||
|
||
deadcode: ; No predecessors! | ||
ret i64 0 | ||
} | ||
|
||
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) | ||
declare void @llvm.lifetime.start.p0(i64 immarg %0, ptr nocapture %1) #1 | ||
|
||
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) | ||
declare void @llvm.lifetime.end.p0(i64 immarg %0, ptr nocapture %1) #1 | ||
|
||
attributes #0 = { nounwind } | ||
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } | ||
|
||
!llvm.dbg.cu = !{!42} | ||
!llvm.module.flags = !{!44} | ||
|
||
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) | ||
!1 = distinct !DIGlobalVariable(name: "AT_x", linkageName: "global", scope: !2, file: !2, type: !3, isLocal: false, isDefinition: true) | ||
!2 = !DIFile(filename: "bpftrace.bpf.o", directory: ".") | ||
!3 = !DICompositeType(tag: DW_TAG_structure_type, scope: !2, file: !2, size: 256, elements: !4) | ||
!4 = !{!5, !11, !12, !15} | ||
!5 = !DIDerivedType(tag: DW_TAG_member, name: "type", scope: !2, file: !2, baseType: !6, size: 64) | ||
!6 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64) | ||
!7 = !DICompositeType(tag: DW_TAG_array_type, baseType: !8, size: 32, elements: !9) | ||
!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!9 = !{!10} | ||
!10 = !DISubrange(count: 1, lowerBound: 0) | ||
!11 = !DIDerivedType(tag: DW_TAG_member, name: "max_entries", scope: !2, file: !2, baseType: !6, size: 64, offset: 64) | ||
!12 = !DIDerivedType(tag: DW_TAG_member, name: "key", scope: !2, file: !2, baseType: !13, size: 64, offset: 128) | ||
!13 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !14, size: 64) | ||
!14 = !DIBasicType(name: "int64", size: 64, encoding: DW_ATE_signed) | ||
!15 = !DIDerivedType(tag: DW_TAG_member, name: "value", scope: !2, file: !2, baseType: !13, size: 64, offset: 192) | ||
!16 = !DIGlobalVariableExpression(var: !17, expr: !DIExpression()) | ||
!17 = distinct !DIGlobalVariable(name: "ringbuf", linkageName: "global", scope: !2, file: !2, type: !18, isLocal: false, isDefinition: true) | ||
!18 = !DICompositeType(tag: DW_TAG_structure_type, scope: !2, file: !2, size: 128, elements: !19) | ||
!19 = !{!20, !25} | ||
!20 = !DIDerivedType(tag: DW_TAG_member, name: "type", scope: !2, file: !2, baseType: !21, size: 64) | ||
!21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !22, size: 64) | ||
!22 = !DICompositeType(tag: DW_TAG_array_type, baseType: !8, size: 864, elements: !23) | ||
!23 = !{!24} | ||
!24 = !DISubrange(count: 27, lowerBound: 0) | ||
!25 = !DIDerivedType(tag: DW_TAG_member, name: "max_entries", scope: !2, file: !2, baseType: !26, size: 64, offset: 64) | ||
!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !27, size: 64) | ||
!27 = !DICompositeType(tag: DW_TAG_array_type, baseType: !8, size: 8388608, elements: !28) | ||
!28 = !{!29} | ||
!29 = !DISubrange(count: 262144, lowerBound: 0) | ||
!30 = !DIGlobalVariableExpression(var: !31, expr: !DIExpression()) | ||
!31 = distinct !DIGlobalVariable(name: "event_loss_counter", linkageName: "global", scope: !2, file: !2, type: !32, isLocal: false, isDefinition: true) | ||
!32 = !DICompositeType(tag: DW_TAG_structure_type, scope: !2, file: !2, size: 256, elements: !33) | ||
!33 = !{!34, !11, !39, !15} | ||
!34 = !DIDerivedType(tag: DW_TAG_member, name: "type", scope: !2, file: !2, baseType: !35, size: 64) | ||
!35 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !36, size: 64) | ||
!36 = !DICompositeType(tag: DW_TAG_array_type, baseType: !8, size: 64, elements: !37) | ||
!37 = !{!38} | ||
!38 = !DISubrange(count: 2, lowerBound: 0) | ||
!39 = !DIDerivedType(tag: DW_TAG_member, name: "key", scope: !2, file: !2, baseType: !40, size: 64, offset: 128) | ||
!40 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !41, size: 64) | ||
!41 = !DIBasicType(name: "int32", size: 32, encoding: DW_ATE_signed) | ||
!42 = distinct !DICompileUnit(language: DW_LANG_C, file: !2, producer: "bpftrace", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, globals: !43) | ||
!43 = !{!0, !16, !30} | ||
!44 = !{i32 2, !"Debug Info Version", i32 3} | ||
!45 = distinct !DISubprogram(name: "BEGIN_1", linkageName: "BEGIN_1", scope: !2, file: !2, type: !46, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !42, retainedNodes: !50) | ||
!46 = !DISubroutineType(types: !47) | ||
!47 = !{!14, !48} | ||
!48 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !49, size: 64) | ||
!49 = !DIBasicType(name: "int8", size: 8, encoding: DW_ATE_signed) | ||
!50 = !{!51} | ||
!51 = !DILocalVariable(name: "ctx", arg: 1, scope: !45, file: !2, type: !48) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.