Skip to content

Commit

Permalink
Teach LLVM about a PIE option which, when enabled on top of PIC, makes
Browse files Browse the repository at this point in the history
optimizations which are valid for position independent code being linked
into a single executable, but not for such code being linked into
a shared library.

I discussed the design of this with Eric Christopher, and the decision
was to support an optional bit rather than a completely separate
relocation model. Fundamentally, this is still PIC relocation, its just
that certain optimizations are only valid under a PIC relocation model
when the resulting code won't be in a shared library. The simplest path
to here is to expose a single bit option in the TargetOptions. If folks
have different/better designs, I'm all ears. =]

I've included the first optimization based upon this: changing TLS
models to the *Exec models when PIE is enabled. This is the LLVM
component of PR12380 and is all of the hard work.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154294 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
chandlerc committed Apr 8, 2012
1 parent 3479713 commit 253933e
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 3 deletions.
10 changes: 8 additions & 2 deletions include/llvm/Target/TargetOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ namespace llvm {
GuaranteedTailCallOpt(false), DisableTailCalls(false),
StackAlignmentOverride(0), RealignStack(true),
DisableJumpTables(false), EnableFastISel(false),
EnableSegmentedStacks(false), TrapFuncName(""),
FloatABIType(FloatABI::Default)
PositionIndependentExecutable(false), EnableSegmentedStacks(false),
TrapFuncName(""), FloatABIType(FloatABI::Default)
{}

/// PrintMachineCode - This flag is enabled when the -print-machineinstrs
Expand Down Expand Up @@ -164,6 +164,12 @@ namespace llvm {
/// compile time.
unsigned EnableFastISel : 1;

/// PositionIndependentExecutable - This flag indicates whether the code
/// will eventually be linked into a single executable, despite the PIC
/// relocation model being in use. It's value is undefined (and irrelevant)
/// if the relocation model is anything other than PIC.
unsigned PositionIndependentExecutable : 1;

unsigned EnableSegmentedStacks : 1;

/// getTrapFunctionName - If this returns a non-empty string, this means
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/TargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {
// For variables, is internal different from hidden?
bool isHidden = GV->hasHiddenVisibility();

if (getRelocationModel() == Reloc::PIC_) {
if (getRelocationModel() == Reloc::PIC_ &&
!Options.PositionIndependentExecutable) {
if (isLocal || isHidden)
return TLSModel::LocalDynamic;
else
Expand Down
64 changes: 64 additions & 0 deletions test/CodeGen/X86/tls-pie.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic -enable-pie \
; RUN: | FileCheck -check-prefix=X32 %s
; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-pie \
; RUN: | FileCheck -check-prefix=X64 %s

@i = thread_local global i32 15
@i2 = external thread_local global i32

define i32 @f1() {
; X32: f1:
; X32: movl %gs:i@NTPOFF, %eax
; X32-NEXT: ret
; X64: f1:
; X64: movabsq $i@TPOFF, %rax
; X64-NEXT: movl %fs:(%rax), %eax
; X64-NEXT: ret

entry:
%tmp1 = load i32* @i
ret i32 %tmp1
}

define i32* @f2() {
; X32: f2:
; X32: movl %gs:0, %eax
; X32-NEXT: leal i@NTPOFF(%eax), %eax
; X32-NEXT: ret
; X64: f2:
; X64: movq %fs:0, %rax
; X64-NEXT: addq $i@TPOFF, %rax
; X64-NEXT: ret

entry:
ret i32* @i
}

define i32 @f3() {
; X32: f3:
; X32: movl i2@INDNTPOFF, %eax
; X32-NEXT: movl %gs:(%eax), %eax
; X32-NEXT: ret
; X64: f3:
; X64: movq i2@GOTTPOFF(%rip), %rax
; X64-NEXT: movl %fs:(%rax), %eax
; X64-NEXT: ret

entry:
%tmp1 = load i32* @i2
ret i32 %tmp1
}

define i32* @f4() {
; X32: f4:
; X32: movl %gs:0, %eax
; X32-NEXT: addl i2@INDNTPOFF, %eax
; X32-NEXT: ret
; X64: f4:
; X64: movq %fs:0, %rax
; X64-NEXT: addq i2@GOTTPOFF(%rip), %rax
; X64-NEXT: ret

entry:
ret i32* @i2
}
6 changes: 6 additions & 0 deletions tools/llc/llc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,11 @@ TrapFuncName("trap-func", cl::Hidden,
cl::desc("Emit a call to trap function rather than a trap instruction"),
cl::init(""));

static cl::opt<bool>
EnablePIE("enable-pie",
cl::desc("Assume the creation of a position independent executable."),
cl::init(false));

static cl::opt<bool>
SegmentedStacks("segmented-stacks",
cl::desc("Use segmented stacks if possible."),
Expand Down Expand Up @@ -467,6 +472,7 @@ int main(int argc, char **argv) {
Options.RealignStack = EnableRealignStack;
Options.DisableJumpTables = DisableSwitchTables;
Options.TrapFuncName = TrapFuncName;
Options.PositionIndependentExecutable = EnablePIE;
Options.EnableSegmentedStacks = SegmentedStacks;

std::auto_ptr<TargetMachine>
Expand Down

0 comments on commit 253933e

Please sign in to comment.