Fix issues with LLDB's interpreter and MS ABI guard variables.

MS ABI guard variables end with @4IA, so this patch teaches the
interpreter about that.  Additionally, there was an issue with
TurnGuardLoadIntoZero which was causing some guard uses of a
variable to be missed.  This fixes that by calling
Instruction::replaceAllUsesWith() instead of trying to replicate
that function.

llvm-svn: 225547
This commit is contained in:
Zachary Turner 2015-01-09 21:12:22 +00:00
parent 96fc9a2537
commit f16ae603e8
1 changed files with 7 additions and 15 deletions

View File

@ -2043,8 +2043,12 @@ static bool isGuardVariableRef(Value *V)
GlobalVariable *GV = dyn_cast<GlobalVariable>(Old);
if (!GV || !GV->hasName() || !GV->getName().startswith("_ZGV"))
if (!GV || !GV->hasName() ||
(!GV->getName().startswith("_ZGV") && // Itanium ABI guard variable
!GV->getName().endswith("@4IA"))) // Microsoft ABI guard variable
{
return false;
}
return true;
}
@ -2052,20 +2056,8 @@ static bool isGuardVariableRef(Value *V)
void
IRForTarget::TurnGuardLoadIntoZero(llvm::Instruction* guard_load)
{
Constant* zero(ConstantInt::get(Type::getInt8Ty(m_module->getContext()), 0, true));
for (llvm::User *u : guard_load->users())
{
if (isa<Constant>(u))
{
// do nothing for the moment
}
else
{
u->replaceUsesOfWith(guard_load, zero);
}
}
Constant *zero(Constant::getNullValue(guard_load->getType()));
guard_load->replaceAllUsesWith(zero);
guard_load->eraseFromParent();
}