diff --git a/include/clang/Basic/BuiltinsPPC.def b/include/clang/Basic/BuiltinsPPC.def index fdf1cb0b5a40a9a3ac8ca4e1fa4c916f802edb4d..3e2861d43e8328d6f9d85c13d0cdce79d6f630b8 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 6966b03ef3b66d0ae9cec1090b89bfc0559fa339..a04a1c1256036f5644ee1bcd72ff62df4a4869e2 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 9ef5e3708f58d57b1281e016631d9a919dcb672e..1f17787ad9c874269f9a80f28c0d7aa74c3b034d 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(); +} +