diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-07-16 22:53:10 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-07-16 22:53:10 +0000 |
commit | a82b22c667f66224edaf83f33815c8015fb74444 (patch) | |
tree | 0889ff136f20106ba11ddeb84f77b7f051383b15 /lib/Target/X86/X86Subtarget.cpp | |
parent | 423ccfe51daa699a969cd716ce3a69cb2ada6234 (diff) |
GV with ghost linkage (module being lazily streamed in in JIT lazy compilation mode) do not require extra load from stub. This fixes ExecutionEngine/2005-12-02-TailCallBug.ll.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76121 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86Subtarget.cpp')
-rw-r--r-- | lib/Target/X86/X86Subtarget.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp index 597f5653a3..678139addc 100644 --- a/lib/Target/X86/X86Subtarget.cpp +++ b/lib/Target/X86/X86Subtarget.cpp @@ -44,6 +44,10 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { if (GV->hasDLLImportLinkage()) return X86II::MO_DLLIMPORT; + // GV with ghost linkage (in JIT lazy compilation mode) do not require an + // extra load from stub. + bool isDecl = GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode(); + // X86-64 in PIC mode. if (isPICStyleRIPRel()) { // Large model never uses stubs. @@ -55,7 +59,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { // target is x86-64 or the symbol is definitely defined in the current // translation unit. if (GV->hasDefaultVisibility() && - (GV->isDeclaration() || GV->isWeakForLinker())) + (isDecl || GV->isWeakForLinker())) return X86II::MO_GOTPCREL; } else { assert(isTargetELF() && "Unknown rip-relative target"); @@ -81,7 +85,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { // If this is a strong reference to a definition, it is definitely not // through a stub. - if (!GV->isDeclaration() && !GV->isWeakForLinker()) + if (!isDecl && !GV->isWeakForLinker()) return X86II::MO_PIC_BASE_OFFSET; // Unless we have a symbol with hidden visibility, we have to go through a @@ -91,7 +95,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { // If symbol visibility is hidden, we have a stub for common symbol // references and external declarations. - if (GV->isDeclaration() || GV->hasCommonLinkage()) { + if (isDecl || GV->hasCommonLinkage()) { // Hidden $non_lazy_ptr reference. return X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE; } @@ -105,7 +109,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { // If this is a strong reference to a definition, it is definitely not // through a stub. - if (!GV->isDeclaration() && !GV->isWeakForLinker()) + if (!isDecl && !GV->isWeakForLinker()) return X86II::MO_NO_FLAG; // Unless we have a symbol with hidden visibility, we have to go through a @@ -115,7 +119,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const { // If symbol visibility is hidden, we have a stub for common symbol // references and external declarations. - if (GV->isDeclaration() || GV->hasCommonLinkage()) { + if (isDecl || GV->hasCommonLinkage()) { // Hidden $non_lazy_ptr reference. return X86II::MO_DARWIN_HIDDEN_NONLAZY; } |