]> granicus.if.org Git - clang/commitdiff
Driver: warn on -fPIC/-fpic/-fPIE/-fpie on Windows
authorSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 26 Dec 2016 03:35:24 +0000 (03:35 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Mon, 26 Dec 2016 03:35:24 +0000 (03:35 +0000)
Use of these flags would result in the use of ELF-style PIE/PIC code
which is incorrect on Windows.  Windows is inherently PIC by means of
the DLL slide that occurs at load.  This also mirrors the behaviour on
GCC for MinGW.  Currently, the Windows x86_64 forces the relocation
model to PIC (Level 2).  This is unchanged for now, though we should
remove any assumptions on that and change it to a static relocation
model.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290533 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Tools.cpp
test/Driver/windows-pic.cpp [new file with mode: 0644]

index 5bab0ef4a8e8ea943a8ff67ba940ef4339aee316..8ed12d72b40891ab4618cf503debe67183c05b88 100644 (file)
@@ -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/test/Driver/windows-pic.cpp b/test/Driver/windows-pic.cpp
new file mode 100644 (file)
index 0000000..3b77a7c
--- /dev/null
@@ -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 '{{.*}}
+