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

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 17:53:02 PDT 2016


I'm looking at the lit tests now. I think I have a fix for the X86
ones, but there's also some failures in AMDGPU tests. Hopefully easy
to fix..

On Fri, Aug 12, 2016 at 5:18 PM, Duncan P. N. Exon Smith via
llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
>> 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
>
> _______________________________________________
> 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