Index: include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- include/clang/Basic/DiagnosticDriverKinds.td +++ include/clang/Basic/DiagnosticDriverKinds.td @@ -339,10 +339,12 @@ "ignoring '-mlong-calls' option as it is not currently supported with " "%select{|the implicit usage of }0-mabicalls">, InGroup; -def warn_drv_unsupported_abicalls : Warning< - "ignoring '-mabicalls' option as it cannot be used with " - "non position-independent code and the N64 ABI">, +def warn_drv_unsupported_pic_with_mabicalls : Warning< + "ignoring '%0' option as it cannot be used with " + "%select{implicit|explicit}1 use of -mabicalls and the N64 ABI">, InGroup; +def err_drv_unsupported_noabicalls_pic : Error< + "position-independent code requires ‘-mabicalls’">; def err_drv_unsupported_indirect_jump_opt : Error< "'-mindirect-jump=%0' is unsupported with the '%1' architecture">; def err_drv_unknown_indirect_jump_opt : Error< Index: lib/Driver/ToolChains/Arch/Mips.cpp =================================================================== --- lib/Driver/ToolChains/Arch/Mips.cpp +++ lib/Driver/ToolChains/Arch/Mips.cpp @@ -214,6 +214,7 @@ // For case (a) we need to add +noabicalls for N64. bool IsN64 = ABIName == "64"; + bool IsPIC = false; bool NonPIC = false; Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, @@ -225,6 +226,9 @@ NonPIC = (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) || O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie)); + IsPIC = + (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) || + O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)); } bool UseAbiCalls = false; @@ -234,9 +238,14 @@ UseAbiCalls = !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls); - if (UseAbiCalls && IsN64 && NonPIC) { - D.Diag(diag::warn_drv_unsupported_abicalls); - UseAbiCalls = false; + if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) { + D.Diag(diag::warn_drv_unsupported_pic_with_mabicalls) + << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1); + NonPIC = false; + } + + if (ABICallsArg && !UseAbiCalls && IsPIC) { + D.Diag(diag::err_drv_unsupported_noabicalls_pic); } if (!UseAbiCalls) Index: lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- lib/Driver/ToolChains/CommonArgs.cpp +++ lib/Driver/ToolChains/CommonArgs.cpp @@ -1018,6 +1018,14 @@ Triple.getArch() == llvm::Triple::mipsel || Triple.getArch() == llvm::Triple::mips64 || Triple.getArch() == llvm::Triple::mips64el) { + StringRef CPUName; + StringRef ABIName; + mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); + // For n64 ABI, PIC is always true, except in case when -mno-abicalls + // option is used. And we exit at next check if that's true, + // regardless of PIC being set below. + if (ABIName == "n64") + PIC = true; // When targettng MIPS with -mno-abicalls, it's always static. if(Args.hasArg(options::OPT_mno_abicalls)) return std::make_tuple(llvm::Reloc::Static, 0U, false); Index: test/Driver/mips-abicalls-error.c =================================================================== --- /dev/null +++ test/Driver/mips-abicalls-error.c @@ -0,0 +1,2 @@ +// RUN: not %clang -c -target mips64-linux-gnu -fPIC -mno-abicalls %s 2>&1 | FileCheck %s +// CHECK: error: position-independent code requires ‘-mabicalls’ Index: test/Driver/mips-abicalls-warning.c =================================================================== --- test/Driver/mips-abicalls-warning.c +++ test/Driver/mips-abicalls-warning.c @@ -1,6 +1,15 @@ // 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 +// RUN: %clang -### -c -target mips64-mti-elf -fno-pic %s 2>&1 | FileCheck -check-prefix=CHECK-PIC1-IMPLICIT %s +// CHECK-PIC1-IMPLICIT: warning: ignoring '-fno-pic' option as it cannot be used with implicit use of -mabicalls and the N64 ABI + +// RUN: %clang -### -c -target mips64-mti-elf -fno-pic -mabicalls %s 2>&1 | FileCheck -check-prefix=CHECK-PIC1-EXPLICIT %s +// CHECK-PIC1-EXPLICIT: warning: ignoring '-fno-pic' option as it cannot be used with explicit use of -mabicalls and the N64 ABI + +// RUN: %clang -### -c -target mips64-mti-elf -fno-PIC %s 2>&1 | FileCheck -check-prefix=CHECK-PIC2-IMPLICIT %s +// CHECK-PIC2-IMPLICIT: warning: ignoring '-fno-PIC' option as it cannot be used with implicit use of -mabicalls and the N64 ABI + +// RUN: %clang -### -c -target mips64-mti-elf -fno-PIC -mabicalls %s 2>&1 | FileCheck -check-prefix=CHECK-PIC2-EXPLICIT %s +// CHECK-PIC2-EXPLICIT: warning: ignoring '-fno-PIC' option as it cannot be used with explicit use of -mabicalls and the N64 ABI // RUN: %clang -### -c -target mips-mti-elf -mlong-calls %s 2>&1 | FileCheck -check-prefix=LONGCALL-IMP %s // LONGCALL-IMP: warning: ignoring '-mlong-calls' option as it is not currently supported with the implicit usage of -mabicalls Index: test/Driver/mips-as.c =================================================================== --- test/Driver/mips-as.c +++ test/Driver/mips-as.c @@ -21,7 +21,7 @@ // MIPS32R2-DEF-EL-AS: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EL" // // RUN: %clang -target mips64-linux-gnu -### \ -// RUN: -no-integrated-as -fno-pic -c %s 2>&1 \ +// RUN: -no-integrated-as -fno-pic -mno-abicalls -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS64R2-EB-AS %s // MIPS64R2-EB-AS: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-mno-shared" "-EB" // @@ -31,7 +31,7 @@ // MIPS64R2-EB-AS-PIC: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-EB" "-KPIC" // // RUN: %clang -target mips64el-linux-gnu -### \ -// RUN: -no-integrated-as -c -fno-pic %s 2>&1 \ +// RUN: -no-integrated-as -c -fno-pic -mno-abicalls %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS64R2-DEF-EL-AS %s // MIPS64R2-DEF-EL-AS: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-mno-shared" "-EL" // @@ -64,7 +64,7 @@ // MIPS64R2-EL-AS-PIC: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-EL" "-KPIC" // // RUN: %clang -target mips64el-linux-gnu -mabi=64 -### \ -// RUN: -no-integrated-as -c %s -fno-pic 2>&1 \ +// RUN: -no-integrated-as -c %s -fno-pic -mno-abicalls 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS64R2-EL-AS %s // MIPS64R2-EL-AS: as{{(.exe)?}}" "-march" "mips64r2" "-mabi" "64" "-mno-shared" "-EL" // @@ -84,7 +84,7 @@ // MIPS-OCTEON-PIC: as{{(.exe)?}}" "-march" "octeon" "-mabi" "64" "-EB" "-KPIC" // // RUN: %clang -target mips64-linux-gnu -march=octeon -### \ -// RUN: -no-integrated-as -c %s -fno-pic 2>&1 \ +// RUN: -no-integrated-as -c %s -fno-pic -mno-abicalls 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-OCTEON %s // MIPS-OCTEON: as{{(.exe)?}}" "-march" "octeon" "-mabi" "64" "-mno-shared" "-EB" // @@ -144,7 +144,7 @@ // MIPS-ALIAS-64-PIC: as{{(.exe)?}}" "-march" "mips64" "-mabi" "64" "-EB" "-KPIC" // // RUN: %clang -target mips64-linux-gnu -mips64 -### \ -// RUN: -no-integrated-as -c -fno-pic %s 2>&1 \ +// RUN: -no-integrated-as -c -fno-pic -mno-abicalls %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-ALIAS-64 %s // MIPS-ALIAS-64: as{{(.exe)?}}" "-march" "mips64" "-mabi" "64" "-mno-shared" "-EB" // @@ -159,7 +159,7 @@ // MIPS-ALIAS-64R3-PIC: as{{(.exe)?}}" "-march" "mips64r3" "-mabi" "64" "-EB" "-KPIC" // // RUN: %clang -target mips64-linux-gnu -mips64r3 -### \ -// RUN: -no-integrated-as -c %s -fno-pic 2>&1 \ +// RUN: -no-integrated-as -c %s -fno-pic -mno-abicalls 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-ALIAS-64R3 %s // MIPS-ALIAS-64R3: as{{(.exe)?}}" "-march" "mips64r3" "-mabi" "64" "-mno-shared" "-EB" // @@ -169,7 +169,7 @@ // MIPS-ALIAS-64R5-PIC: as{{(.exe)?}}" "-march" "mips64r5" "-mabi" "64" "-EB" "-KPIC" // // RUN: %clang -target mips64-linux-gnu -mips64r5 -### \ -// RUN: -no-integrated-as -c %s -fno-pic 2>&1 \ +// RUN: -no-integrated-as -c %s -fno-pic -mno-abicalls 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-ALIAS-64R5 %s // MIPS-ALIAS-64R5: as{{(.exe)?}}" "-march" "mips64r5" "-mabi" "64" "-mno-shared" "-EB" // @@ -179,7 +179,7 @@ // MIPS-ALIAS-64R6-PIC: as{{(.exe)?}}" "-march" "mips64r6" "-mabi" "64" "-EB" "-KPIC" // // RUN: %clang -target mips64-linux-gnu -mips64r6 -### \ -// RUN: -no-integrated-as -c %s -fno-pic 2>&1 \ +// RUN: -no-integrated-as -c %s -fno-pic -mno-abicalls 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-ALIAS-64R6 %s // MIPS-ALIAS-64R6: as{{(.exe)?}}" "-march" "mips64r6" "-mabi" "64" "-mno-shared" "-EB" // Index: test/Driver/mips-features.c =================================================================== --- test/Driver/mips-features.c +++ test/Driver/mips-features.c @@ -11,7 +11,7 @@ // CHECK-MNOABICALLS: "-target-feature" "+noabicalls" // // -mno-abicalls non-PIC N64 -// RUN: %clang -target mips64-linux-gnu -### -c -fno-PIC %s 2>&1 \ +// RUN: %clang -target mips64-linux-gnu -### -c -fno-PIC -mno-abicalls %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-MNOABICALLS-N64NPIC %s // CHECK-MNOABICALLS-N64NPIC: "-target-feature" "+noabicalls" // @@ -86,13 +86,13 @@ // CHECK-MEMBEDDEDDATADEF-NOT: "-mllvm" "-membedded-data" // // MIPS64 + N64: -fno-pic -> -mno-abicalls -mgpopt -// RUN: %clang -target mips64-mti-elf -mabi=64 -### -c %s -fno-pic 2>&1 \ +// RUN: %clang -target mips64-mti-elf -mabi=64 -### -c %s -fno-pic -mno-abicalls 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-N64-GPOPT %s // CHECK-N64-GPOPT: "-target-feature" "+noabicalls" // CHECK-N64-GPOPT: "-mllvm" "-mgpopt" // // MIPS64 + N64: -fno-pic -mno-gpopt -// RUN: %clang -target mips64-mti-elf -mabi=64 -### -c %s -fno-pic -mno-gpopt 2>&1 \ +// RUN: %clang -target mips64-mti-elf -mabi=64 -### -c %s -fno-pic -mno-abicalls -mno-gpopt 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-N64-MNO-GPOPT %s // CHECK-N64-MNO-GPOPT: "-target-feature" "+noabicalls" // CHECK-N64-MNO-GPOPT-NOT: "-mllvm" "-mgpopt"