Merge tag 'spdx_identifiers-4.14-rc8' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / tools / perf / arch / powerpc / annotate / instructions.c
1 // SPDX-License-Identifier: GPL-2.0
2 static struct ins_ops *powerpc__associate_instruction_ops(struct arch *arch, const char *name)
3 {
4         int i;
5         struct ins_ops *ops;
6
7         /*
8          * - Interested only if instruction starts with 'b'.
9          * - Few start with 'b', but aren't branch instructions.
10          */
11         if (name[0] != 'b'             ||
12             !strncmp(name, "bcd", 3)   ||
13             !strncmp(name, "brinc", 5) ||
14             !strncmp(name, "bper", 4))
15                 return NULL;
16
17         ops = &jump_ops;
18
19         i = strlen(name) - 1;
20         if (i < 0)
21                 return NULL;
22
23         /* ignore optional hints at the end of the instructions */
24         if (name[i] == '+' || name[i] == '-')
25                 i--;
26
27         if (name[i] == 'l' || (name[i] == 'a' && name[i-1] == 'l')) {
28                 /*
29                  * if the instruction ends up with 'l' or 'la', then
30                  * those are considered 'calls' since they update LR.
31                  * ... except for 'bnl' which is branch if not less than
32                  * and the absolute form of the same.
33                  */
34                 if (strcmp(name, "bnl") && strcmp(name, "bnl+") &&
35                     strcmp(name, "bnl-") && strcmp(name, "bnla") &&
36                     strcmp(name, "bnla+") && strcmp(name, "bnla-"))
37                         ops = &call_ops;
38         }
39         if (name[i] == 'r' && name[i-1] == 'l')
40                 /*
41                  * instructions ending with 'lr' are considered to be
42                  * return instructions
43                  */
44                 ops = &ret_ops;
45
46         arch__associate_ins_ops(arch, name, ops);
47         return ops;
48 }
49
50 static int powerpc__annotate_init(struct arch *arch)
51 {
52         if (!arch->initialized) {
53                 arch->initialized = true;
54                 arch->associate_instruction_ops = powerpc__associate_instruction_ops;
55                 arch->objdump.comment_char      = '#';
56         }
57
58         return 0;
59 }