fix a nasty bug where we were not treating available_externally

symbols as declarations in the X86 backend.  This would manifest
on darwin x86-32 as errors like this with -fvisibility=hidden:

symbol '__ZNSbIcED1Ev' can not be undefined in a subtraction expression

This fixes PR7353.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105954 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-06-14 20:11:56 +00:00
parent 82c4fbbc2f
commit 6b601536ff
2 changed files with 31 additions and 3 deletions

View File

@ -53,9 +53,12 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const {
if (GV->hasDLLImportLinkage())
return X86II::MO_DLLIMPORT;
// Materializable GVs (in JIT lazy compilation mode) do not require an
// extra load from stub.
bool isDecl = GV->isDeclaration() && !GV->isMaterializable();
// Determine whether this is a reference to a definition or a declaration.
// Materializable GVs (in JIT lazy compilation mode) do not require an extra
// load from stub.
bool isDecl = GV->hasAvailableExternallyLinkage();
if (GV->isDeclaration() && !GV->isMaterializable())
isDecl = true;
// X86-64 in PIC mode.
if (isPICStyleRIPRel()) {

View File

@ -1,4 +1,27 @@
; RUN: llc < %s -mtriple=i386-apple-darwin9 -relocation-model=pic -disable-fp-elim -unwind-tables | FileCheck %s
; PR7353
define available_externally hidden
void @_ZNSbIcED1Ev() nounwind readnone ssp align 2 {
entry:
ret void
}
define void()* @test1() nounwind {
entry:
ret void()* @_ZNSbIcED1Ev
}
; This must use movl of the stub, not an lea, since the function isn't being
; emitted here.
; CHECK: movl L__ZNSbIcED1Ev$non_lazy_ptr-L1$pb(
; <rdar://problem/7383328>
@.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x i8]*> [#uses=1]
@ -28,3 +51,5 @@ return: ; preds = %entry
; CHECK: .private_extern _func.eh
; CHECK: .private_extern _main.eh