[LLVMdev] Win32 JIT issue + bug in ScheduleDAGSNodes.h?

Bill Wendling isanbard at gmail.com
Wed Dec 31 11:46:44 PST 2008


On Dec 31, 2008, at 5:57 AM, srs wrote:

> Bill Wendling wrote:
>> On Dec 30, 2008, at 4:51 PM, srs wrote:
>>
>>
>>> 2. There seems to be an issue in ScheduleDAGSDNodes.h when in debug
>>> mode. The problem is the evaluation of "&SUnits[0];" which  
>>> ASSERT's in
>>> VC++'s vector[] implementation (when _HAS_ITERATOR_DEBUGGING is on).
>>>
>>> As a work-around, I commented out the debug code (see "patch"  
>>> below.)
>>>
>>> What would the proper solution be? The idiom appears to be allowed  
>>> by
>>> the C++03 standard, but at least VC++ 2008 Express Edition with
>>> _HAS_ITERATOR_DEBUGGING fails.
>>>
>>>
>> What is the assertion message?
>>
>>
> "vector subscript out of range"
>
> This is the asserting code from <vector> :
>
>
>    const_reference operator[](size_type _Pos) const
>        {    // subscript nonmutable sequence
>
> #if _HAS_ITERATOR_DEBUGGING
>        if (size() <= _Pos)
>            {
>            _DEBUG_ERROR("vector subscript out of range");
>            _SCL_SECURE_OUT_OF_RANGE;
>            }
> #endif /* _HAS_ITERATOR_DEBUGGING */
>        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
>
>        return (*(_Myfirst + _Pos));
>        }
>
>
Okay. I wonder if we can modify it to check that the vector has  
elements in it. Could you try this patch and let me know if it works  
for you?

-bw

Index: include/llvm/CodeGen/ScheduleDAGSDNodes.h
===================================================================
--- include/llvm/CodeGen/ScheduleDAGSDNodes.h	(revision 61532)
+++ include/llvm/CodeGen/ScheduleDAGSDNodes.h	(working copy)
@@ -103,10 +103,13 @@
      ///
      SUnit *NewSUnit(SDNode *N) {
  #ifndef NDEBUG
-      const SUnit *Addr = &SUnits[0];
+      const SUnit *Addr = 0;
+      if (SUnits.size() > 0)
+        Addr = &SUnits[0];
  #endif
        SUnits.push_back(SUnit(N, (unsigned)SUnits.size()));
-      assert(Addr == &SUnits[0] && "SUnits std::vector reallocated on  
the fly!");
+      assert((Addr == 0 || Addr == &SUnits[0]) &&
+             "SUnits std::vector reallocated on the fly!");
        SUnits.back().OrigNode = &SUnits.back();
        return &SUnits.back();
      }




More information about the llvm-dev mailing list