Index: llvm/trunk/include/llvm/CodeGen/CommandFlags.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/CommandFlags.h +++ llvm/trunk/include/llvm/CodeGen/CommandFlags.h @@ -198,11 +198,6 @@ cl::init("")); cl::opt -EnablePIE("enable-pie", - cl::desc("Assume the creation of a position independent executable."), - cl::init(false)); - -cl::opt UseCtors("use-ctors", cl::desc("Use .ctors instead of .init_array."), cl::init(false)); @@ -290,7 +285,6 @@ Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt; Options.StackAlignmentOverride = OverrideStackAlignment; Options.StackSymbolOrdering = StackSymbolOrdering; - Options.PositionIndependentExecutable = EnablePIE; Options.UseInitArray = !UseCtors; Options.DataSections = DataSections; Options.FunctionSections = FunctionSections; Index: llvm/trunk/lib/Target/TargetMachine.cpp =================================================================== --- llvm/trunk/lib/Target/TargetMachine.cpp +++ llvm/trunk/lib/Target/TargetMachine.cpp @@ -109,7 +109,7 @@ bool isLocal = GV->hasLocalLinkage(); bool isDeclaration = GV->isDeclaration(); bool isPIC = getRelocationModel() == Reloc::PIC_; - bool isPIE = Options.PositionIndependentExecutable; + bool isPIE = GV->getParent()->getPIELevel() != PIELevel::Default; // FIXME: what should we do for protected and internal visibility? // For variables, is internal different from hidden? bool isHidden = GV->hasHiddenVisibility(); Index: llvm/trunk/lib/Target/X86/X86Subtarget.h =================================================================== --- llvm/trunk/lib/Target/X86/X86Subtarget.h +++ llvm/trunk/lib/Target/X86/X86Subtarget.h @@ -552,7 +552,7 @@ /// Executable (PIE) where its definition cannot be interposed. bool isGlobalDefinedInPIE(const GlobalValue *GV, const TargetMachine &TM) const { - return TM.Options.PositionIndependentExecutable && + return GV->getParent()->getPIELevel() != PIELevel::Default && !GV->isDeclarationForLinker(); } Index: llvm/trunk/lib/Target/X86/X86Subtarget.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86Subtarget.cpp +++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp @@ -159,8 +159,7 @@ // we don't need to use the PLT - we can directly call it. // In PIE mode, calls to global functions don't need to go through PLT if (isTargetELF() && TM.getRelocationModel() == Reloc::PIC_ && - (!TM.Options.PositionIndependentExecutable || - GV->isDeclarationForLinker()) && + !isGlobalDefinedInPIE(GV, TM) && GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) { return X86II::MO_PLT; } else if (isPICStyleStubAny() && !GV->isStrongDefinitionForLinker() && Index: llvm/trunk/test/CodeGen/X86/emutls-pie.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/emutls-pie.ll +++ llvm/trunk/test/CodeGen/X86/emutls-pie.ll @@ -1,10 +1,10 @@ -; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -enable-pie \ +; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X32 %s -; RUN: llc < %s -emulated-tls -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-pie \ +; RUN: llc < %s -emulated-tls -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X64 %s -; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-android -relocation-model=pic -enable-pie \ +; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-android -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X32 %s -; RUN: llc < %s -emulated-tls -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-android -relocation-model=pic -enable-pie \ +; RUN: llc < %s -emulated-tls -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-android -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X64 %s ; Use my_emutls_get_address like __emutls_get_address. @@ -129,3 +129,8 @@ ; X64-NOT: __emutls_v.i2 ; X64-NOT: __emutls_t.i2 + + +!llvm.module.flags = !{!0, !1} +!0 = !{i32 1, !"PIC Level", i32 1} +!1 = !{i32 1, !"PIE Level", i32 1} Index: llvm/trunk/test/CodeGen/X86/global-access-pie.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/global-access-pie.ll +++ llvm/trunk/test/CodeGen/X86/global-access-pie.ll @@ -1,6 +1,6 @@ -; RUN: llc < %s -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-pie \ +; RUN: llc < %s -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X64 %s -; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -enable-pie \ +; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X32 %s ; External Linkage @@ -117,3 +117,7 @@ %call = call i32 @access_fp(i32 ()* @bar) ret i32 %call } + +!llvm.module.flags = !{!0, !1} +!0 = !{i32 1, !"PIC Level", i32 1} +!1 = !{i32 1, !"PIE Level", i32 1} Index: llvm/trunk/test/CodeGen/X86/pie.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/pie.ll +++ llvm/trunk/test/CodeGen/X86/pie.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -O0 -mcpu=generic -mtriple=i686-linux-gnu -relocation-model=pic -enable-pie | FileCheck %s -; RUN: llc < %s -O0 -mcpu=generic -mtriple=i686-linux-gnu -fast-isel -relocation-model=pic -enable-pie | FileCheck %s -; RUN: llc < %s -O0 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-pie | FileCheck %s -; RUN: llc < %s -O0 -mcpu=generic -mtriple=x86_64-linux-gnu -fast-isel -relocation-model=pic -enable-pie | FileCheck %s +; RUN: llc < %s -O0 -mcpu=generic -mtriple=i686-linux-gnu -relocation-model=pic | FileCheck %s +; RUN: llc < %s -O0 -mcpu=generic -mtriple=i686-linux-gnu -fast-isel -relocation-model=pic | FileCheck %s +; RUN: llc < %s -O0 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck %s +; RUN: llc < %s -O0 -mcpu=generic -mtriple=x86_64-linux-gnu -fast-isel -relocation-model=pic | FileCheck %s ; CHECK-LABEL: bar: ; CHECK: call{{l|q}} foo{{$}} @@ -39,3 +39,7 @@ } ; -fpie for local global data tests should be added here + +!llvm.module.flags = !{!0, !1} +!0 = !{i32 1, !"PIC Level", i32 1} +!1 = !{i32 1, !"PIE Level", i32 1} Index: llvm/trunk/test/CodeGen/X86/tls-pie.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/tls-pie.ll +++ llvm/trunk/test/CodeGen/X86/tls-pie.ll @@ -1,6 +1,6 @@ -; RUN: llc < %s -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -enable-pie \ +; RUN: llc < %s -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X32 %s -; RUN: llc < %s -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-pie \ +; RUN: llc < %s -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \ ; RUN: | FileCheck -check-prefix=X64 %s @i = thread_local global i32 15 @@ -79,3 +79,7 @@ entry: ret i32* @i2 } + +!llvm.module.flags = !{!0, !1} +!0 = !{i32 1, !"PIC Level", i32 1} +!1 = !{i32 1, !"PIE Level", i32 1}