1// SPDX-License-Identifier: GPL-2.0 2// Copyright (c) 2020 Facebook 3 4#include <linux/bpf.h> 5#include <stdint.h> 6#include <stdbool.h> 7#include <bpf/bpf_helpers.h> 8#include <bpf/bpf_core_read.h> 9 10char _license[] SEC("license") = "GPL"; 11 12struct { 13 char in[256]; 14 char out[256]; 15 bool skip; 16} data = {}; 17 18struct a_struct { 19 int x; 20}; 21 22union a_union { 23 int y; 24 int z; 25}; 26 27typedef struct a_struct named_struct_typedef; 28 29typedef struct { int x, y, z; } anon_struct_typedef; 30 31typedef struct { 32 int a, b, c; 33} *struct_ptr_typedef; 34 35enum an_enum { 36 AN_ENUM_VAL1 = 1, 37 AN_ENUM_VAL2 = 2, 38 AN_ENUM_VAL3 = 3, 39}; 40 41typedef int int_typedef; 42 43typedef enum { TYPEDEF_ENUM_VAL1, TYPEDEF_ENUM_VAL2 } enum_typedef; 44 45typedef void *void_ptr_typedef; 46 47typedef int (*func_proto_typedef)(long); 48 49typedef char arr_typedef[20]; 50 51struct core_reloc_type_based_output { 52 bool struct_exists; 53 bool union_exists; 54 bool enum_exists; 55 bool typedef_named_struct_exists; 56 bool typedef_anon_struct_exists; 57 bool typedef_struct_ptr_exists; 58 bool typedef_int_exists; 59 bool typedef_enum_exists; 60 bool typedef_void_ptr_exists; 61 bool typedef_func_proto_exists; 62 bool typedef_arr_exists; 63 64 int struct_sz; 65 int union_sz; 66 int enum_sz; 67 int typedef_named_struct_sz; 68 int typedef_anon_struct_sz; 69 int typedef_struct_ptr_sz; 70 int typedef_int_sz; 71 int typedef_enum_sz; 72 int typedef_void_ptr_sz; 73 int typedef_func_proto_sz; 74 int typedef_arr_sz; 75}; 76 77SEC("raw_tracepoint/sys_enter") 78int test_core_type_based(void *ctx) 79{ 80#if __has_builtin(__builtin_preserve_type_info) 81 struct core_reloc_type_based_output *out = (void *)&data.out; 82 83 out->struct_exists = bpf_core_type_exists(struct a_struct); 84 out->union_exists = bpf_core_type_exists(union a_union); 85 out->enum_exists = bpf_core_type_exists(enum an_enum); 86 out->typedef_named_struct_exists = bpf_core_type_exists(named_struct_typedef); 87 out->typedef_anon_struct_exists = bpf_core_type_exists(anon_struct_typedef); 88 out->typedef_struct_ptr_exists = bpf_core_type_exists(struct_ptr_typedef); 89 out->typedef_int_exists = bpf_core_type_exists(int_typedef); 90 out->typedef_enum_exists = bpf_core_type_exists(enum_typedef); 91 out->typedef_void_ptr_exists = bpf_core_type_exists(void_ptr_typedef); 92 out->typedef_func_proto_exists = bpf_core_type_exists(func_proto_typedef); 93 out->typedef_arr_exists = bpf_core_type_exists(arr_typedef); 94 95 out->struct_sz = bpf_core_type_size(struct a_struct); 96 out->union_sz = bpf_core_type_size(union a_union); 97 out->enum_sz = bpf_core_type_size(enum an_enum); 98 out->typedef_named_struct_sz = bpf_core_type_size(named_struct_typedef); 99 out->typedef_anon_struct_sz = bpf_core_type_size(anon_struct_typedef); 100 out->typedef_struct_ptr_sz = bpf_core_type_size(struct_ptr_typedef); 101 out->typedef_int_sz = bpf_core_type_size(int_typedef); 102 out->typedef_enum_sz = bpf_core_type_size(enum_typedef); 103 out->typedef_void_ptr_sz = bpf_core_type_size(void_ptr_typedef); 104 out->typedef_func_proto_sz = bpf_core_type_size(func_proto_typedef); 105 out->typedef_arr_sz = bpf_core_type_size(arr_typedef); 106#else 107 data.skip = true; 108#endif 109 return 0; 110} 111