diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 0a123a67bfb049e26ff67451cc02d82dac9cd73d..deca2658a995916df14b754f1cd40c8a0c13a357 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -7049,8 +7049,22 @@ void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-mabi"); CmdArgs.push_back(ABIName.data()); - // LLVM doesn't support -mabicalls yet and acts as if it is always given. - CmdArgs.push_back("-mno-shared"); + // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE, + // or -mshared (not implemented) is in effect. + bool IsPicOrPie = false; + if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, + options::OPT_fpic, options::OPT_fno_pic, + options::OPT_fPIE, options::OPT_fno_PIE, + options::OPT_fpie, options::OPT_fno_pie)) { + if (A->getOption().matches(options::OPT_fPIC) || + A->getOption().matches(options::OPT_fpic) || + A->getOption().matches(options::OPT_fPIE) || + A->getOption().matches(options::OPT_fpie)) + IsPicOrPie = true; + } + if (!IsPicOrPie) + CmdArgs.push_back("-mno-shared"); + // LLVM doesn't support -mplt yet and acts as if it is always given. // However, -mplt has no effect with the N64 ABI. CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic"); diff --git a/test/Driver/mips-as.c b/test/Driver/mips-as.c index fd046c7ffa317d43f933ec0e7f7fe5adf36d0f18..ecbe7d668f96bf359e703de1227cc8e2183837a7 100644 --- a/test/Driver/mips-as.c +++ b/test/Driver/mips-as.c @@ -12,7 +12,7 @@ // RUN: %clang -target mips-linux-gnu -### \ // RUN: -no-integrated-as -fPIC -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS32R2-EB-PIC %s -// MIPS32R2-EB-PIC: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" +// MIPS32R2-EB-PIC: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-call_nonpic" "-EB" // MIPS32R2-EB-PIC: "-KPIC" // // RUN: %clang -target mipsel-linux-gnu -### \