Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
3.0 KiB

  1. //===-- llvm/SymbolTableListTraits.h - Traits for iplist --------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines a generic class that is used to implement the automatic
  11. // symbol table manipulation that occurs when you put (for example) a named
  12. // instruction into a basic block.
  13. //
  14. // The way that this is implemented is by using a special traits class with the
  15. // intrusive list that makes up the list of instructions in a basic block. When
  16. // a new element is added to the list of instructions, the traits class is
  17. // notified, allowing the symbol table to be updated.
  18. //
  19. // This generic class implements the traits class. It must be generic so that
  20. // it can work for all uses it, which include lists of instructions, basic
  21. // blocks, arguments, functions, global variables, etc...
  22. //
  23. //===----------------------------------------------------------------------===//
  24. #ifndef LLVM_SYMBOLTABLELISTTRAITS_H
  25. #define LLVM_SYMBOLTABLELISTTRAITS_H
  26. #include "llvm/ADT/ilist.h"
  27. namespace llvm {
  28. class ValueSymbolTable;
  29. template<typename NodeTy> class ilist_iterator;
  30. template<typename NodeTy, typename Traits> class iplist;
  31. template<typename Ty> struct ilist_traits;
  32. // ValueSubClass - The type of objects that I hold, e.g. Instruction.
  33. // ItemParentClass - The type of object that owns the list, e.g. BasicBlock.
  34. //
  35. template<typename ValueSubClass, typename ItemParentClass>
  36. class SymbolTableListTraits : public ilist_default_traits<ValueSubClass> {
  37. typedef ilist_traits<ValueSubClass> TraitsClass;
  38. public:
  39. SymbolTableListTraits() {}
  40. /// getListOwner - Return the object that owns this list. If this is a list
  41. /// of instructions, it returns the BasicBlock that owns them.
  42. ItemParentClass *getListOwner() {
  43. size_t Offset(size_t(&((ItemParentClass*)0->*ItemParentClass::
  44. getSublistAccess(static_cast<ValueSubClass*>(0)))));
  45. iplist<ValueSubClass>* Anchor(static_cast<iplist<ValueSubClass>*>(this));
  46. return reinterpret_cast<ItemParentClass*>(reinterpret_cast<char*>(Anchor)-
  47. Offset);
  48. }
  49. static iplist<ValueSubClass> &getList(ItemParentClass *Par) {
  50. return Par->*(Par->getSublistAccess((ValueSubClass*)0));
  51. }
  52. static ValueSymbolTable *getSymTab(ItemParentClass *Par) {
  53. return Par ? toPtr(Par->getValueSymbolTable()) : 0;
  54. }
  55. void addNodeToList(ValueSubClass *V);
  56. void removeNodeFromList(ValueSubClass *V);
  57. void transferNodesFromList(ilist_traits<ValueSubClass> &L2,
  58. ilist_iterator<ValueSubClass> first,
  59. ilist_iterator<ValueSubClass> last);
  60. //private:
  61. template<typename TPtr>
  62. void setSymTabObject(TPtr *, TPtr);
  63. static ValueSymbolTable *toPtr(ValueSymbolTable *P) { return P; }
  64. static ValueSymbolTable *toPtr(ValueSymbolTable &R) { return &R; }
  65. };
  66. } // End llvm namespace
  67. #endif