Author: compnerd Date: Sun Dec 25 21:35:24 2016 New Revision: 290533 URL: http://llvm.org/viewvc/llvm-project?rev=290533&view=rev Log: Driver: warn on -fPIC/-fpic/-fPIE/-fpie on Windows
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. Added: cfe/trunk/test/Driver/windows-pic.cpp Modified: cfe/trunk/lib/Driver/Tools.cpp Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=290533&r1=290532&r2=290533&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Sun Dec 25 21:35:24 2016 @@ -3859,6 +3859,17 @@ ParsePICArgs(const ToolChain &ToolChain, 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()) { Added: cfe/trunk/test/Driver/windows-pic.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/windows-pic.cpp?rev=290533&view=auto ============================================================================== --- cfe/trunk/test/Driver/windows-pic.cpp (added) +++ cfe/trunk/test/Driver/windows-pic.cpp Sun Dec 25 21:35:24 2016 @@ -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 '{{.*}} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits