r290569 - Driver: switch Windows to static RelocModel

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 28 09:37:16 PST 2016


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 at 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 at 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 <rnk at 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 at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161228/83dba723/attachment-0001.html>


More information about the cfe-commits mailing list