Skip to content

Commit

Permalink
[mips] Notify user that -mabicalls is ignored on non-PIC N64 ABI
Browse files Browse the repository at this point in the history
The -mabicalls option does not make sense in the case of non position
independent code for the N64 ABI. After this change the driver shows a
warning that -mabicalls is ignored in that case.

Differential revision: https://reviews.llvm.org/D36550

llvm-svn: 310613
  • Loading branch information
atanasyan committed Aug 10, 2017
1 parent 7b5eaa6 commit 3306e3a
Showing 4 changed files with 27 additions and 3 deletions.
4 changes: 4 additions & 0 deletions clang/include/clang/Basic/DiagnosticDriverKinds.td
Original file line number Diff line number Diff line change
@@ -292,6 +292,10 @@ def warn_drv_unsupported_gpopt : Warning<
"ignoring '-mgpopt' option as it cannot be used with %select{|the implicit"
" usage of }0-mabicalls">,
InGroup<UnsupportedGPOpt>;
def warn_drv_unsupported_abicalls : Warning<
"ignoring '-mabicalls' option as it cannot be used with "
"non position-independent code and the N64 ABI">,
InGroup<OptionIgnored>;

def warn_drv_unable_to_find_directory_expected : Warning<
"unable to find %0 directory, expected to be in '%1'">,
18 changes: 15 additions & 3 deletions clang/lib/Driver/ToolChains/Arch/Mips.cpp
Original file line number Diff line number Diff line change
@@ -227,11 +227,23 @@ void mips::getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
}

if (IsN64 && NonPIC)
bool UseAbiCalls = false;

Arg *ABICallsArg =
Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
UseAbiCalls =
!ABICallsArg ||
(ABICallsArg && ABICallsArg->getOption().matches(options::OPT_mabicalls));

if (UseAbiCalls && IsN64 && NonPIC) {
D.Diag(diag::warn_drv_unsupported_abicalls);
UseAbiCalls = false;
}

if (!UseAbiCalls)
Features.push_back("+noabicalls");
else
AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
options::OPT_mabicalls, "noabicalls");
Features.push_back("-noabicalls");

mips::FloatABI FloatABI = mips::getMipsFloatABI(D, Args);
if (FloatABI == mips::FloatABI::Soft) {
3 changes: 3 additions & 0 deletions clang/test/Driver/mips-abicalls-warning.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// REQUIRES: mips-registered-target
// RUN: %clang -### -c -target mips64-mti-elf -fno-PIC -mabicalls %s 2>&1 | FileCheck %s
// CHECK: warning: ignoring '-mabicalls' option as it cannot be used with non position-independent code and the N64 ABI
5 changes: 5 additions & 0 deletions clang/test/Driver/mips-features.c
Original file line number Diff line number Diff line change
@@ -10,6 +10,11 @@
// RUN: | FileCheck --check-prefix=CHECK-MNOABICALLS %s
// CHECK-MNOABICALLS: "-target-feature" "+noabicalls"
//
// -mno-abicalls non-PIC N64
// RUN: %clang -target mips64-linux-gnu -### -c -fno-PIC %s 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-MNOABICALLS-N64NPIC %s
// CHECK-MNOABICALLS-N64NPIC: "-target-feature" "+noabicalls"
//
// -mgpopt
// RUN: %clang -target mips-linux-gnu -### -c %s -mno-gpopt -mgpopt -Wno-unsupported-gpopt 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-MGPOPT-DEF-ABICALLS %s

0 comments on commit 3306e3a

Please sign in to comment.