mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-04 16:47:41 +00:00
Debug info for variables whose type is shrinked to bool
This patch provides such debug information for integer variables whose type is shrinked to bool by providing dwarf expression which returns either constant initial value or other value. Patch by Nikola Prica. Differential Revision: https://reviews.llvm.org/D35994 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312318 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1a4fd5c74c
commit
707fb1cf0c
@ -338,6 +338,7 @@ void DwarfExpression::addExpression(DIExpressionCursor &&ExprCursor,
|
||||
break;
|
||||
case dwarf::DW_OP_plus:
|
||||
case dwarf::DW_OP_minus:
|
||||
case dwarf::DW_OP_mul:
|
||||
emitOp(Op->getOp());
|
||||
break;
|
||||
case dwarf::DW_OP_deref:
|
||||
|
@ -643,6 +643,7 @@ bool DIExpression::isValid() const {
|
||||
case dwarf::DW_OP_plus_uconst:
|
||||
case dwarf::DW_OP_plus:
|
||||
case dwarf::DW_OP_minus:
|
||||
case dwarf::DW_OP_mul:
|
||||
case dwarf::DW_OP_deref:
|
||||
case dwarf::DW_OP_xderef:
|
||||
break;
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -1603,12 +1604,47 @@ static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) {
|
||||
assert(InitVal->getType() != Type::getInt1Ty(GV->getContext()) &&
|
||||
"No reason to shrink to bool!");
|
||||
|
||||
SmallVector<DIGlobalVariableExpression *, 1> GVs;
|
||||
GV->getDebugInfo(GVs);
|
||||
|
||||
// If initialized to zero and storing one into the global, we can use a cast
|
||||
// instead of a select to synthesize the desired value.
|
||||
bool IsOneZero = false;
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(OtherVal))
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(OtherVal)){
|
||||
IsOneZero = InitVal->isNullValue() && CI->isOne();
|
||||
|
||||
ConstantInt *CIInit = dyn_cast<ConstantInt>(GV->getInitializer());
|
||||
uint64_t ValInit = CIInit->getZExtValue();
|
||||
uint64_t ValOther = CI->getZExtValue();
|
||||
uint64_t ValMinus = ValOther - ValInit;
|
||||
|
||||
for(auto *GVe : GVs){
|
||||
DIGlobalVariable *DGV = GVe->getVariable();
|
||||
DIExpression *E = GVe->getExpression();
|
||||
|
||||
// val * (ValOther - ValInit) + ValInit:
|
||||
// DW_OP_deref DW_OP_constu <ValMinus>
|
||||
// DW_OP_mul DW_OP_constu <ValInit> DW_OP_plus DW_OP_stack_value
|
||||
E = DIExpression::get(NewGV->getContext(),
|
||||
{dwarf::DW_OP_deref,
|
||||
dwarf::DW_OP_constu,
|
||||
ValMinus,
|
||||
dwarf::DW_OP_mul,
|
||||
dwarf::DW_OP_constu,
|
||||
ValInit,
|
||||
dwarf::DW_OP_plus,
|
||||
dwarf::DW_OP_stack_value});
|
||||
DIGlobalVariableExpression *DGVE =
|
||||
DIGlobalVariableExpression::get(NewGV->getContext(), DGV, E);
|
||||
NewGV->addDebugInfo(DGVE);
|
||||
}
|
||||
} else {
|
||||
// FIXME: This will only emit address for debugger on which will
|
||||
// be written only 0 or 1.
|
||||
for(auto *GV : GVs)
|
||||
NewGV->addDebugInfo(GV);
|
||||
}
|
||||
|
||||
while (!GV->use_empty()) {
|
||||
Instruction *UI = cast<Instruction>(GV->user_back());
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(UI)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user