fix PR10286, a problem with the .ll printer handling block addresses that are out-of-scope.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136768 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2011-08-03 06:15:41 +00:00
parent 027cbf9329
commit fb5179a2fa
2 changed files with 43 additions and 11 deletions

View File

@ -1037,26 +1037,35 @@ static void WriteAsOperandInternal(raw_ostream &Out, const Value *V,
char Prefix = '%';
int Slot;
// If we have a SlotTracker, use it.
if (Machine) {
if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
Slot = Machine->getGlobalSlot(GV);
Prefix = '@';
} else {
Slot = Machine->getLocalSlot(V);
// If the local value didn't succeed, then we may be referring to a value
// from a different function. Translate it, as this can happen when using
// address of blocks.
if (Slot == -1)
if ((Machine = createSlotTracker(V))) {
Slot = Machine->getLocalSlot(V);
delete Machine;
}
}
} else {
Machine = createSlotTracker(V);
if (Machine) {
if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
Slot = Machine->getGlobalSlot(GV);
Prefix = '@';
} else {
Slot = Machine->getLocalSlot(V);
}
delete Machine;
} else if ((Machine = createSlotTracker(V))) {
// Otherwise, create one to get the # and then destroy it.
if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
Slot = Machine->getGlobalSlot(GV);
Prefix = '@';
} else {
Slot = -1;
Slot = Machine->getLocalSlot(V);
}
delete Machine;
Machine = 0;
} else {
Slot = -1;
}
if (Slot != -1)

View File

@ -0,0 +1,23 @@
; RUN: opt %s -strip -S | FileCheck %s
; PR10286
@main_addrs = constant [2 x i8*] [i8* blockaddress(@f, %FOO), i8* blockaddress(@f, %BAR)]
; CHECK: @main_addrs = constant [2 x i8*] [i8* blockaddress(@f, %2), i8* blockaddress(@f, %3)]
declare void @foo() nounwind
declare void @bar() nounwind
define void @f(i8* %indirect.goto.dest) nounwind uwtable ssp {
entry:
indirectbr i8* %indirect.goto.dest, [label %FOO, label %BAR]
; CHECK: indirectbr i8* %0, [label %2, label %3]
FOO:
call void @foo()
ret void
BAR:
call void @bar()
ret void
}