This affected code generation of jump tables from switches. This was the assembly difference for a switch when going from PIC to static:
$ cat t.cpp void g(int); void f(int x) { switch (x) { case 0: g(0); break; case 1: g(1); break; case 2: g(2); break; case 3: g(3); break; case 4: g(4); break; case 5: g(5); break; case 6: g(6); break; case 7: g(7); break; case 8: g(8); break; case 9: g(9); break; } g(10); } $ clang -cc1 t.cpp -S -o - -munwind-tables -mrelocation-model pic -o pic.s $ clang -cc1 t.cpp -S -o - -munwind-tables -mrelocation-model static -o static.s $ diff -u pic.s static.s --- pic.s 2016-12-28 09:32:48.190468800 -0800 +++ static.s 2016-12-28 09:32:53.476899200 -0800 @@ -21,11 +21,9 @@ movq %rax, 40(%rsp) movq %rdx, 32(%rsp) ja .LBB0_11 - leaq .LJTI0_0(%rip), %rax - movq 40(%rsp), %rcx - movslq (%rax,%rcx,4), %rdx - addq %rax, %rdx - jmpq *%rdx + movq 40(%rsp), %rax + movq .LJTI0_0(,%rax,8), %rcx + jmpq *%rcx .LBB0_1: xorl %ecx, %ecx callq "?g@@YAXH@Z" @@ -71,20 +69,21 @@ nop addq $56, %rsp retq - .p2align 2, 0x90 + .section .rdata,"dr" + .p2align 3 .LJTI0_0: - .long .LBB0_1-.LJTI0_0 - .long .LBB0_2-.LJTI0_0 - .long .LBB0_3-.LJTI0_0 - .long .LBB0_4-.LJTI0_0 - .long .LBB0_5-.LJTI0_0 - .long .LBB0_6-.LJTI0_0 - .long .LBB0_7-.LJTI0_0 - .long .LBB0_8-.LJTI0_0 - .long .LBB0_9-.LJTI0_0 - .long .LBB0_10-.LJTI0_0 + .quad .LBB0_1 + .quad .LBB0_2 + .quad .LBB0_3 + .quad .LBB0_4 + .quad .LBB0_5 + .quad .LBB0_6 + .quad .LBB0_7 + .quad .LBB0_8 + .quad .LBB0_9 + .quad .LBB0_10 .seh_handlerdata - .text + .section .rdata,"dr" .Lcfi3: .seh_endproc I think we actually want the .rdata section, but we probably want to use ".long .LBB0_N@IMGREL" jump table entries. This triggers a latent bug in unwind info emission, because .seh_endproc is in the wrong section (.rdata, not .text). Let's revert, fix the latent bug, make switch lowering do what we want, and then re-land. On Wed, Dec 28, 2016 at 9:10 AM, Reid Kleckner <r...@google.com> wrote: > I suspect this broke Win64: > http://lab.llvm.org:8011/builders/clang-x64-ninja-win7/builds/1410 > > On Mon, Dec 26, 2016 at 6:20 PM, Saleem Abdulrasool via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> Author: compnerd >> Date: Mon Dec 26 20:20:35 2016 >> New Revision: 290569 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=290569&view=rev >> Log: >> Driver: switch Windows to static RelocModel >> >> Windows uses PE/COFF which is inherently position independent. The use >> of the PIC model is unnecessary. In fact, we would generate invalid >> code using the ELF PIC model when PIC was enabled previously. Now that >> we no longer accept -fPIC and -fpoc, this switches the internal >> representation to the static model to permit us to make PIC modules >> invalid when targeting Windows. This should not change the code >> generation, only the internal state management. >> >> Modified: >> cfe/trunk/lib/Driver/MSVCToolChain.cpp >> cfe/trunk/lib/Driver/ToolChains.cpp >> cfe/trunk/lib/Driver/ToolChains.h >> cfe/trunk/test/Driver/pic.c >> >> Modified: cfe/trunk/lib/Driver/MSVCToolChain.cpp >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/MSV >> CToolChain.cpp?rev=290569&r1=290568&r2=290569&view=diff >> ============================================================ >> ================== >> --- cfe/trunk/lib/Driver/MSVCToolChain.cpp (original) >> +++ cfe/trunk/lib/Driver/MSVCToolChain.cpp Mon Dec 26 20:20:35 2016 >> @@ -82,18 +82,6 @@ bool MSVCToolChain::IsUnwindTablesDefaul >> return getArch() == llvm::Triple::x86_64; >> } >> >> -bool MSVCToolChain::isPICDefault() const { >> - return getArch() == llvm::Triple::x86_64; >> -} >> - >> -bool MSVCToolChain::isPIEDefault() const { >> - return false; >> -} >> - >> -bool MSVCToolChain::isPICDefaultForced() const { >> - return getArch() == llvm::Triple::x86_64; >> -} >> - >> #ifdef USE_WIN32 >> static bool readFullStringValue(HKEY hkey, const char *valueName, >> std::string &value) { >> >> Modified: cfe/trunk/lib/Driver/ToolChains.cpp >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Too >> lChains.cpp?rev=290569&r1=290568&r2=290569&view=diff >> ============================================================ >> ================== >> --- cfe/trunk/lib/Driver/ToolChains.cpp (original) >> +++ cfe/trunk/lib/Driver/ToolChains.cpp Mon Dec 26 20:20:35 2016 >> @@ -2880,22 +2880,13 @@ bool Generic_GCC::IsUnwindTablesDefault( >> >> bool Generic_GCC::isPICDefault() const { >> switch (getArch()) { >> - case llvm::Triple::x86_64: >> - return getTriple().isOSWindows(); >> + default: return false; >> case llvm::Triple::ppc64: >> case llvm::Triple::ppc64le: >> return !getTriple().isOSBinFormatMachO() && !getTriple().isMacOSX(); >> - default: >> - return false; >> } >> } >> >> -bool Generic_GCC::isPIEDefault() const { return false; } >> - >> -bool Generic_GCC::isPICDefaultForced() const { >> - return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows(); >> -} >> - >> bool Generic_GCC::IsIntegratedAssemblerDefault() const { >> switch (getTriple().getArch()) { >> case llvm::Triple::x86: >> >> Modified: cfe/trunk/lib/Driver/ToolChains.h >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Too >> lChains.h?rev=290569&r1=290568&r2=290569&view=diff >> ============================================================ >> ================== >> --- cfe/trunk/lib/Driver/ToolChains.h (original) >> +++ cfe/trunk/lib/Driver/ToolChains.h Mon Dec 26 20:20:35 2016 >> @@ -232,8 +232,8 @@ public: >> >> bool IsUnwindTablesDefault() const override; >> bool isPICDefault() const override; >> - bool isPIEDefault() const override; >> - bool isPICDefaultForced() const override; >> + bool isPIEDefault() const override { return false; } >> + bool isPICDefaultForced() const override { return false; } >> bool IsIntegratedAssemblerDefault() const override; >> llvm::opt::DerivedArgList * >> TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef >> BoundArch, >> @@ -1136,9 +1136,9 @@ public: >> >> bool IsIntegratedAssemblerDefault() const override; >> bool IsUnwindTablesDefault() const override; >> - bool isPICDefault() const override; >> - bool isPIEDefault() const override; >> - bool isPICDefaultForced() const override; >> + bool isPICDefault() const override { return false; } >> + bool isPIEDefault() const override { return false; } >> + bool isPICDefaultForced() const override { return false; } >> >> void >> AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, >> >> Modified: cfe/trunk/test/Driver/pic.c >> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/pi >> c.c?rev=290569&r1=290568&r2=290569&view=diff >> ============================================================ >> ================== >> --- cfe/trunk/test/Driver/pic.c (original) >> +++ cfe/trunk/test/Driver/pic.c Mon Dec 26 20:20:35 2016 >> @@ -255,9 +255,4 @@ >> // RUN: | FileCheck %s --check-prefix=CHECK-PIC1 >> // RUN: %clang -c %s -target arm64-linux-android -### 2>&1 \ >> // RUN: | FileCheck %s --check-prefix=CHECK-PIC1 >> -// >> -// On Windows-X64 PIC is enabled by default >> -// RUN: %clang -c %s -target x86_64-pc-windows-msvc18.0.0 -### 2>&1 \ >> -// RUN: | FileCheck %s --check-prefix=CHECK-PIC2 >> -// RUN: %clang -c %s -target x86_64-pc-windows-gnu -### 2>&1 \ >> -// RUN: | FileCheck %s --check-prefix=CHECK-PIC2 >> + >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits