1*571d01a9SYonghong Song // SPDX-License-Identifier: GPL-2.0
2*571d01a9SYonghong Song /* Copyright (c) 2021 Facebook */
3*571d01a9SYonghong Song #include "vmlinux.h"
4*571d01a9SYonghong Song #include <bpf/bpf_helpers.h>
5*571d01a9SYonghong Song #include <bpf/bpf_tracing.h>
6*571d01a9SYonghong Song 
7*571d01a9SYonghong Song #if __has_attribute(btf_decl_tag)
8*571d01a9SYonghong Song #define __tag1 __attribute__((btf_decl_tag("tag1")))
9*571d01a9SYonghong Song #define __tag2 __attribute__((btf_decl_tag("tag2")))
10*571d01a9SYonghong Song volatile const bool skip_tests __tag1 __tag2 = false;
11*571d01a9SYonghong Song #else
12*571d01a9SYonghong Song #define __tag1
13*571d01a9SYonghong Song #define __tag2
14*571d01a9SYonghong Song volatile const bool skip_tests = true;
15*571d01a9SYonghong Song #endif
16*571d01a9SYonghong Song 
17*571d01a9SYonghong Song struct key_t {
18*571d01a9SYonghong Song 	int a;
19*571d01a9SYonghong Song 	int b __tag1 __tag2;
20*571d01a9SYonghong Song 	int c;
21*571d01a9SYonghong Song } __tag1 __tag2;
22*571d01a9SYonghong Song 
23*571d01a9SYonghong Song typedef struct {
24*571d01a9SYonghong Song 	int a;
25*571d01a9SYonghong Song 	int b;
26*571d01a9SYonghong Song } value_t __tag1 __tag2;
27*571d01a9SYonghong Song 
28*571d01a9SYonghong Song struct {
29*571d01a9SYonghong Song 	__uint(type, BPF_MAP_TYPE_HASH);
30*571d01a9SYonghong Song 	__uint(max_entries, 3);
31*571d01a9SYonghong Song 	__type(key, struct key_t);
32*571d01a9SYonghong Song 	__type(value, value_t);
33*571d01a9SYonghong Song } hashmap1 SEC(".maps");
34*571d01a9SYonghong Song 
35*571d01a9SYonghong Song 
foo(int x __tag1 __tag2)36*571d01a9SYonghong Song static __noinline int foo(int x __tag1 __tag2) __tag1 __tag2
37*571d01a9SYonghong Song {
38*571d01a9SYonghong Song 	struct key_t key;
39*571d01a9SYonghong Song 	value_t val = {};
40*571d01a9SYonghong Song 
41*571d01a9SYonghong Song 	key.a = key.b = key.c = x;
42*571d01a9SYonghong Song 	bpf_map_update_elem(&hashmap1, &key, &val, 0);
43*571d01a9SYonghong Song 	return 0;
44*571d01a9SYonghong Song }
45*571d01a9SYonghong Song 
46*571d01a9SYonghong Song SEC("fentry/bpf_fentry_test1")
BPF_PROG(sub,int x)47*571d01a9SYonghong Song int BPF_PROG(sub, int x)
48*571d01a9SYonghong Song {
49*571d01a9SYonghong Song 	return foo(x);
50*571d01a9SYonghong Song }
51