[llvm] r312318 - Debug info for variables whose type is shrinked to bool
Richard Trieu via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 5 19:23:05 PDT 2017
On Tue, Sep 5, 2017 at 2:44 PM, Richard Trieu <rtrieu at google.com> wrote:
> +Nikola
>
> On Fri, Sep 1, 2017 at 3:05 AM, Strahinja Petrovic via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: spetrovic
>> Date: Fri Sep 1 03:05:27 2017
>> New Revision: 312318
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=312318&view=rev
>> Log:
>> 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
>>
>> Modified:
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
>> llvm/trunk/lib/IR/DebugInfoMetadata.cpp
>> llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/A
>> smPrinter/DwarfExpression.cpp?rev=312318&r1=312317&r2=312318&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Fri Sep 1
>> 03:05:27 2017
>> @@ -338,6 +338,7 @@ void DwarfExpression::addExpression(DIEx
>> 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:
>>
>> Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugI
>> nfoMetadata.cpp?rev=312318&r1=312317&r2=312318&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)
>> +++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Fri Sep 1 03:05:27 2017
>> @@ -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;
>>
>> Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transform
>> s/IPO/GlobalOpt.cpp?rev=312318&r1=312317&r2=312318&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Fri Sep 1 03:05:27 2017
>> @@ -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(G
>> 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();
>>
>
> I am seeing a crash from a null dereference at this point. dyn_cast can
> return in a null pointer and is usually a sign of trouble if it is not
> check for non-nullness before use. In this case, CIInit can possibly be
> null. I am reducing a test case at the moment, and will update with more
> details.
>
>
>> + 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)) {
>>
>> See https://bugs.llvm.org/show_bug.cgi?id=34490 for details.
Short story,
$ cat test.c
a[];
static long b = a;
fn1() {
a > b;
b = 0;
}
$ clang -w -O2 test.c
Crash
>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170905/2a765c48/attachment.html>
More information about the llvm-commits
mailing list