Bug 233143 - cc -mcmodel=large croaks on <ctype.h>
Summary: cc -mcmodel=large croaks on <ctype.h>
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: CURRENT
Hardware: Any Any
: --- Affects Some People
Assignee: freebsd-toolchain mailing list
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-11-11 18:17 UTC by Poul-Henning Kamp
Modified: 2019-02-27 22:09 UTC (History)
1 user (show)

See Also:
dim: mfc-stable11+
dim: mfc-stable12+


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Poul-Henning Kamp freebsd_committer 2018-11-11 18:17:06 UTC
This trivial C-program:

    #include <ctype.h>
    #include <stdio.h>
    
    int
    main(int argc, char **argv)
    {
        printf("%d\n", isalpha(argv[0][0]));
        return(0);
    }

Fails when compiled with -mcmodel=large:

   critter phk> cc -mcmodel=large a.c
   fatal error: error in backend: Cannot select: t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<%struct._RuneLocale** @_ThreadRuneLocale> 0 [TF=10]
     t9: i64 = TargetGlobalTLSAddress<%struct._RuneLocale** @_ThreadRuneLocale> 0 [TF=10]
   In function: __getCurrentRuneLocale
   cc: error: clang frontend command failed with exit code 70 (use -v to see invocation)
   FreeBSD clang version 6.0.1 (tags/RELEASE_601/final 335540) (based on LLVM 6.0.1)
   Target: x86_64-unknown-freebsd12.0
   Thread model: posix
   InstalledDir: /usr/bin
   cc: note: diagnostic msg: PLEASE submit a bug report to https://bugs.freebsd.org/submit/ and include the crash backtrace, preprocessed source, and associated run script.
   cc: note: diagnostic msg:
   ********************

   PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
   Preprocessed source(s) and associated run script(s) are located at:
   cc: note: diagnostic msg: /tmp/a-ac1fdc.c
   cc: note: diagnostic msg: /tmp/a-ac1fdc.sh
   cc: note: diagnostic msg:

   ********************

This is on:

    FreeBSD 12.0-ALPHA8 #13 r339250M: Tue Oct  9 14:43:35 UTC 2018
Comment 1 Dimitry Andric freebsd_committer 2018-11-12 17:06:42 UTC
Unfortunately, at this time, LLVM does not support large model in combination with TLS and position-dependent code.  Upstream bug (which has quite a number of duplicates):

https://bugs.llvm.org/show_bug.cgi?id=26906

Possible workarounds:
* Don't use TLS
* Don't use -mcmodel=large
* Use -fPIE or -fPIC
Comment 2 commit-hook freebsd_committer 2019-02-24 21:22:33 UTC
A commit references this bug:

Author: dim
Date: Sun Feb 24 21:22:17 UTC 2019
New revision: 344503
URL: https://svnweb.freebsd.org/changeset/base/344503

Log:
  Pull in r354756 from upstream llvm trunk (by Craig Topper):

    [X86] Fix tls variable lowering issue with large code model

    Summary:
    The problem here is the lowering for tls variable. Below is the DAG
    for the code. SelectionDAG has 11 nodes:

    t0: ch = EntryToken
  	t8: i64,ch = load<(load 8 from `i8 addrspace(257)* null`,
  	addrspace 257)> t0, Constant:i64<0>, undef:i64
  	  t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i32*
  	  @x> 0 [TF=10]
  	t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64
        t12: i64 = add t8, t11
      t4: i32,ch = load<(dereferenceable load 4 from @x)> t0, t12,
      undef:i64
    t6: ch = CopyToReg t0, Register:i32 %0, t4

    And when mcmodel is large, below instruction can NOT be folded.

      t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i32* @x> 0
      [TF=10]
    t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64

    So "t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64" is
    lowered to " Morphed node: t11: i64,ch = MOV64rm<Mem:(load 8 from
    got)> t10, TargetConstant:i8<1>, Register:i64 $noreg,
    TargetConstant:i32<0>, Register:i32 $noreg, t0"

    When llvm start to lower "t10: i64 = X86ISD::WrapperRIP
    TargetGlobalTLSAddress:i64<i32* @x> 0 [TF=10]", it fails.

    The patch is to fold the load and X86ISD::WrapperRIP.

    Fixes PR26906

    Patch by LuoYuanke

    Reviewers: craig.topper, rnk, annita.zhang, wxiao3

    Reviewed By: rnk

    Subscribers: llvm-commits

    Tags: #llvm

    Differential Revision: https://reviews.llvm.org/D58336

  This should fix "fatal error: error in backend: Cannot select" messages
  when compiling <ctype.h> functions using -mcmodel=large.

  Reported by:	phk
  PR:		233143
  MFC after:	3 days

Changes:
  head/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
Comment 3 commit-hook freebsd_committer 2019-02-27 22:03:27 UTC
A commit references this bug:

Author: dim
Date: Wed Feb 27 22:02:47 UTC 2019
New revision: 344639
URL: https://svnweb.freebsd.org/changeset/base/344639

Log:
  MFC r344503:

  Pull in r354756 from upstream llvm trunk (by Craig Topper):

    [X86] Fix tls variable lowering issue with large code model

    Summary:
    The problem here is the lowering for tls variable. Below is the DAG
    for the code. SelectionDAG has 11 nodes:

    t0: ch = EntryToken
  	t8: i64,ch = load<(load 8 from `i8 addrspace(257)* null`,
  	addrspace 257)> t0, Constant:i64<0>, undef:i64
  	  t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i32*
  	  @x> 0 [TF=10]
  	t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64
        t12: i64 = add t8, t11
      t4: i32,ch = load<(dereferenceable load 4 from @x)> t0, t12,
      undef:i64
    t6: ch = CopyToReg t0, Register:i32 %0, t4

    And when mcmodel is large, below instruction can NOT be folded.

      t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i32* @x> 0
      [TF=10]
    t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64

    So "t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64" is
    lowered to " Morphed node: t11: i64,ch = MOV64rm<Mem:(load 8 from
    got)> t10, TargetConstant:i8<1>, Register:i64 $noreg,
    TargetConstant:i32<0>, Register:i32 $noreg, t0"

    When llvm start to lower "t10: i64 = X86ISD::WrapperRIP
    TargetGlobalTLSAddress:i64<i32* @x> 0 [TF=10]", it fails.

    The patch is to fold the load and X86ISD::WrapperRIP.

    Fixes PR26906

    Patch by LuoYuanke

    Reviewers: craig.topper, rnk, annita.zhang, wxiao3

    Reviewed By: rnk

    Subscribers: llvm-commits

    Tags: #llvm

    Differential Revision: https://reviews.llvm.org/D58336

  This should fix "fatal error: error in backend: Cannot select" messages
  when compiling <ctype.h> functions using -mcmodel=large.

  Reported by:	phk
  PR:		233143

Changes:
_U  stable/11/
  stable/11/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
_U  stable/12/
  stable/12/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp