llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: None (yonghong-song)

<details>
<summary>Changes</summary>

Sometimes bpf developer might want to develop different codes based on 
particular cpu versioins. For example, cpu v1/v2/v3 branch target is 16bit 
while cpu v4 branch target is 32bit, thus cpu v4 allows more aggressive loop 
unrolling than cpu v1/v2/v3 (see [1] for a kernel selftest failure due to 
this). We would like to maintain aggressive loop unrolling for cpu v4 while 
limit loop unrolling for earlier cpu versions. Another example, signed divide 
also only available with cpu v4.

Actually, adding cpu specific macros are fairly common in llvm. For example, 
x86 has maco like 'i486', '__pentium_mmx__', etc. AArch64 has '__ARM_NEON', 
'__ARM_FEATURE_SVE', etc.

This patch added __bpf_cpu_version__ macro. Current possible values are 
0/1/2/3/4. The following are the -mcpu=... to __bpf_cpu_version__ mapping:
   cpu                  __bpf_cpu_version__
   no -mcpu=&lt;...&gt;       1
   -mcpu=v1             1
   -mcpu=v2             2
   -mcpu=v3             3
   -mcpu=v4             4
   -mcpu=generic        1
   -mcpu=probe          0

 [1] https://lore.kernel.org/bpf/3e3a8a30-dde0-43a1-981e-2274962780ef@<!-- 
-->linux.dev/

---
Full diff: https://github.com/llvm/llvm-project/pull/71856.diff


2 Files Affected:

- (modified) clang/lib/Basic/Targets/BPF.cpp (+8) 
- (modified) clang/test/Preprocessor/bpf-predefined-macros.c (+35-2) 


``````````diff
diff --git a/clang/lib/Basic/Targets/BPF.cpp b/clang/lib/Basic/Targets/BPF.cpp
index d6288d2e0d0e176..a61e279f395ea31 100644
--- a/clang/lib/Basic/Targets/BPF.cpp
+++ b/clang/lib/Basic/Targets/BPF.cpp
@@ -29,6 +29,14 @@ void BPFTargetInfo::getTargetDefines(const LangOptions &Opts,
                                      MacroBuilder &Builder) const {
   Builder.defineMacro("__bpf__");
   Builder.defineMacro("__BPF__");
+
+  std::string CPU = getTargetOpts().CPU;
+  if (CPU == "probe")
+    Builder.defineMacro("__bpf_cpu_version__", "0");
+  else if (CPU.empty() || CPU == "generic")
+    Builder.defineMacro("__bpf_cpu_version__", "1");
+  else
+    Builder.defineMacro("__bpf_cpu_version__", CPU.substr(1));
 }
 
 static constexpr llvm::StringLiteral ValidCPUNames[] = {"generic", "v1", "v2",
diff --git a/clang/test/Preprocessor/bpf-predefined-macros.c 
b/clang/test/Preprocessor/bpf-predefined-macros.c
index bcb985f95426622..364f4cc3f4d0c3c 100644
--- a/clang/test/Preprocessor/bpf-predefined-macros.c
+++ b/clang/test/Preprocessor/bpf-predefined-macros.c
@@ -1,5 +1,11 @@
-// RUN: %clang -E -target bpfel -x c -o - %s | FileCheck %s
-// RUN: %clang -E -target bpfeb -x c -o - %s | FileCheck %s
+// RUN: %clang -E -target bpfel -x c -o - %s | FileCheck -check-prefix=CHECK 
-check-prefix=CPU_NO %s
+// RUN: %clang -E -target bpfeb -x c -o - %s | FileCheck -check-prefix=CHECK 
-check-prefix=CPU_NO %s
+// RUN: %clang -E -target bpfel -mcpu=v1 -x c -o - %s | FileCheck 
-check-prefix=CHECK -check-prefix=CPU_V1 %s
+// RUN: %clang -E -target bpfel -mcpu=v2 -x c -o - %s | FileCheck 
-check-prefix=CHECK -check-prefix=CPU_V2 %s
+// RUN: %clang -E -target bpfel -mcpu=v3 -x c -o - %s | FileCheck 
-check-prefix=CHECK -check-prefix=CPU_V3 %s
+// RUN: %clang -E -target bpfel -mcpu=v4 -x c -o - %s | FileCheck 
-check-prefix=CHECK -check-prefix=CPU_V4 %s
+// RUN: %clang -E -target bpfel -mcpu=generic -x c -o - %s | FileCheck 
-check-prefix=CHECK -check-prefix=CPU_GENERIC %s
+// RUN: %clang -E -target bpfel -mcpu=probe -x c -o - %s | FileCheck 
-check-prefix=CHECK -check-prefix=CPU_PROBE %s
 
 #ifdef __bpf__
 int b;
@@ -10,7 +16,34 @@ int c;
 #ifdef bpf
 int d;
 #endif
+#ifdef __bpf_cpu_version__
+int e;
+#endif
+#if __bpf_cpu_version__ == 0
+int f;
+#endif
+#if __bpf_cpu_version__ == 1
+int g;
+#endif
+#if __bpf_cpu_version__ == 2
+int h;
+#endif
+#if __bpf_cpu_version__ == 3
+int i;
+#endif
+#if __bpf_cpu_version__ == 4
+int j;
+#endif
 
 // CHECK: int b;
 // CHECK: int c;
 // CHECK-NOT: int d;
+// CHECK: int e;
+
+// CPU_NO: int g;
+// CPU_V1: int g;
+// CPU_V2: int h;
+// CPU_V3: int i;
+// CPU_V4: int j;
+// CPU_GENERIC: int g;
+// CPU_PROBE: int f;

``````````

</details>


https://github.com/llvm/llvm-project/pull/71856
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to