From cd6c621a6484546dcf452e2e704671feaf332b82 Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Thu, 17 Jul 2014 10:52:06 +0000 Subject: [PATCH] Port memory barriers intrinsics to AArch64 Memory barrier __builtin_arm_[dmb, dsb, isb] intrinsics are required to implement their corresponding ACLE and MSVC intrinsics. This patch ports ARM dmb, dsb, isb intrinsic to AArch64. Requires LLVM r213247. Differential Revision: http://reviews.llvm.org/D4521 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213250 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/BuiltinsAArch64.def | 5 +++++ lib/Sema/SemaChecking.cpp | 13 ++++++++++++- test/CodeGen/builtins-arm64.c | 6 ++++++ test/Sema/builtins-arm64.c | 6 ++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/clang/Basic/BuiltinsAArch64.def b/include/clang/Basic/BuiltinsAArch64.def index 76dddadb80..695ecf9da5 100644 --- a/include/clang/Basic/BuiltinsAArch64.def +++ b/include/clang/Basic/BuiltinsAArch64.def @@ -45,4 +45,9 @@ BUILTIN(__builtin_arm_crc32cw, "UiUiUi", "nc") BUILTIN(__builtin_arm_crc32d, "UiUiLUi", "nc") BUILTIN(__builtin_arm_crc32cd, "UiUiLUi", "nc") +// Memory barrier +BUILTIN(__builtin_arm_dmb, "vUi", "nc") +BUILTIN(__builtin_arm_dsb, "vUi", "nc") +BUILTIN(__builtin_arm_isb, "vUi", "nc") + #undef BUILTIN diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 976f3a696d..7a23797d47 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -645,7 +645,18 @@ bool Sema::CheckAArch64BuiltinFunctionCall(unsigned BuiltinID, if (CheckNeonBuiltinFunctionCall(BuiltinID, TheCall)) return true; - return false; + // For intrinsics which take an immediate value as part of the instruction, + // range check them here. + unsigned i = 0, l = 0, u = 0; + switch (BuiltinID) { + default: return false; + case AArch64::BI__builtin_arm_dmb: + case AArch64::BI__builtin_arm_dsb: + case AArch64::BI__builtin_arm_isb: l = 0; u = 15; break; + } + + // FIXME: VFP Intrinsics should error if VFP not present. + return SemaBuiltinConstantArgRange(TheCall, i, l, u + l); } bool Sema::CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { diff --git a/test/CodeGen/builtins-arm64.c b/test/CodeGen/builtins-arm64.c index 8614be0592..cfa1181227 100644 --- a/test/CodeGen/builtins-arm64.c +++ b/test/CodeGen/builtins-arm64.c @@ -23,3 +23,9 @@ void hints() { __builtin_arm_sev(); //CHECK: call {{.*}} @llvm.aarch64.hint(i32 4) __builtin_arm_sevl(); //CHECK: call {{.*}} @llvm.aarch64.hint(i32 5) } + +void barriers() { + __builtin_arm_dmb(1); //CHECK: call {{.*}} @llvm.aarch64.dmb(i32 1) + __builtin_arm_dsb(2); //CHECK: call {{.*}} @llvm.aarch64.dsb(i32 2) + __builtin_arm_isb(3); //CHECK: call {{.*}} @llvm.aarch64.isb(i32 3) +} diff --git a/test/Sema/builtins-arm64.c b/test/Sema/builtins-arm64.c index f2bdc9dea2..113f4fc302 100644 --- a/test/Sema/builtins-arm64.c +++ b/test/Sema/builtins-arm64.c @@ -16,3 +16,9 @@ void test_clear_cache_voids(void *start, void *end) { void test_clear_cache_no_args() { __clear_cache(); // expected-error {{too few arguments to function call}} } + +void test_memory_barriers() { + __builtin_arm_dmb(16); // expected-error {{argument should be a value from 0 to 15}} + __builtin_arm_dsb(17); // expected-error {{argument should be a value from 0 to 15}} + __builtin_arm_isb(18); // expected-error {{argument should be a value from 0 to 15}} +} -- 2.40.0