[llvm-commits] [llvm] r154294 - in /llvm/trunk: include/llvm/Target/TargetOptions.h lib/Target/TargetMachine.cpp test/CodeGen/X86/tls-pie.ll tools/llc/llc.cpp
Jeffrey Yasskin
jyasskin at googlers.com
Sun Apr 8 10:59:26 PDT 2012
2¢:
On Sun, Apr 8, 2012 at 10:51 AM, Chandler Carruth <chandlerc at gmail.com> wrote:
> Author: chandlerc
> Date: Sun Apr 8 12:51:45 2012
> New Revision: 154294
>
> URL: http://llvm.org/viewvc/llvm-project?rev=154294&view=rev
> Log:
> Teach LLVM about a PIE option which, when enabled on top of PIC, makes
> 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.
>
> Added:
> llvm/trunk/test/CodeGen/X86/tls-pie.ll
> Modified:
> llvm/trunk/include/llvm/Target/TargetOptions.h
> llvm/trunk/lib/Target/TargetMachine.cpp
> llvm/trunk/tools/llc/llc.cpp
>
> Modified: llvm/trunk/include/llvm/Target/TargetOptions.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetOptions.h?rev=154294&r1=154293&r2=154294&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetOptions.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetOptions.h Sun Apr 8 12:51:45 2012
> @@ -42,8 +42,8 @@
> 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
> @@ -164,6 +164,12 @@
> /// 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;
> +
I would likely name this "MayBeLinkedIntoSharedObject" and reverse its
sense. -fpic should make it default to true, while -fpie and no such
option should make it default to false. If I understand correctly,
-fpie is exactly equivalent to -fpic -fno-may-link-into-shared-object
(or some better spelling)?
> unsigned EnableSegmentedStacks : 1;
>
> /// getTrapFunctionName - If this returns a non-empty string, this means
>
> Modified: llvm/trunk/lib/Target/TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetMachine.cpp?rev=154294&r1=154293&r2=154294&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/TargetMachine.cpp Sun Apr 8 12:51:45 2012
> @@ -82,7 +82,8 @@
> // For variables, is internal different from hidden?
> bool isHidden = GV->hasHiddenVisibility();
>
> - if (getRelocationModel() == Reloc::PIC_) {
> + if (getRelocationModel() == Reloc::PIC_ &&
> + !Options.PositionIndependentExecutable) {
With MayBeLinkedIntoSharedObject, this becomes a single condition
expressing the actual intent.
> if (isLocal || isHidden)
> return TLSModel::LocalDynamic;
> else
>
> Added: llvm/trunk/test/CodeGen/X86/tls-pie.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/tls-pie.ll?rev=154294&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/tls-pie.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/tls-pie.ll Sun Apr 8 12:51:45 2012
> @@ -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
> +
> + at i = thread_local global i32 15
> + at i2 = external thread_local global i32
> +
> +define i32 @f1() {
> +; X32: f1:
> +; X32: movl %gs:i at NTPOFF, %eax
> +; X32-NEXT: ret
> +; X64: f1:
> +; X64: movabsq $i at 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 at NTPOFF(%eax), %eax
> +; X32-NEXT: ret
> +; X64: f2:
> +; X64: movq %fs:0, %rax
> +; X64-NEXT: addq $i at TPOFF, %rax
> +; X64-NEXT: ret
> +
> +entry:
> + ret i32* @i
> +}
> +
> +define i32 @f3() {
> +; X32: f3:
> +; X32: movl i2 at INDNTPOFF, %eax
> +; X32-NEXT: movl %gs:(%eax), %eax
> +; X32-NEXT: ret
> +; X64: f3:
> +; X64: movq i2 at 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 at INDNTPOFF, %eax
> +; X32-NEXT: ret
> +; X64: f4:
> +; X64: movq %fs:0, %rax
> +; X64-NEXT: addq i2 at GOTTPOFF(%rip), %rax
> +; X64-NEXT: ret
> +
> +entry:
> + ret i32* @i2
> +}
>
> Modified: llvm/trunk/tools/llc/llc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=154294&r1=154293&r2=154294&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llc/llc.cpp (original)
> +++ llvm/trunk/tools/llc/llc.cpp Sun Apr 8 12:51:45 2012
> @@ -263,6 +263,11 @@
> 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."),
> cl::init(false));
> @@ -467,6 +472,7 @@
> Options.RealignStack = EnableRealignStack;
> Options.DisableJumpTables = DisableSwitchTables;
> Options.TrapFuncName = TrapFuncName;
> + Options.PositionIndependentExecutable = EnablePIE;
> Options.EnableSegmentedStacks = SegmentedStacks;
>
> std::auto_ptr<TargetMachine>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list