[llvm] r278532 - ADT: Remove the ilist_nextprev_traits customization point

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 17:18:39 PDT 2016


> On 2016-Aug-12, at 17:14, Duncan P. N. Exon Smith via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
>> 
>> On 2016-Aug-12, at 17:12, Yung, Douglas <douglas.yung at sony.com> wrote:
>> 
>> Hi Duncan,
>> 
>> Here is a stack trace from the failure of CodeGen\X86\fast-isel-i1.ll.
>> 
>> Command: llc.exe fast-isel-i1.ll -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1
>> 
>> In the Visual Studio debugger, I get "Unhandled exception at 0x000000013FF1708F in llc.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF."
>> 
>> The stack trace at the point of failure is:
>> 
>>> 	llc.exe!llvm::MachineInstr::getOpcode() Line 286	C++
>> 	llc.exe!llvm::X86FrameLowering::emitEpilogue(llvm::MachineFunction & MF, llvm::MachineBasicBlock & MBB) Line 1483	C++

There is no call to getOpcode() on this line.  It looks like you haven't picked up the fix in r278572 yet (or, likely, Hans's fix in r278577).  Can you cherry-pick in those commits and do an incremental build?

>> 	llc.exe!`anonymous namespace'::PEI::insertPrologEpilogCode(llvm::MachineFunction & Fn) Line 977	C++
>> 	llc.exe!`anonymous namespace'::PEI::runOnMachineFunction(llvm::MachineFunction & Fn) Line 211	C++
>> 	llc.exe!llvm::MachineFunctionPass::runOnFunction(llvm::Function & F) Line 60	C++
>> 	llc.exe!llvm::FPPassManager::runOnFunction(llvm::Function & F) Line 1522	C++
>> 	llc.exe!llvm::FPPassManager::runOnModule(llvm::Module & M) Line 1543	C++
>> 	llc.exe!`anonymous namespace'::MPPassManager::runOnModule(llvm::Module & M) Line 1599	C++
>> 	llc.exe!llvm::legacy::PassManagerImpl::run(llvm::Module & M) Line 1702	C++
>> 	llc.exe!llvm::legacy::PassManager::run(llvm::Module & M) Line 1734	C++
>> 	llc.exe!compileModule(char * * argv, llvm::LLVMContext & Context) Line 507	C++
>> 	llc.exe!main(int argc, char * * argv) Line 273	C++
>> 	llc.exe!__tmainCRTStartup() Line 626	C
>> 	llc.exe!mainCRTStartup() Line 466	C
>> 	kernel32.dll!0000000076f259bd()	Unknown
>> 	ntdll.dll!000000007705a2e1()	Unknown
>> 
>> The failure is here:
>> 
>> /// Returns the opcode of this MachineInstr.
>> unsigned getOpcode() const { return MCID->Opcode; }  <== MCID has a garbage value
> 
> Looking at it now.
> 
>> 
>> Hope this helps, and I can generate the other stack traces as well if it helps, just let me know.
> 
> If it's easy, that'd be great.  Then we don't need to wait for the bots to pass/fail after I fix this one.  Only send the unique ones though.
> 
>> Douglas Yung
>> 
>>> -----Original Message-----
>>> From: hwennborg at google.com [mailto:hwennborg at google.com] On Behalf Of
>>> Hans Wennborg
>>> Sent: Friday, August 12, 2016 16:45
>>> To: Duncan P. N. Exon Smith
>>> Cc: Yung, Douglas; llvm-commits at lists.llvm.org
>>> Subject: Re: [llvm] r278532 - ADT: Remove the ilist_nextprev_traits
>>> customization point
>>> 
>>> On Fri, Aug 12, 2016 at 4:15 PM, Duncan P. N. Exon Smith
>>> <dexonsmith at apple.com> wrote:
>>>> 
>>>>> On 2016-Aug-12, at 16:12, Yung, Douglas <douglas.yung at sony.com>
>>> wrote:
>>>>> 
>>>>> Hi Duncan,
>>>>> 
>>>>> Your change in r278572 seems to have helped, the number of failures
>>> is down to 8. (http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-
>>> scei-ps4-windows10pro-fast/builds/9911).
>>>> 
>>>> Yes, I had just seen that myself and was about to comment!
>>>> 
>>>>> (The sancov failure is unrelated to your change) I'm still building
>>> a debug build of the compiler and will send a callstack for the failure
>>> when I have it.
>>>> 
>>>> Thanks very much.  Let me know if you need me to revert r278532-42
>>> while we investigate (happy to revert as long as you can send me the
>>> backtraces!).
>>> 
>>> I committed r278577 for another instance of this. Halfway through a
>>> Chromium build now :-)
>>> 
>>> 
>>>>>> -----Original Message-----
>>>>>> From: dexonsmith at apple.com [mailto:dexonsmith at apple.com]
>>>>>> Sent: Friday, August 12, 2016 16:05
>>>>>> To: Yung, Douglas
>>>>>> Cc: Hans Wennborg; llvm-commits at lists.llvm.org
>>>>>> Subject: Re: [llvm] r278532 - ADT: Remove the ilist_nextprev_traits
>>>>>> customization point
>>>>>> 
>>>>>> Can you give me the backtraces?  I strongly suspect a similar
>>>>>> problem, but I can't investigate on Darwin without knowing where it
>>> crashes.
>>>>>> (Perhaps r278572 will be sufficient...)
>>>>>> 
>>>>>>> On 2016-Aug-12, at 15:54, Yung, Douglas <douglas.yung at sony.com>
>>>>>> wrote:
>>>>>>> 
>>>>>>> Hi Duncan,
>>>>>>> 
>>>>>>> I just wanted to add that I'm seeing 13 failures in the regression
>>>>>> tests on the Windows PS4 bot
>>>>>> (http://lab.llvm.org:8011/builders/llvm-
>>>>>> clang-lld-x86_64-scei-ps4-windows10pro-fast) that I suspect are due
>>>>>> to this change. The problem only seems to exist for us when
>>> building
>>>>>> on Windows, so that might be why Hans has not been able to
>>> reproduce
>>>>>> it on linux. To narrow it down, I synced up to r278532, saw the
>>>>>> build failure, and then patched it with the subsequent fixes,
>>>>>> r278537 and
>>>>>> r278539 only. Once I did that, I saw the following 13 test
>>> failures:
>>>>>>> 
>>>>>>> Failing Tests (13):
>>>>>>> LLVM :: CodeGen/X86/2010-02-23-RematImplicitSubreg.ll
>>>>>>> LLVM :: CodeGen/X86/2011-03-08-Sched-crash.ll
>>>>>>> LLVM :: CodeGen/X86/2012-08-17-legalizer-crash.ll
>>>>>>> LLVM :: CodeGen/X86/avx-splat.ll
>>>>>>> LLVM :: CodeGen/X86/compare-inf.ll
>>>>>>> LLVM :: CodeGen/X86/copy-eflags.ll
>>>>>>> LLVM :: CodeGen/X86/fast-isel-i1.ll
>>>>>>> LLVM :: CodeGen/X86/machine-cse.ll
>>>>>>> LLVM :: CodeGen/X86/no-and8ri8.ll
>>>>>>> LLVM :: CodeGen/X86/shrink-wrap-chkstk.ll
>>>>>>> LLVM :: CodeGen/X86/x86-shrink-wrap-unwind.ll
>>>>>>> LLVM :: CodeGen/X86/x86-shrink-wrapping.ll
>>>>>>> LLVM :: Transforms/CodeExtractor/X86/InheritTargetAttributes.ll
>>>>>>> 
>>>>>>> It's not immediately obvious to me why your change is causing
>>> these
>>>>>> failures, but this (as well as another failure) is causing the PS4
>>>>>> Windows bot to be red at the moment. Can you take a look into this?
>>>>>>> 
>>>>>>> Douglas Yung
>>>>>>> 
>>>>>>>> -----Original Message-----
>>>>>>>> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org]
>>> On
>>>>>>>> Behalf Of Hans Wennborg via llvm-commits
>>>>>>>> Sent: Friday, August 12, 2016 14:49
>>>>>>>> To: Duncan P. N. Exon Smith
>>>>>>>> Cc: llvm-commits
>>>>>>>> Subject: Re: [llvm] r278532 - ADT: Remove the
>>>>>>>> ilist_nextprev_traits customization point
>>>>>>>> 
>>>>>>>> Just a heads up I'm getting compiler crashes building Chromium on
>>>>>>>> Windows with this (well, r278539 really). Still not sure what's
>>>>>> going
>>>>>>>> on, though.. http://crbug.com/637413
>>>>>>>> 
>>>>>>>> It's crashing here:
>>>>>>>> 
>>>>>>>> void X86FrameLowering::emitEpilogue(MachineFunction &MF,
>>>>>>>>                                 MachineBasicBlock &MBB) const {
>>>>>>>> const MachineFrameInfo &MFI = MF.getFrameInfo();
>>>>>>>> X86MachineFunctionInfo *X86FI =
>>>>>> MF.getInfo<X86MachineFunctionInfo>();
>>>>>>>> MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
>>>>>>>> unsigned RetOpcode = MBBI->getOpcode();    <--- CRASH
>>>>>>>> 
>>>>>>>> 
>>>>>>>> I assume MBBI is an ilist_iterator<> of some kind, but I still
>>>>>>>> haven't been able to figure out what's up, or reproduce the crash
>>>>>>>> on Linux :-/
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Fri, Aug 12, 2016 at 10:32 AM, Duncan P. N. Exon Smith via
>>>>>>>> llvm- commits <llvm-commits at lists.llvm.org> wrote:
>>>>>>>>> Author: dexonsmith
>>>>>>>>> Date: Fri Aug 12 12:32:34 2016
>>>>>>>>> New Revision: 278532
>>>>>>>>> 
>>>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=278532&view=rev
>>>>>>>>> Log:
>>>>>>>>> ADT: Remove the ilist_nextprev_traits customization point
>>>>>>>>> 
>>>>>>>>> No one is using the capability to implement next and prev
>>> another
>>>>>>>>> way (since lld stopped doing it in r278468).  Remove the
>>>>>>>>> customization point by moving the API from
>>>>>>>>> ilist_nextprev_traits<T> to
>>>>>>>> ilist_node_access.
>>>>>>>>> 
>>>>>>>>> The old traits class is still useful/necessary API as a target
>>>>>>>>> for friends of node types that inherit privately from
>>> ilist_node.
>>>>>>>>> Eventually I plan to either remove it entirely or move the
>>>>>>>>> template parameters to the methods.
>>>>>>>>> 
>>>>>>>>> (Note: if there's desire to bring back customization of
>>> next/prev
>>>>>>>>> pointers in the future (e.g., to pack some bits in there), I
>>>>>>>>> think
>>>>>> a
>>>>>>>>> traits class like this is an awkward way to accomplish it.
>>>>>> Instead,
>>>>>>>>> we should change ilist<T> to be ilist<ilist_node<T>>, and give
>>> an
>>>>>>>>> extra template parameter to ilist_node.)
>>>>>>>>> 
>>>>>>>>> Modified:
>>>>>>>>> llvm/trunk/include/llvm/ADT/ilist.h
>>>>>>>>> llvm/trunk/include/llvm/ADT/ilist_node.h
>>>>>>>>> llvm/trunk/include/llvm/IR/SymbolTableListTraits.h
>>>>>>>>> 
>>>>>>>>> Modified: llvm/trunk/include/llvm/ADT/ilist.h
>>>>>>>>> URL:
>>>>>>>>> http://llvm.org/viewvc/llvm-
>>>>>>>> project/llvm/trunk/include/llvm/ADT/ilist.
>>>>>>>>> h?rev=278532&r1=278531&r2=278532&view=diff
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>> ====================================================================
>>>>>> =
>>>>>>>> =
>>>>>>>>> ========
>>>>>>>>> --- llvm/trunk/include/llvm/ADT/ilist.h (original)
>>>>>>>>> +++ llvm/trunk/include/llvm/ADT/ilist.h Fri Aug 12 12:32:34 2016
>>>>>>>>> @@ -50,20 +50,64 @@ namespace llvm { template<typename NodeTy,
>>>>>>>>> typename Traits> class iplist; template<typename NodeTy> class
>>>>>>>>> ilist_iterator;
>>>>>>>>> 
>>>>>>>>> -/// ilist_nextprev_traits - A fragment for template traits for
>>>>>>>>> intrusive list -/// that provides default next/prev
>>>>>>>>> implementations
>>>>>>>> for common operations.
>>>>>>>>> +/// An access class for next/prev on ilist_nodes.
>>>>>>>>> ///
>>>>>>>>> -template<typename NodeTy>
>>>>>>>>> -struct ilist_nextprev_traits {
>>>>>>>>> -  static NodeTy *getPrev(NodeTy *N) { return N->getPrev(); }
>>>>>>>>> -  static NodeTy *getNext(NodeTy *N) { return N->getNext(); }
>>>>>>>>> -  static const NodeTy *getPrev(const NodeTy *N) { return
>>>>>>>>> N->getPrev(); }
>>>>>>>>> -  static const NodeTy *getNext(const NodeTy *N) { return
>>>>>>>>> N->getNext(); }
>>>>>>>>> +/// This gives access to the private parts of ilist nodes.
>>>>>>>>> +Nodes
>>>>>>>> for
>>>>>>>>> +an ilist /// should friend this class if they inherit privately
>>>>>>>>> +from
>>>>>>>> ilist_node.
>>>>>>>>> +///
>>>>>>>>> +/// It's strongly discouraged to *use* this class outside of
>>>>>>>>> +ilist /// implementation.
>>>>>>>>> +struct ilist_node_access {
>>>>>>>>> +  template <typename NodeTy> static NodeTy *getPrev(NodeTy *N)
>>> {
>>>>>>>>> +    return N->getPrev();
>>>>>>>>> +  }
>>>>>>>>> +  template <typename NodeTy> static NodeTy *getNext(NodeTy *N)
>>> {
>>>>>>>>> +    return N->getNext();
>>>>>>>>> +  }
>>>>>>>>> +  template <typename NodeTy> static const NodeTy *getPrev(const
>>>>>>>> NodeTy *N) {
>>>>>>>>> +    return N->getPrev();
>>>>>>>>> +  }
>>>>>>>>> +  template <typename NodeTy> static const NodeTy *getNext(const
>>>>>>>> NodeTy *N) {
>>>>>>>>> +    return N->getNext();
>>>>>>>>> +  }
>>>>>>>>> +
>>>>>>>>> +  template <typename NodeTy> static void setPrev(NodeTy *N,
>>>>>>>>> + NodeTy
>>>>>>>> *Prev) {
>>>>>>>>> +    N->setPrev(Prev);
>>>>>>>>> +  }
>>>>>>>>> +  template <typename NodeTy> static void setNext(NodeTy *N,
>>>>>>>>> + NodeTy
>>>>>>>> *Next) {
>>>>>>>>> +    N->setNext(Next);
>>>>>>>>> +  }
>>>>>>>>> +  template <typename NodeTy> static void setPrev(NodeTy *N,
>>>>>>>> std::nullptr_t) {
>>>>>>>>> +    N->setPrev(nullptr);
>>>>>>>>> +  }
>>>>>>>>> +  template <typename NodeTy> static void setNext(NodeTy *N,
>>>>>>>> std::nullptr_t) {
>>>>>>>>> +    N->setNext(nullptr);
>>>>>>>>> +  }
>>>>>>>>> +};
>>>>>>>>> +
>>>>>>>>> +namespace ilist_detail {
>>>>>>>>> 
>>>>>>>>> -  static void setPrev(NodeTy *N, NodeTy *Prev) {
>>>>>>>>> N->setPrev(Prev); }
>>>>>>>>> -  static void setNext(NodeTy *N, NodeTy *Next) {
>>>>>>>>> N->setNext(Next); }
>>>>>>>>> +template <class T> T &make();
>>>>>>>>> +
>>>>>>>>> +/// Type trait to check for a traits class that has a getNext
>>>>>>>>> +member (as a /// canary for any of the ilist_nextprev_traits
>>> API).
>>>>>>>>> +template <class TraitsT, class NodeT> struct HasGetNext {
>>>>>>>>> +  typedef char Yes[1];
>>>>>>>>> +  typedef char No[2];
>>>>>>>>> +  template <size_t N> struct SFINAE {};
>>>>>>>>> +
>>>>>>>>> +  template <class U, class V>
>>>>>>>>> +  static Yes &hasGetNext(
>>>>>>>>> +      SFINAE<sizeof(static_cast<NodeT
>>>>>>>> *>(make<U>().getNext(&make<NodeT>())))>
>>>>>>>>> +          * = 0);
>>>>>>>>> +  template <class U, class V> static No &hasGetNext(...);
>>>>>>>>> +
>>>>>>>>> +  static const bool value =
>>>>>>>>> +      sizeof(hasGetNext<TraitsT, NodeT>(nullptr)) ==
>>>>>>>>> + sizeof(Yes);
>>>>>>>>> };
>>>>>>>>> 
>>>>>>>>> +} // end namespace ilist_detail
>>>>>>>>> +
>>>>>>>>> template<typename NodeTy>
>>>>>>>>> struct ilist_traits;
>>>>>>>>> 
>>>>>>>>> @@ -93,15 +137,15 @@ struct ilist_sentinel_traits {
>>>>>>>>>  if (!Head) {
>>>>>>>>>    Head = ilist_traits<NodeTy>::createSentinel();
>>>>>>>>>    ilist_traits<NodeTy>::noteHead(Head, Head);
>>>>>>>>> -      ilist_traits<NodeTy>::setNext(Head, nullptr);
>>>>>>>>> +      ilist_node_access::setNext(Head, nullptr);
>>>>>>>>>    return Head;
>>>>>>>>>  }
>>>>>>>>> -    return ilist_traits<NodeTy>::getPrev(Head);
>>>>>>>>> +    return ilist_node_access::getPrev(Head);
>>>>>>>>> }
>>>>>>>>> 
>>>>>>>>> /// noteHead - stash the sentinel into its default location
>>>>>>>>> static void noteHead(NodeTy *NewHead, NodeTy *Sentinel) {
>>>>>>>>> -    ilist_traits<NodeTy>::setPrev(NewHead, Sentinel);
>>>>>>>>> +    ilist_node_access::setPrev(NewHead, Sentinel);
>>>>>>>>> }
>>>>>>>>> };
>>>>>>>>> 
>>>>>>>>> @@ -187,11 +231,9 @@ struct ilist_node_traits {  /// By
>>>>>>>>> inheriting from this, you can easily use default implementations
>>>>>>>>> /// for all common operations.
>>>>>>>>> ///
>>>>>>>>> -template<typename NodeTy>
>>>>>>>>> -struct ilist_default_traits : public
>>>>>> ilist_nextprev_traits<NodeTy>,
>>>>>>>>> -                              public
>>>>>> ilist_sentinel_traits<NodeTy>,
>>>>>>>>> -                              public ilist_node_traits<NodeTy>
>>> {
>>>>>>>>> -};
>>>>>>>>> +template <typename NodeTy>
>>>>>>>>> +struct ilist_default_traits : public
>>>>>> ilist_sentinel_traits<NodeTy>,
>>>>>>>>> +                              public ilist_node_traits<NodeTy>
>>>>>>>>> + {};
>>>>>>>>> 
>>>>>>>>> // Template traits for intrusive list.  By specializing this
>>>>>>>> template
>>>>>>>>> class, you  // can change what next/prev fields are used to
>>> store
>>>>>>>>> the
>>>>>>>> links...
>>>>>>>>> @@ -218,7 +260,6 @@ template <typename NodeTy>  class
>>>>>> ilist_iterator
>>>>>>>>>  : public std::iterator<std::bidirectional_iterator_tag,
>>>>>>>>> NodeTy, ptrdiff_t> {
>>>>>>>>> public:
>>>>>>>>> -  typedef ilist_traits<NodeTy> Traits;  typedef
>>>>>>>>> std::iterator<std::bidirectional_iterator_tag, NodeTy,
>>>>>>>> ptrdiff_t>
>>>>>>>>>    super;
>>>>>>>>> 
>>>>>>>>> @@ -279,12 +320,12 @@ public:
>>>>>>>>> 
>>>>>>>>> // Increment and decrement operators...
>>>>>>>>> ilist_iterator &operator--() {
>>>>>>>>> -    NodePtr = Traits::getPrev(NodePtr);
>>>>>>>>> +    NodePtr = ilist_node_access::getPrev(NodePtr);
>>>>>>>>>  assert(NodePtr && "--'d off the beginning of an ilist!");
>>>>>>>>>  return *this;
>>>>>>>>> }
>>>>>>>>> ilist_iterator &operator++() {
>>>>>>>>> -    NodePtr = Traits::getNext(NodePtr);
>>>>>>>>> +    NodePtr = ilist_node_access::getNext(NodePtr);
>>>>>>>>>  return *this;
>>>>>>>>> }
>>>>>>>>> ilist_iterator operator--(int) { @@ -348,8 +389,11 @@
>>>>>>>>> template<typename NodeTy> struct simplif
>>>>>>>>> ///    and the successor pointer for the sentinel (which always
>>>>>>>> stays at the
>>>>>>>>> ///    end of the list) is always null.
>>>>>>>>> ///
>>>>>>>>> -template<typename NodeTy, typename Traits=ilist_traits<NodeTy>
>>>> 
>>>>>>>>> -class iplist : public Traits {
>>>>>>>>> +template <typename NodeTy, typename Traits =
>>>>>>>>> +ilist_traits<NodeTy>> class iplist : public Traits,
>>>>>>>>> +ilist_node_access {
>>>>>>>>> +  static_assert(!ilist_detail::HasGetNext<Traits,
>>> NodeTy>::value,
>>>>>>>>> +                "ilist next and prev links are not
>>>>>> customizable!");
>>>>>>>>> +
>>>>>>>>> mutable NodeTy *Head;
>>>>>>>>> 
>>>>>>>>> // Use the prev node pointer of 'head' as the tail pointer.
>>>>>>>>> This is really a
>>>>>>>>> 
>>>>>>>>> Modified: llvm/trunk/include/llvm/ADT/ilist_node.h
>>>>>>>>> URL:
>>>>>>>>> http://llvm.org/viewvc/llvm-
>>>>>>>> project/llvm/trunk/include/llvm/ADT/ilist_
>>>>>>>>> node.h?rev=278532&r1=278531&r2=278532&view=diff
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>> ====================================================================
>>>>>> =
>>>>>>>> =
>>>>>>>>> ========
>>>>>>>>> --- llvm/trunk/include/llvm/ADT/ilist_node.h (original)
>>>>>>>>> +++ llvm/trunk/include/llvm/ADT/ilist_node.h Fri Aug 12 12:32:34
>>>>>>>>> +++ 2016
>>>>>>>>> @@ -36,17 +36,13 @@ protected:
>>>>>>>>> ilist_half_node() : Prev(nullptr) {}  };
>>>>>>>>> 
>>>>>>>>> -template<typename NodeTy>
>>>>>>>>> -struct ilist_nextprev_traits;
>>>>>>>>> -
>>>>>>>>> +struct ilist_node_access;
>>>>>>>>> template <typename NodeTy> class ilist_iterator;
>>>>>>>>> 
>>>>>>>>> -/// ilist_node - Base class that provides next/prev services
>>> for
>>>>>>>>> nodes -/// that use ilist_nextprev_traits or
>>> ilist_default_traits.
>>>>>>>>> -///
>>>>>>>>> +/// Base class that provides next/prev services for ilist
>>> nodes.
>>>>>>>>> template<typename NodeTy>
>>>>>>>>> class ilist_node : private ilist_half_node<NodeTy> {
>>>>>>>>> -  friend struct ilist_nextprev_traits<NodeTy>;
>>>>>>>>> +  friend struct ilist_node_access;
>>>>>>>>> friend struct ilist_traits<NodeTy>;  friend struct
>>>>>>>>> ilist_half_embedded_sentinel_traits<NodeTy>;
>>>>>>>>> friend struct ilist_embedded_sentinel_traits<NodeTy>;
>>>>>>>>> 
>>>>>>>>> Modified: llvm/trunk/include/llvm/IR/SymbolTableListTraits.h
>>>>>>>>> URL:
>>>>>>>>> http://llvm.org/viewvc/llvm-
>>>>>>>> project/llvm/trunk/include/llvm/IR/SymbolT
>>>>>>>>> ableListTraits.h?rev=278532&r1=278531&r2=278532&view=diff
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>> ====================================================================
>>>>>> =
>>>>>>>> =
>>>>>>>>> ========
>>>>>>>>> --- llvm/trunk/include/llvm/IR/SymbolTableListTraits.h
>>> (original)
>>>>>>>>> +++ llvm/trunk/include/llvm/IR/SymbolTableListTraits.h Fri Aug
>>> 12
>>>>>>>>> +++ 12:32:34 2016
>>>>>>>>> @@ -69,8 +69,7 @@ template <typename NodeTy> class SymbolT  //
>>>>>>>>> template <typename ValueSubClass>  class SymbolTableListTraits
>>>>>>>>> -    : public ilist_nextprev_traits<ValueSubClass>,
>>>>>>>>> -      public SymbolTableListSentinelTraits<ValueSubClass>,
>>>>>>>>> +    : public SymbolTableListSentinelTraits<ValueSubClass>,
>>>>>>>>>    public ilist_node_traits<ValueSubClass> {  typedef
>>>>>>>>> SymbolTableList<ValueSubClass> ListTy;  typedef
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>>>>> llvm-commits mailing list
>>>>>>>>> llvm-commits at lists.llvm.org
>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>>>>> _______________________________________________
>>>>>>>> llvm-commits mailing list
>>>>>>>> llvm-commits at lists.llvm.org
>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>> 
>>>> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list