xref: /aosp_15_r20/external/bcc/src/cc/frontends/clang/arch_helper.h (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1 /*
2  * Copyright (c) 2018 Google, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <string.h>
18 #include <stdlib.h>
19 
20 typedef enum {
21   BCC_ARCH_PPC,
22   BCC_ARCH_PPC_LE,
23   BCC_ARCH_S390X,
24   BCC_ARCH_ARM64,
25   BCC_ARCH_MIPS,
26   BCC_ARCH_RISCV64,
27   BCC_ARCH_LOONGARCH,
28   BCC_ARCH_X86
29 } bcc_arch_t;
30 
31 typedef void *(*arch_callback_t)(bcc_arch_t arch, bool for_syscall);
32 
33 static void *run_arch_callback(arch_callback_t fn, bool for_syscall = false)
34 {
35   const char *archenv = getenv("ARCH");
36 
37   /* If ARCH is not set, detect from local arch clang is running on */
38   if (!archenv) {
39 #if defined(__powerpc64__)
40 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
41     return fn(BCC_ARCH_PPC_LE, for_syscall);
42 #else
43     return fn(BCC_ARCH_PPC, for_syscall);
44 #endif
45 #elif defined(__s390x__)
46     return fn(BCC_ARCH_S390X, for_syscall);
47 #elif defined(__aarch64__)
48     return fn(BCC_ARCH_ARM64, for_syscall);
49 #elif defined(__mips__)
50     return fn(BCC_ARCH_MIPS, for_syscall);
51 #elif defined(__riscv) && (__riscv_xlen == 64)
52     return fn(BCC_ARCH_RISCV64, for_syscall);
53 #elif defined(__loongarch__)
54     return fn(BCC_ARCH_LOONGARCH, for_syscall);
55 #else
56     return fn(BCC_ARCH_X86, for_syscall);
57 #endif
58   }
59 
60   /* Otherwise read it from ARCH */
61   if (!strcmp(archenv, "powerpc")) {
62 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
63     return fn(BCC_ARCH_PPC_LE, for_syscall);
64 #else
65     return fn(BCC_ARCH_PPC, for_syscall);
66 #endif
67   } else if (!strcmp(archenv, "s390x")) {
68     return fn(BCC_ARCH_S390X, for_syscall);
69   } else if (!strcmp(archenv, "arm64")) {
70     return fn(BCC_ARCH_ARM64, for_syscall);
71   } else if (!strcmp(archenv, "mips")) {
72     return fn(BCC_ARCH_MIPS, for_syscall);
73   } else if (!strcmp(archenv, "riscv64")) {
74     return fn(BCC_ARCH_RISCV64, for_syscall);
75   } else if (!strcmp(archenv, "loongarch")) {
76     return fn(BCC_ARCH_LOONGARCH, for_syscall);
77   } else {
78     return fn(BCC_ARCH_X86, for_syscall);
79   }
80 }
81