summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Driver/Tools.cpp11
-rw-r--r--clang/test/Driver/windows-pic.cpp59
2 files changed, 70 insertions, 0 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 5bab0ef4a8e..8ed12d72b40 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -3859,6 +3859,17 @@ ParsePICArgs(const ToolChain &ToolChain, const ArgList &Args) {
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)) {
+ ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
+ << LastPICArg->getSpelling() << Triple.str();
+ if (Triple.getArch() == llvm::Triple::x86_64)
+ return std::make_tuple(llvm::Reloc::PIC_, 2U, false);
+ return std::make_tuple(llvm::Reloc::Static, 0U, false);
+ }
+
// Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
// is forced, then neither PIC nor PIE flags will have no effect.
if (!ToolChain.isPICDefaultForced()) {
diff --git a/clang/test/Driver/windows-pic.cpp b/clang/test/Driver/windows-pic.cpp
new file mode 100644
index 00000000000..3b77a7cc5a3
--- /dev/null
+++ b/clang/test/Driver/windows-pic.cpp
@@ -0,0 +1,59 @@
+// RUN: %clang -### -target i686-windows -fPIC %s 2>&1 | FileCheck -check-prefix CHECK-PIC-ERROR %s
+// RUN: %clang -### -target i686-windows -fpic %s 2>&1 | FileCheck -check-prefix CHECK-pic-ERROR %s
+// RUN: %clang -### -target i686-windows -fPIE %s 2>&1 | FileCheck -check-prefix CHECK-PIE-ERROR %s
+// RUN: %clang -### -target i686-windows -fpie %s 2>&1 | FileCheck -check-prefix CHECK-pie-ERROR %s
+// RUN: %clang -### -target i686-windows -fPIC -fno-pic %s
+// RUN: %clang -### -target i686-windows -Fpic -fno-pic %s
+// RUN: %clang -### -target i686-windows -fPIE -fno-pie %s
+// RUN: %clang -### -target i686-windows -fpie -fno-pie %s
+
+// RUN: %clang -### -target i686-windows-itanium -fPIC %s 2>&1 | FileCheck -check-prefix CHECK-PIC-ERROR %s
+// RUN: %clang -### -target i686-windows-itanium -fpic %s 2>&1 | FileCheck -check-prefix CHECK-pic-ERROR %s
+// RUN: %clang -### -target i686-windows-itanium -fPIE %s 2>&1 | FileCheck -check-prefix CHECK-PIE-ERROR %s
+// RUN: %clang -### -target i686-windows-itanium -fpie %s 2>&1 | FileCheck -check-prefix CHECK-pie-ERROR %s
+// RUN: %clang -### -target i686-windows-itanium -fPIC -fno-pic %s
+// RUN: %clang -### -target i686-windows-itanium -Fpic -fno-pic %s
+// 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
+// RUN: %clang -### -target x86_64-windows -fpie %s 2>&1 | FileCheck -check-prefix CHECK-pie-ERROR %s
+// RUN: %clang -### -target x86_64-windows -fPIC -fno-pic %s
+// RUN: %clang -### -target x86_64-windows -Fpic -fno-pic %s
+// RUN: %clang -### -target x86_64-windows -fPIE -fno-pie %s
+// RUN: %clang -### -target x86_64-windows -fpie -fno-pie %s
+
+// RUN: %clang -### -target x86_64-windows-itanium -fPIC %s 2>&1 | FileCheck -check-prefix CHECK-PIC-ERROR %s
+// RUN: %clang -### -target x86_64-windows-itanium -fpic %s 2>&1 | FileCheck -check-prefix CHECK-pic-ERROR %s
+// RUN: %clang -### -target x86_64-windows-itanium -fPIE %s 2>&1 | FileCheck -check-prefix CHECK-PIE-ERROR %s
+// RUN: %clang -### -target x86_64-windows-itanium -fpie %s 2>&1 | FileCheck -check-prefix CHECK-pie-ERROR %s
+// RUN: %clang -### -target x86_64-windows-itanium -fPIC -fno-pic %s
+// RUN: %clang -### -target x86_64-windows-itanium -Fpic -fno-pic %s
+// 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 '{{.*}}
+// CHECK-pie-ERROR: unsupported option '-fpie' for target '{{.*}}
+
OpenPOWER on IntegriCloud