diff --git a/clang/include/clang/Basic/Builtins.def b/clang/include/clang/Basic/Builtins.def index 42d8fa7724a8..3f1c27616a99 100644 --- a/clang/include/clang/Basic/Builtins.def +++ b/clang/include/clang/Basic/Builtins.def @@ -833,6 +833,14 @@ LIBBUILTIN(ceil, "dd", "fc", "math.h", ALL_LANGUAGES) LIBBUILTIN(ceill, "LdLd", "fc", "math.h", ALL_LANGUAGES) LIBBUILTIN(ceilf, "ff", "fc", "math.h", ALL_LANGUAGES) +LIBBUILTIN(cimag, "dXd", "fnc", "complex.h", ALL_LANGUAGES) +LIBBUILTIN(cimagf, "fXf", "fnc", "complex.h", ALL_LANGUAGES) +LIBBUILTIN(cimagl, "LdXLd", "fnc", "complex.h", ALL_LANGUAGES) + +LIBBUILTIN(creal, "dXd", "fnc", "complex.h", ALL_LANGUAGES) +LIBBUILTIN(crealf, "fXf", "fnc", "complex.h", ALL_LANGUAGES) +LIBBUILTIN(creall, "LdXLd", "fnc", "complex.h", ALL_LANGUAGES) + LIBBUILTIN(copysign, "ddd", "fc", "math.h", ALL_LANGUAGES) LIBBUILTIN(copysignl, "LdLdLd", "fc", "math.h", ALL_LANGUAGES) LIBBUILTIN(copysignf, "fff", "fc", "math.h", ALL_LANGUAGES) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index a1a6ef6bfade..d2824e91e7b0 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -244,14 +244,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, } case Builtin::BI__builtin_creal: case Builtin::BI__builtin_crealf: - case Builtin::BI__builtin_creall: { + case Builtin::BI__builtin_creall: + case Builtin::BIcreal: + case Builtin::BIcrealf: + case Builtin::BIcreall: { ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); return RValue::get(ComplexVal.first); } case Builtin::BI__builtin_cimag: case Builtin::BI__builtin_cimagf: - case Builtin::BI__builtin_cimagl: { + case Builtin::BI__builtin_cimagl: + case Builtin::BIcimag: + case Builtin::BIcimagf: + case Builtin::BIcimagl: { ComplexPairTy ComplexVal = EmitComplexExpr(E->getArg(0)); return RValue::get(ComplexVal.second); } diff --git a/clang/test/CodeGen/libcalls-complex.c b/clang/test/CodeGen/libcalls-complex.c new file mode 100644 index 000000000000..7bcfa605ae8b --- /dev/null +++ b/clang/test/CodeGen/libcalls-complex.c @@ -0,0 +1,46 @@ +// RUN: %clang_cc1 -fno-builtin -emit-llvm -o - %s -triple i386-unknown-unknown | FileCheck -check-prefix YES %s +// RUN: %clang_cc1 -emit-llvm -o - %s -triple i386-unknown-unknown | FileCheck -check-prefix NO %s + +extern float crealf(float _Complex); +extern double creal(double _Complex); +extern long double creall(long double _Complex); + +extern float cimagf(float _Complex); +extern double cimag(double _Complex); +extern long double cimagl(long double _Complex); + +double test_creal(double _Complex z) { + return creal(z); + // CHECK-NO-NOT: call double @creal + // CHECK-YES: call double @creal +} + +long double test_creall(double _Complex z) { + return creall(z); + // CHECK-NO-NOT: call x86_fp80 @creall + // CHECK-YES: call x86_fp80 @creall +} + +float test_crealf(double _Complex z) { + return crealf(z); + // CHECK-NO-NOT: call float @crealf + // CHECK-YES: call float @crealf +} + +double test_cimag(double _Complex z) { + return cimag(z); + // CHECK-NO-NOT: call double @cimag + // CHECK-YES: call double @cimag +} + +long double test_cimagl(double _Complex z) { + return cimagl(z); + // CHECK-NO-NOT: call x86_fp80 @cimagl + // CHECK-YES: call x86_fp80 @cimagl +} + +float test_cimagf(double _Complex z) { + return cimagf(z); + // CHECK-NO-NOT: call float @cimagf + // CHECK-YES: call float @cimagf +}