From b3210f2343e57899584ac5f1385bddb67e54158f Mon Sep 17 00:00:00 2001 From: Simon Dardis Date: Tue, 21 Feb 2017 16:01:00 +0000 Subject: [PATCH] [mips] Define macros related to -mabicalls in the preprocessor Summary: Historically, NetBSD, FreeBSD and OpenBSD have defined the macro ABICALLS in the preprocessor when -mabicalls is in effect. Mainline GCC later defined __mips_abicalls when -mabicalls is in effect. This patch teaches the preprocessor to define these macros when appropriate. NetBSD does not require the ABICALLS macro. This resolves PR/31694. Thanks to Sean Bruno for highlighting this issue! Reviewers: slthakur, seanbruno Reviewed By: seanbruno Subscribers: joerg, brad, emaste, seanbruno, cfe-commits Differential Revision: https://reviews.llvm.org/D29032 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@295728 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 18 ++++++++++++++-- test/Preprocessor/init.c | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 9b32817263..bd1093d532 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -7464,6 +7464,8 @@ class MipsTargetInfo : public TargetInfo { bool IsMicromips; bool IsNan2008; bool IsSingleFloat; + bool IsNoABICalls; + bool CanUseBSDABICalls; enum MipsFloatABI { HardFloat, SoftFloat } FloatABI; @@ -7479,8 +7481,9 @@ protected: public: MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple), IsMips16(false), IsMicromips(false), - IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat), - DspRev(NoDSP), HasMSA(false), HasFP64(false) { + IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false), + CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP), + HasMSA(false), HasFP64(false) { TheCXXABI.set(TargetCXXABI::GenericMIPS); setABI((getTriple().getArch() == llvm::Triple::mips || @@ -7489,6 +7492,9 @@ public: : "n64"); CPU = ABI == "o32" ? "mips32r2" : "mips64r2"; + + CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD || + Triple.getOS() == llvm::Triple::OpenBSD; } bool isNaN2008Default() const { @@ -7669,6 +7675,12 @@ public: } else llvm_unreachable("Invalid ABI."); + if (!IsNoABICalls) { + Builder.defineMacro("__mips_abicalls"); + if (CanUseBSDABICalls) + Builder.defineMacro("__ABICALLS__"); + } + Builder.defineMacro("__REGISTER_PREFIX__", ""); switch (FloatABI) { @@ -7883,6 +7895,8 @@ public: IsNan2008 = true; else if (Feature == "-nan2008") IsNan2008 = false; + else if (Feature == "+noabicalls") + IsNoABICalls = true; } setDataLayout(); diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index a7726e3111..cb8f509224 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -3040,6 +3040,7 @@ // MIPS32BE:#define __llvm__ 1 // MIPS32BE:#define __mips 32 // MIPS32BE:#define __mips__ 1 +// MIPS32BE:#define __mips_abicalls 1 // MIPS32BE:#define __mips_fpr 32 // MIPS32BE:#define __mips_hard_float 1 // MIPS32BE:#define __mips_o32 1 @@ -3246,6 +3247,7 @@ // MIPS32EL:#define __llvm__ 1 // MIPS32EL:#define __mips 32 // MIPS32EL:#define __mips__ 1 +// MIPS32EL:#define __mips_abicalls 1 // MIPS32EL:#define __mips_fpr 32 // MIPS32EL:#define __mips_hard_float 1 // MIPS32EL:#define __mips_o32 1 @@ -3555,6 +3557,7 @@ // MIPSN32BE: #define __mips64 1 // MIPSN32BE: #define __mips64__ 1 // MIPSN32BE: #define __mips__ 1 +// MIPSN32BE: #define __mips_abicalls 1 // MIPSN32BE: #define __mips_fpr 64 // MIPSN32BE: #define __mips_hard_float 1 // MIPSN32BE: #define __mips_isa_rev 2 @@ -3861,6 +3864,7 @@ // MIPSN32EL: #define __mips64 1 // MIPSN32EL: #define __mips64__ 1 // MIPSN32EL: #define __mips__ 1 +// MIPSN32EL: #define __mips_abicalls 1 // MIPSN32EL: #define __mips_fpr 64 // MIPSN32EL: #define __mips_hard_float 1 // MIPSN32EL: #define __mips_isa_rev 2 @@ -4073,6 +4077,7 @@ // MIPS64BE:#define __mips64 1 // MIPS64BE:#define __mips64__ 1 // MIPS64BE:#define __mips__ 1 +// MIPS64BE:#define __mips_abicalls 1 // MIPS64BE:#define __mips_fpr 64 // MIPS64BE:#define __mips_hard_float 1 // MIPS64BE:#define __mips_n64 1 @@ -4282,6 +4287,7 @@ // MIPS64EL:#define __mips64 1 // MIPS64EL:#define __mips64__ 1 // MIPS64EL:#define __mips__ 1 +// MIPS64EL:#define __mips_abicalls 1 // MIPS64EL:#define __mips_fpr 64 // MIPS64EL:#define __mips_hard_float 1 // MIPS64EL:#define __mips_n64 1 @@ -4513,6 +4519,45 @@ // MIPS-XXR6:#define __mips_fpr 64 // MIPS-XXR6:#define __mips_nan2008 1 // +// RUN: %clang_cc1 -target-cpu mips32 \ +// RUN: -E -dM -triple=mips-unknown-netbsd -mrelocation-model pic < /dev/null \ +// RUN: | FileCheck -match-full-lines -check-prefix MIPS-ABICALLS-NETBSD %s +// MIPS-ABICALLS-NETBSD-NOT: #define __ABICALLS__ 1 +// MIPS-ABICALLS-NETBSD: #define __mips_abicalls 1 +// +// RUN: %clang_cc1 -target-cpu mips64 \ +// RUN: -E -dM -triple=mips64-unknown-netbsd -mrelocation-model pic < \ +// RUN: /dev/null | FileCheck -match-full-lines \ +// RUN: -check-prefix MIPS-ABICALLS-NETBSD64 %s +// MIPS-ABICALLS-NETBSD64-NOT: #define __ABICALLS__ 1 +// MIPS-ABICALLS-NETBSD64: #define __mips_abicalls 1 +// +// RUN: %clang_cc1 -target-cpu mips32 \ +// RUN: -E -dM -triple=mips-unknown-freebsd -mrelocation-model pic < /dev/null \ +// RUN: | FileCheck -match-full-lines -check-prefix MIPS-ABICALLS-FREEBSD %s +// MIPS-ABICALLS-FREEBSD: #define __ABICALLS__ 1 +// MIPS-ABICALLS-FREEBSD: #define __mips_abicalls 1 +// +// RUN: %clang_cc1 -target-cpu mips64 \ +// RUN: -E -dM -triple=mips64-unknown-freebsd -mrelocation-model pic < \ +// RUN: /dev/null | FileCheck -match-full-lines \ +// RUN: -check-prefix MIPS-ABICALLS-FREEBSD64 %s +// MIPS-ABICALLS-FREEBSD64: #define __ABICALLS__ 1 +// MIPS-ABICALLS-FREEBSD64: #define __mips_abicalls 1 +// +// RUN: %clang_cc1 -target-cpu mips32 \ +// RUN: -E -dM -triple=mips-unknown-openbsd -mrelocation-model pic < /dev/null \ +// RUN: | FileCheck -match-full-lines -check-prefix MIPS-ABICALLS-OPENBSD %s +// MIPS-ABICALLS-OPENBSD: #define __ABICALLS__ 1 +// MIPS-ABICALLS-OPENBSD: #define __mips_abicalls 1 +// +// RUN: %clang_cc1 -target-cpu mips64 \ +// RUN: -E -dM -triple=mips64-unknown-openbsd -mrelocation-model pic < \ +// RUN: /dev/null | FileCheck -match-full-lines \ +// RUN: -check-prefix MIPS-ABICALLS-OPENBSD64 %s +// MIPS-ABICALLS-OPENBSD64: #define __ABICALLS__ 1 +// MIPS-ABICALLS-OPENBSD64: #define __mips_abicalls 1 +// // RUN: %clang_cc1 -E -dM -ffreestanding -triple=msp430-none-none < /dev/null | FileCheck -match-full-lines -check-prefix MSP430 %s // RUN: %clang_cc1 -x c++ -E -dM -ffreestanding -triple=msp430-none-none < /dev/null | FileCheck -match-full-lines -check-prefix MSP430 -check-prefix MSP430-CXX %s // -- 2.40.0