Fix PR6673: updating the callback should not clear the map.

llvm-svn: 99227
This commit is contained in:
Chris Lattner 2010-03-22 23:15:57 +00:00
parent 8d04f0604e
commit b1c4f62cac
2 changed files with 28 additions and 1 deletions

View File

@ -44,6 +44,10 @@ public:
MMIAddrLabelMapCallbackPtr() : Map(0) {}
MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V), Map(0) {}
void setPtr(BasicBlock *BB) {
ValueHandleBase::operator=(BB);
}
void setMap(MMIAddrLabelMap *map) { Map = map; }
virtual void deleted();
@ -209,7 +213,7 @@ void MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) {
// If New is not address taken, just move our symbol over to it.
if (NewEntry.Symbols.isNull()) {
BBCallbacks[OldEntry.Index] = New; // Update the callback.
BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback.
NewEntry = OldEntry; // Set New's entry.
return;
}

View File

@ -56,3 +56,26 @@ ret:
ret i32 -1
}
; PR6673
define i64 @test4a() {
%target = bitcast i8* blockaddress(@test4b, %usermain) to i8*
%ret = call i64 @test4b(i8* %target)
ret i64 %ret
}
define i64 @test4b(i8* %Code) {
entry:
indirectbr i8* %Code, [label %usermain]
usermain:
br label %label_line_0
label_line_0:
br label %label_line_1
label_line_1:
%target = ptrtoint i8* blockaddress(@test4b, %label_line_0) to i64
ret i64 %target
}