diff options
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 11 | ||||
-rw-r--r-- | clang/test/Driver/windows-pic.cpp | 59 |
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 '{{.*}} + |