1
0
mirror of https://github.com/c64scene-ar/llvm-6502.git synced 2024-12-14 11:32:34 +00:00

Fix bug: Assembler/2003-05-15-AssemblerProblem.llx

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6234 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-05-15 19:37:21 +00:00
parent a60f855dc6
commit 608f4b0287
2 changed files with 14 additions and 4 deletions

View File

@ -721,9 +721,8 @@ unsigned Constant::mutateReferences(Value *OldV, Value *NewV) {
GlobalValue *OldGV = CPR->getValue(); GlobalValue *OldGV = CPR->getValue();
assert(OldGV == OldV && "Cannot mutate old value if I'm not using it!"); assert(OldGV == OldV && "Cannot mutate old value if I'm not using it!");
OldGV->getParent()->mutateConstantPointerRef(OldGV, NewGV);
Operands[0] = NewGV; Operands[0] = NewGV;
OldGV->getParent()->mutateConstantPointerRef(OldGV, NewGV);
return 1; return 1;
} else { } else {
Constant *NewC = cast<Constant>(NewV); Constant *NewC = cast<Constant>(NewV);

View File

@ -250,6 +250,7 @@ void Module::destroyConstantPointerRef(ConstantPointerRef *CPR) {
} }
void Module::mutateConstantPointerRef(GlobalValue *OldGV, GlobalValue *NewGV) { void Module::mutateConstantPointerRef(GlobalValue *OldGV, GlobalValue *NewGV) {
assert(OldGV != NewGV && "Cannot mutate to the same global!");
GlobalValueRefMap::iterator I = GVRefMap->Map.find(OldGV); GlobalValueRefMap::iterator I = GVRefMap->Map.find(OldGV);
assert(I != GVRefMap->Map.end() && assert(I != GVRefMap->Map.end() &&
"mutateConstantPointerRef; OldGV not in table!"); "mutateConstantPointerRef; OldGV not in table!");
@ -258,6 +259,16 @@ void Module::mutateConstantPointerRef(GlobalValue *OldGV, GlobalValue *NewGV) {
// Remove the old entry... // Remove the old entry...
GVRefMap->Map.erase(I); GVRefMap->Map.erase(I);
// Check to see if a CPR already exists for NewGV
I = GVRefMap->Map.lower_bound(NewGV);
if (I == GVRefMap->Map.end() || I->first != NewGV) {
// Insert the new entry... // Insert the new entry...
GVRefMap->Map.insert(std::make_pair(NewGV, Ref)); GVRefMap->Map.insert(I, std::make_pair(NewGV, Ref));
} else {
// Otherwise, an entry already exists for the current global value.
// Completely replace the old CPR with the existing one...
Ref->replaceAllUsesWith(I->second);
delete Ref;
}
} }