Make sure that the exception handling data has the same visibility as the

function it's generated for.

llvm-svn: 86779
This commit is contained in:
Bill Wendling 2009-11-11 01:24:59 +00:00
parent e6c8112572
commit 676f44062e
2 changed files with 37 additions and 2 deletions

View File

@ -232,11 +232,16 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
// corresponding function is static, this should not be externally visible.
if (!TheFunc->hasLocalLinkage())
if (const char *GlobalEHDirective = MAI->getGlobalEHDirective())
O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
O << GlobalEHDirective << EHFrameInfo.FnName << '\n';
// If corresponding function is weak definition, this should be too.
if (TheFunc->isWeakForLinker() && MAI->getWeakDefDirective())
O << MAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
O << MAI->getWeakDefDirective() << EHFrameInfo.FnName << '\n';
// If corresponding function is hidden, this should be too.
if (TheFunc->hasHiddenVisibility())
if (const char *HiddenDirective = MAI->getHiddenDirective())
O << HiddenDirective << EHFrameInfo.FnName << '\n' ;
// If there are no calls then you can't unwind. This may mean we can omit the
// EH Frame, but some environments do not handle weak absolute symbols. If

View File

@ -0,0 +1,30 @@
; RUN: llc < %s -march=x86 -relocation-model=pic -disable-fp-elim -unwind-tables | FileCheck %s
; <rdar://problem/7383328>
@.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x i8]*> [#uses=1]
define hidden void @func() nounwind ssp {
entry:
%0 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0]
br label %return
return: ; preds = %entry
ret void
}
declare i32 @puts(i8*)
define hidden i32 @main() nounwind ssp {
entry:
%retval = alloca i32 ; <i32*> [#uses=1]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
call void @func() nounwind
br label %return
return: ; preds = %entry
%retval1 = load i32* %retval ; <i32> [#uses=1]
ret i32 %retval1
}
; CHECK: .private_extern _func.eh
; CHECK: .private_extern _main.eh