[llvm] r312318 - Debug info for variables whose type is shrinked to bool
Richard Trieu via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 7 16:28:08 PDT 2017
On Tue, Sep 5, 2017 at 7:23 PM, Richard Trieu <rtrieu at google.com> wrote:
>
>
> 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
>>>
>>
>>
> I have reverted this commit and its related testcase in r312758.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170907/962ce0b8/attachment.html>
More information about the llvm-commits
mailing list