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.
This fixes between 8 and 10 tests on Windows, and in particular fixes
evaluation of C / C++ local variables.
http://reviews.llvm.org/D6859
Files:
source/Expression/IRForTarget.cpp
Index: source/Expression/IRForTarget.cpp
===================================================================
--- source/Expression/IRForTarget.cpp
+++ source/Expression/IRForTarget.cpp
@@ -2043,8 +2043,12 @@
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 @@
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();
}
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: source/Expression/IRForTarget.cpp
===================================================================
--- source/Expression/IRForTarget.cpp
+++ source/Expression/IRForTarget.cpp
@@ -2043,8 +2043,12 @@
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 @@
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();
}
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits