From e700cab4e944999d0529eadc9b4c18a3ef99ad95 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 5 Jul 2014 20:10:05 +0000 Subject: [PATCH] CodeGen: add support for a few MSVC ARM intrinsics This adds support for simple MSVC compatibility mode intrinsics. These intrinsics are simple in that they are either directly passed through to the annotated MSBuiltin intrinsic or they mirror existing GCC builtins. llvm-svn: 212378 --- clang/include/clang/Basic/BuiltinsARM.def | 9 ++++ clang/lib/CodeGen/CGBuiltin.cpp | 19 ++++++-- clang/test/CodeGen/arm-microsoft-intrinsics.c | 63 +++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 clang/test/CodeGen/arm-microsoft-intrinsics.c diff --git a/clang/include/clang/Basic/BuiltinsARM.def b/clang/include/clang/Basic/BuiltinsARM.def index a423b75..d1cf9a7 100644 --- a/clang/include/clang/Basic/BuiltinsARM.def +++ b/clang/include/clang/Basic/BuiltinsARM.def @@ -86,5 +86,14 @@ LANGBUILTIN(__wfi, "v", "", ALL_MS_LANGUAGES) LANGBUILTIN(__sev, "v", "", ALL_MS_LANGUAGES) LANGBUILTIN(__sevl, "v", "", ALL_MS_LANGUAGES) +LANGBUILTIN(__dmb, "vUi", "nc", ALL_MS_LANGUAGES) +LANGBUILTIN(__dsb, "vUi", "nc", ALL_MS_LANGUAGES) +LANGBUILTIN(__isb, "vUi", "nc", ALL_MS_LANGUAGES) +LANGBUILTIN(__ldrexd, "WiCDWi*", "", ALL_MS_LANGUAGES) +LANGBUILTIN(_MoveFromCoprocessor, "UiUiUiUiUiUi", "", ALL_MS_LANGUAGES) +LANGBUILTIN(_MoveFromCoprocessor2, "UiUiUiUiUiUi", "", ALL_MS_LANGUAGES) +LANGBUILTIN(_MoveToCoprocessor, "vUiUiUiUiUiUi", "", ALL_MS_LANGUAGES) +LANGBUILTIN(_MoveToCoprocessor2, "vUiUiUiUiUiUi", "", ALL_MS_LANGUAGES) + #undef BUILTIN #undef LANGBUILTIN diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 3870712..ded75c1 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -3087,10 +3087,21 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, if (BuiltinID == ARM::BI__builtin_arm_ldrexd || ((BuiltinID == ARM::BI__builtin_arm_ldrex || BuiltinID == ARM::BI__builtin_arm_ldaex) && - getContext().getTypeSize(E->getType()) == 64)) { - Function *F = CGM.getIntrinsic(BuiltinID == ARM::BI__builtin_arm_ldaex - ? Intrinsic::arm_ldaexd - : Intrinsic::arm_ldrexd); + getContext().getTypeSize(E->getType()) == 64) || + BuiltinID == ARM::BI__ldrexd) { + Function *F; + + switch (BuiltinID) { + default: llvm_unreachable("unexpected builtin"); + case ARM::BI__builtin_arm_ldaex: + F = CGM.getIntrinsic(Intrinsic::arm_ldaexd); + break; + case ARM::BI__builtin_arm_ldrexd: + case ARM::BI__builtin_arm_ldrex: + case ARM::BI__ldrexd: + F = CGM.getIntrinsic(Intrinsic::arm_ldrexd); + break; + } Value *LdPtr = EmitScalarExpr(E->getArg(0)); Value *Val = Builder.CreateCall(F, Builder.CreateBitCast(LdPtr, Int8PtrTy), diff --git a/clang/test/CodeGen/arm-microsoft-intrinsics.c b/clang/test/CodeGen/arm-microsoft-intrinsics.c new file mode 100644 index 0000000..5f19e5e --- /dev/null +++ b/clang/test/CodeGen/arm-microsoft-intrinsics.c @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -triple thumbv7-windows -fms-compatibility -emit-llvm -o - %s \ +// RUN: | FileCheck %s -check-prefix CHECK-MSVC + +// RUN: not %clang_cc1 -triple armv7-eabi -Werror -S -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix CHECK-EABI + +void check__dmb(void) { + __dmb(0); +} + +// CHECK-MSVC: @llvm.arm.dmb(i32 0) +// CHECK-EABI: error: implicit declaration of function '__dmb' + +void check__dsb(void) { + __dsb(0); +} + +// CHECK-MSVC: @llvm.arm.dsb(i32 0) +// CHECK-EABI: error: implicit declaration of function '__dsb' + +void check__isb(void) { + __isb(0); +} + +// CHECK-MSVC: @llvm.arm.isb(i32 0) +// CHECK-EABI: error: implicit declaration of function '__isb' + +__INT64_TYPE__ check__ldrexd(void) { + __INT64_TYPE__ i64; + return __ldrexd(&i64); +} + +// CHECK-MSVC: @llvm.arm.ldrexd(i8* {{.*}}) +// CHECK-EABI: error: implicit declaration of function '__ldrexd' + +unsigned int check_MoveFromCoprocessor(void) { + return _MoveFromCoprocessor(0, 0, 0, 0, 0); +} + +// CHECK-MSVC: @llvm.arm.mrc(i32 0, i32 0, i32 0, i32 0, i32 0) +// CHECK-EABI: error: implicit declaration of function '_MoveFromCoprocessor' + +unsigned int check_MoveFromCoprocessor2(void) { + return _MoveFromCoprocessor2(0, 0, 0, 0, 0); +} + +// CHECK-MSVC: @llvm.arm.mrc2(i32 0, i32 0, i32 0, i32 0, i32 0) +// CHECK-EABI: error: implicit declaration of function '_MoveFromCoprocessor2' + +void check_MoveToCoprocessor(void) { + _MoveToCoprocessor(0, 0, 0, 0, 0, 0); +} + +// CHECK-MSVC: @llvm.arm.mcr(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) +// CHECK-EABI: error: implicit declaration of function '_MoveToCoprocessor' + +void check_MoveToCoprocessor2(void) { + _MoveToCoprocessor2(0, 0, 0, 0, 0, 0); +} + +// CHECK-MSVC: @llvm.arm.mcr2(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) +// CHECK-EABI: error: implicit declaration of function '_MoveToCoprocessor2' + -- 2.7.4