From 9aabd84f8f52042cd4e3434ae883f1c68d757b31 Mon Sep 17 00:00:00 2001 From: Hal Finkel <hfinkel@anl.gov> Date: Mon, 31 Aug 2015 23:55:19 +0000 Subject: [PATCH] [PowerPC] Support __builtin_ppc_get_timebase GCC 4.8+ has a PowerPC-specific intrinsic, __builtin_ppc_get_timebase, to do what Clang's __builtin_readcyclecounter does. For compatibility with code that uses GCC's spelling (including glibc), support it as well. Partially fixes PR23681. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@246510 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/BuiltinsPPC.def | 2 ++ lib/CodeGen/CGBuiltin.cpp | 5 +++++ test/CodeGen/builtins-ppc.c | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/include/clang/Basic/BuiltinsPPC.def b/include/clang/Basic/BuiltinsPPC.def index fdf1cb0b5a4..3e2861d43e8 100644 --- a/include/clang/Basic/BuiltinsPPC.def +++ b/include/clang/Basic/BuiltinsPPC.def @@ -17,6 +17,8 @@ // The format of this database matches clang/Basic/Builtins.def. +BUILTIN(__builtin_ppc_get_timebase, "ULLi", "n") + // This is just a placeholder, the types and attributes are wrong. BUILTIN(__builtin_altivec_vaddcuw, "V4UiV4UiV4Ui", "") diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 6966b03ef3b..a04a1c12560 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -6414,6 +6414,11 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, switch (BuiltinID) { default: return nullptr; + // __builtin_ppc_get_timebase is GCC 4.8+'s PowerPC-specific name for what we + // call __builtin_readcyclecounter. + case PPC::BI__builtin_ppc_get_timebase: + return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::readcyclecounter)); + // vec_ld, vec_lvsl, vec_lvsr case PPC::BI__builtin_altivec_lvx: case PPC::BI__builtin_altivec_lvxl: diff --git a/test/CodeGen/builtins-ppc.c b/test/CodeGen/builtins-ppc.c index 9ef5e3708f5..1f17787ad9c 100644 --- a/test/CodeGen/builtins-ppc.c +++ b/test/CodeGen/builtins-ppc.c @@ -7,3 +7,10 @@ void test_eh_return_data_regno() res = __builtin_eh_return_data_regno(0); // CHECK: store volatile i32 3 res = __builtin_eh_return_data_regno(1); // CHECK: store volatile i32 4 } + +// CHECK-LABEL: define i64 @test_builtin_ppc_get_timebase +long long test_builtin_ppc_get_timebase() { + // CHECK: call i64 @llvm.readcyclecounter() + return __builtin_ppc_get_timebase(); +} + -- GitLab