diff options
| author | Kristina Brooks <kristina@nym.hush.com> | 2018-10-18 03:14:37 +0000 |
|---|---|---|
| committer | Kristina Brooks <kristina@nym.hush.com> | 2018-10-18 03:14:37 +0000 |
| commit | 312fcc116bc2d38d852ba1fd08c6840bf828ec36 (patch) | |
| tree | 46ca85d68e34f538340197789b046a55ef56637d /llvm/lib/Target/X86 | |
| parent | a35912da9f44f7f3b885a4c1f567b1ac672978e1 (diff) | |
| download | bcm5719-llvm-312fcc116bc2d38d852ba1fd08c6840bf828ec36.tar.gz bcm5719-llvm-312fcc116bc2d38d852ba1fd08c6840bf828ec36.zip | |
[X86] Support for the mno-tls-direct-seg-refs flag
Allows to disable direct TLS segment access (%fs or %gs). GCC supports
a similar flag, it can be useful in some circumstances, e.g. when a thread
context block needs to be updated directly from user space. More info
and specific use cases: https://bugs.llvm.org/show_bug.cgi?id=16145
There is another revision for clang as well.
Related: D53102
All X86 CodeGen tests appear to pass:
```
[46/47] Running lit suite /SourceCache/llvm-trunk-8.0/test/CodeGen
Testing Time: 23.17s
Expected Passes : 3801
Expected Failures : 15
Unsupported Tests : 8021
```
Reviewed by: Craig Topper.
Patch by nruslan (Ruslan Nikolaev).
Differential Revision: https://reviews.llvm.org/D53103
llvm-svn: 344723
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index c06ad11589d..d6bcdcdf149 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -165,6 +165,9 @@ namespace { /// If true, selector should try to optimize for minimum code size. bool OptForMinSize; + /// Disable direct TLS access through segment registers. + bool IndirectTlsSegRefs; + public: explicit X86DAGToDAGISel(X86TargetMachine &tm, CodeGenOpt::Level OptLevel) : SelectionDAGISel(tm, OptLevel), OptForSize(false), @@ -177,6 +180,8 @@ namespace { bool runOnMachineFunction(MachineFunction &MF) override { // Reset the subtarget each time through. Subtarget = &MF.getSubtarget<X86Subtarget>(); + IndirectTlsSegRefs = MF.getFunction().hasFnAttribute( + "indirect-tls-seg-refs"); SelectionDAGISel::runOnMachineFunction(MF); return true; } @@ -981,6 +986,7 @@ bool X86DAGToDAGISel::matchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM){ // For more information see http://people.redhat.com/drepper/tls.pdf if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Address)) if (C->getSExtValue() == 0 && AM.Segment.getNode() == nullptr && + !IndirectTlsSegRefs && (Subtarget->isTargetGlibc() || Subtarget->isTargetAndroid() || Subtarget->isTargetFuchsia())) switch (N->getPointerInfo().getAddrSpace()) { |

