diff options
author | Yi Kong <Yi.Kong@arm.com> | 2014-08-26 12:48:06 +0000 |
---|---|---|
committer | Yi Kong <Yi.Kong@arm.com> | 2014-08-26 12:48:06 +0000 |
commit | 982f0de813dbc1376906fe7c8e8afb3031f94d45 (patch) | |
tree | a6619167254b57339b7c5ed7da9a6da3164b4e90 | |
parent | 4b30eb649ffb6e1bdd9bcda50662544045aaa290 (diff) | |
download | clang-982f0de813dbc1376906fe7c8e8afb3031f94d45.tar.gz |
ARM: Add dbg builtin intrinsic
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216452 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/BuiltinsARM.def | 1 | ||||
-rw-r--r-- | lib/CodeGen/CGBuiltin.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 4 | ||||
-rw-r--r-- | test/CodeGen/builtins-arm.c | 6 | ||||
-rw-r--r-- | test/Sema/builtins-arm.c | 5 |
5 files changed, 18 insertions, 3 deletions
diff --git a/include/clang/Basic/BuiltinsARM.def b/include/clang/Basic/BuiltinsARM.def index 4c1400acf3..1f2f9a3840 100644 --- a/include/clang/Basic/BuiltinsARM.def +++ b/include/clang/Basic/BuiltinsARM.def @@ -74,6 +74,7 @@ BUILTIN(__builtin_arm_wfe, "v", "") BUILTIN(__builtin_arm_wfi, "v", "") BUILTIN(__builtin_arm_sev, "v", "") BUILTIN(__builtin_arm_sevl, "v", "") +BUILTIN(__builtin_arm_dbg, "vUi", "") // Data barrier BUILTIN(__builtin_arm_dmb, "vUi", "nc") diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 76e6e7c4a4..181bdc4b27 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -3094,6 +3094,11 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID)); } + if (BuiltinID == ARM::BI__builtin_arm_dbg) { + Value *Option = EmitScalarExpr(E->getArg(0)); + return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_dbg), Option); + } + if (BuiltinID == ARM::BI__builtin_arm_prefetch) { Value *Address = EmitScalarExpr(E->getArg(0)); Value *RW = EmitScalarExpr(E->getArg(1)); diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 95411f5688..331c5b31a7 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -643,7 +643,8 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { case ARM::BI__builtin_arm_vcvtr_d: i = 1; u = 1; break; case ARM::BI__builtin_arm_dmb: case ARM::BI__builtin_arm_dsb: - case ARM::BI__builtin_arm_isb: l = 0; u = 15; break; + case ARM::BI__builtin_arm_isb: + case ARM::BI__builtin_arm_dbg: l = 0; u = 15; break; } // FIXME: VFP Intrinsics should error if VFP not present. @@ -681,7 +682,6 @@ bool Sema::CheckAArch64BuiltinFunctionCall(unsigned BuiltinID, 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); } diff --git a/test/CodeGen/builtins-arm.c b/test/CodeGen/builtins-arm.c index c7668d02f9..9f3ed9ac78 100644 --- a/test/CodeGen/builtins-arm.c +++ b/test/CodeGen/builtins-arm.c @@ -55,6 +55,12 @@ void sevl() { // CHECK: call {{.*}} @llvm.arm.hint(i32 5) +void dbg() { + __builtin_arm_dbg(0); +} + +// CHECK: call {{.*}} @llvm.arm.dbg(i32 0) + void test_barrier() { __builtin_arm_dmb(1); //CHECK: call {{.*}} @llvm.arm.dmb(i32 1) __builtin_arm_dsb(2); //CHECK: call {{.*}} @llvm.arm.dsb(i32 2) diff --git a/test/Sema/builtins-arm.c b/test/Sema/builtins-arm.c index cc4af7d11d..37604dc8bd 100644 --- a/test/Sema/builtins-arm.c +++ b/test/Sema/builtins-arm.c @@ -30,6 +30,7 @@ void test2() { __builtin_va_list ptr = "x"; *ptr = '0'; // expected-error {{incomplete type 'void' is not assignable}} } +#endif void test3() { __builtin_arm_dsb(16); // expected-error {{argument should be a value from 0 to 15}} @@ -42,4 +43,6 @@ void test4() { __builtin_arm_prefetch(0, 0, 2); // expected-error {{argument should be a value from 0 to 1}} } -#endif +void test5() { + __builtin_arm_dbg(16); // expected-error {{argument should be a value from 0 to 15}} +} |