diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1186,10 +1186,9 @@ options::OPT_fpic, options::OPT_fno_pic, options::OPT_fPIE, options::OPT_fno_PIE, options::OPT_fpie, options::OPT_fno_pie); - if (Triple.isOSWindows() && LastPICArg && - LastPICArg == - Args.getLastArg(options::OPT_fPIC, options::OPT_fpic, - options::OPT_fPIE, options::OPT_fpie)) { + if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg && + LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic, + options::OPT_fPIE, options::OPT_fpie)) { ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target) << LastPICArg->getSpelling() << Triple.str(); if (Triple.getArch() == llvm::Triple::x86_64) diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -486,10 +486,7 @@ return false; } -bool toolchains::MinGW::isPICDefaultForced() const { - return getArch() == llvm::Triple::x86_64 || - getArch() == llvm::Triple::aarch64; -} +bool toolchains::MinGW::isPICDefaultForced() const { return true; } llvm::ExceptionHandling toolchains::MinGW::GetExceptionModel(const ArgList &Args) const { diff --git a/clang/test/Driver/pic.c b/clang/test/Driver/pic.c --- a/clang/test/Driver/pic.c +++ b/clang/test/Driver/pic.c @@ -301,3 +301,13 @@ // RUN: | FileCheck %s --check-prefix=CHECK-PIC2 // RUN: %clang -c %s -target aarch64-windows-gnu -### 2>&1 \ // RUN: | FileCheck %s --check-prefix=CHECK-PIC2 +// +// On MinGW, allow specifying -fPIC & friends but ignore them +// RUN: %clang -fno-PIC -c %s -target x86_64-pc-windows-gnu -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-PIC2 +// RUN: %clang -fPIC -c %s -target i686-pc-windows-gnu -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC +// RUN: %clang -fno-PIC -c %s -target aarch64-pc-windows-gnu -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-PIC2 +// RUN: %clang -fPIC -c %s -target armv7-pc-windows-gnu -### 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-PIC diff --git a/clang/test/Driver/windows-pic.cpp b/clang/test/Driver/windows-pic.cpp --- a/clang/test/Driver/windows-pic.cpp +++ b/clang/test/Driver/windows-pic.cpp @@ -16,15 +16,6 @@ // RUN: %clang -### -target i686-windows-itanium -fPIE -fno-pie %s // RUN: %clang -### -target i686-windows-itanium -fpie -fno-pie %s -// RUN: %clang -### -target i686-windows-gnu -fPIC %s 2>&1 | FileCheck -check-prefix CHECK-PIC-ERROR %s -// RUN: %clang -### -target i686-windows-gnu -fpic %s 2>&1 | FileCheck -check-prefix CHECK-pic-ERROR %s -// RUN: %clang -### -target i686-windows-gnu -fPIE %s 2>&1 | FileCheck -check-prefix CHECK-PIE-ERROR %s -// RUN: %clang -### -target i686-windows-gnu -fpie %s 2>&1 | FileCheck -check-prefix CHECK-pie-ERROR %s -// RUN: %clang -### -target i686-windows-gnu -fPIC -fno-pic %s -// RUN: %clang -### -target i686-windows-gnu -Fpic -fno-pic %s -// RUN: %clang -### -target i686-windows-gnu -fPIE -fno-pie %s -// RUN: %clang -### -target i686-windows-gnu -fpie -fno-pie %s - // RUN: %clang -### -target x86_64-windows -fPIC %s 2>&1 | FileCheck -check-prefix CHECK-PIC-ERROR %s // RUN: %clang -### -target x86_64-windows -fpic %s 2>&1 | FileCheck -check-prefix CHECK-pic-ERROR %s // RUN: %clang -### -target x86_64-windows -fPIE %s 2>&1 | FileCheck -check-prefix CHECK-PIE-ERROR %s @@ -43,15 +34,6 @@ // RUN: %clang -### -target x86_64-windows-itanium -fPIE -fno-pie %s // RUN: %clang -### -target x86_64-windows-itanium -fpie -fno-pie %s -// RUN: %clang -### -target x86_64-windows-gnu -fPIC %s 2>&1 | FileCheck -check-prefix CHECK-PIC-ERROR %s -// RUN: %clang -### -target x86_64-windows-gnu -fpic %s 2>&1 | FileCheck -check-prefix CHECK-pic-ERROR %s -// RUN: %clang -### -target x86_64-windows-gnu -fPIE %s 2>&1 | FileCheck -check-prefix CHECK-PIE-ERROR %s -// RUN: %clang -### -target x86_64-windows-gnu -fpie %s 2>&1 | FileCheck -check-prefix CHECK-pie-ERROR %s -// RUN: %clang -### -target x86_64-windows-gnu -fPIC -fno-pic %s -// RUN: %clang -### -target x86_64-windows-gnu -Fpic -fno-pic %s -// RUN: %clang -### -target x86_64-windows-gnu -fPIE -fno-pie %s -// RUN: %clang -### -target x86_64-windows-gnu -fpie -fno-pie %s - // CHECK-PIC-ERROR: unsupported option '-fPIC' for target '{{.*}} // CHECK-pic-ERROR: unsupported option '-fpic' for target '{{.*}} // CHECK-PIE-ERROR: unsupported option '-fPIE' for target '{{.*}}