DeclBase.h revision 35bc0821c4f80041724cd4c5c4889b2581546a41
10ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//===-- DeclBase.h - Base Classes for representing declarations *- C++ -*-===//
20ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
30ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//                     The LLVM Compiler Infrastructure
40ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
50ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner// This file is distributed under the University of Illinois Open Source
60ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner// License. See LICENSE.TXT for details.
70ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
80ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//===----------------------------------------------------------------------===//
90ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
10b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner//  This file defines the Decl and DeclContext interfaces.
110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//
120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner//===----------------------------------------------------------------------===//
130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#ifndef LLVM_CLANG_AST_DECLBASE_H
150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#define LLVM_CLANG_AST_DECLBASE_H
160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#include "clang/AST/Attr.h"
180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#include "clang/AST/Type.h"
190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#include "clang/Basic/SourceLocation.h"
200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnernamespace clang {
2242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisclass DeclContext;
23ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidisclass TranslationUnitDecl;
242d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidisclass NamespaceDecl;
25d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass ScopedDecl;
260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass FunctionDecl;
27d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass CXXRecordDecl;
28b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass EnumDecl;
29d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidisclass ObjCMethodDecl;
300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass ObjCInterfaceDecl;
3156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffclass BlockDecl;
320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// Decl - This represents one declaration (or definition), e.g. a variable,
340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// typedef, function, struct, etc.
350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerclass Decl {
370ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum Kind {
390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // This lists the concrete classes of Decl in order of the inheritance
400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // hierarchy.  This allows us to do efficient classof tests based on the
410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // enums below.   The commented out names are abstract class names.
42a34ea072371154c9042ce86321d17fbb4df1f84dTed Kremenek    // [DeclContext] indicates that the class also inherits from DeclContext.
430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // Decl
45d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis         TranslationUnit,  // [DeclContext]
460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //   NamedDecl
470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           Field,
48d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis             CXXField,
490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner             ObjCIvar,
5001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek             ObjCAtDefsField,
510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCCategory,
520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCCategoryImpl,
530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCImplementation,
540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner           ObjCProtocol,
55670aa9d7639278f507930e95dc89c12032ab7c7eSam Bishop           ObjCProperty,
560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //     ScopedDecl
57d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis             Namespace,  // [DeclContext]
580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //       TypeDecl
590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               Typedef,
600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //         TagDecl
61d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                 Enum,  // [DeclContext]
6235bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis                 Record,
6335bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis                   CXXRecord,  // [DeclContext]
640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    //       ValueDecl
650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner               EnumConstant,
66d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis               Function,  // [DeclContext]
67d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                 CXXMethod,
68248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff               Var,
694111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner                 ImplicitParam,
70d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis                 CXXClassVar,
710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                 ParmVar,
72226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar           ObjCInterface,  // [DeclContext]
73226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar           ObjCCompatibleAlias,
74226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar           ObjCMethod,  // [DeclContext]
75226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar           ObjCClass,
76226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar           ObjCForwardProtocol,
77226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar           ObjCPropertyImpl,
780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner         LinkageSpec,
79226e04a9b7790a7311aff2aa9df340c1841e20e3Daniel Dunbar         FileScopeAsm,
8056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff	     Block, // [DeclContext]
810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // For each non-leaf class, we now define a mapping to the first/last member
830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // of the class, to allow efficient classof.
84d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    NamedFirst     = Field        , NamedLast     = ParmVar,
8501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek    FieldFirst     = Field        , FieldLast     = ObjCAtDefsField,
86d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    ScopedFirst    = Namespace    , ScopedLast    = ParmVar,
8735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    TypeFirst      = Typedef      , TypeLast      = CXXRecord,
8835bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    TagFirst       = Enum         , TagLast       = CXXRecord,
8935bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    RecordFirst    = Record       , RecordLast    = CXXRecord,
90d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    ValueFirst     = EnumConstant , ValueLast     = ParmVar,
91d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    FunctionFirst  = Function     , FunctionLast  = CXXMethod,
92d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    VarFirst       = Var          , VarLast       = ParmVar
930ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
940ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// IdentifierNamespace - According to C99 6.2.3, there are four namespaces,
962ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor  /// labels, tags, members and ordinary identifiers. These are meant
972ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor  /// as bitmasks, so that searches in C++ can look into the "tag" namespace
982ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor  /// during ordinary lookup.
990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum IdentifierNamespace {
1002ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Label = 0x1,
1012ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Tag = 0x2,
1022ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Member = 0x4,
1032ce52f3fb95bf544db6bd3d91a72bce7d9cceb6cDouglas Gregor    IDNS_Ordinary = 0x8
1040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
1050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// ObjCDeclQualifier - Qualifier used on types in method declarations
1070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// for remote messaging. They are meant for the arguments though and
1080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// applied to the Decls (ObjCMethodDecl and ParmVarDecl).
1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  enum ObjCDeclQualifier {
1100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_None = 0x0,
1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_In = 0x1,
1120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Inout = 0x2,
1130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Out = 0x4,
1140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Bycopy = 0x8,
1150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Byref = 0x10,
1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    OBJC_TQ_Oneway = 0x20
1170ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
1180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprivate:
1200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Loc - The location that this decl.
1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  SourceLocation Loc;
1220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// DeclKind - This indicates which class this is.
1240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Kind DeclKind   :  8;
1250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// InvalidDecl - This indicates a semantic error occurred.
1270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  unsigned int InvalidDecl :  1;
1280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// HasAttrs - This indicates whether the decl has attributes or not.
1300ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  unsigned int HasAttrs : 1;
131d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
132d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis protected:
133d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  /// Access - Used by C++ decls for the access specifier.
134d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  // NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum
135d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  unsigned Access : 2;
136d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  friend class CXXClassMemberWrapper;
137d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
1380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK), InvalidDecl(0),
1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    HasAttrs(false) {
1400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    if (Decl::CollectingStats()) addDeclKind(DK);
1410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1421bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop
1430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  virtual ~Decl();
1441bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishop
1451bb19638f2ec0d63ed131b51ca8d9542d1a9afeeSam Bishoppublic:
1460ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  SourceLocation getLocation() const { return Loc; }
1470ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void setLocation(SourceLocation L) { Loc = L; }
1480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Kind getKind() const { return DeclKind; }
1500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  const char *getDeclKindName() const;
1510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void addAttr(Attr *attr);
1530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  const Attr *getAttrs() const;
154a212c56e9b7533bcc2d6be90efd52ad241bf894eChris Lattner  void swapAttrs(Decl *D);
1559141bee299a05349924a34a7153d7064c9e0a107Nuno Lopes  void invalidateAttrs();
1560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename T> const T *getAttr() const {
1580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    for (const Attr *attr = getAttrs(); attr; attr = attr->getNext())
1590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      if (const T *V = dyn_cast<T>(attr))
1600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return V;
1610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    return 0;
1630ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
1640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// setInvalidDecl - Indicates the Decl had a semantic error. This
1660ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// allows for graceful error recovery.
1670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void setInvalidDecl() { InvalidDecl = 1; }
1680ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  bool isInvalidDecl() const { return (bool) InvalidDecl; }
1690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
1700ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  IdentifierNamespace getIdentifierNamespace() const {
1710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (DeclKind) {
1720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    default: assert(0 && "Unknown decl kind!");
1734111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner    case ImplicitParam:
1740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Typedef:
1750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Function:
176248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff    case Var:
1770ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ParmVar:
1780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case EnumConstant:
1790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ObjCInterface:
1800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case ObjCCompatibleAlias:
181d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    case CXXField:
1821ce6eadf80453d132d378ee031f3fbf5259a7d2aArgyrios Kyrtzidis    case CXXMethod:
18309c31b0d78fc4e7f1d1828d01d9977cc3e242ea3Argyrios Kyrtzidis    case CXXClassVar:
1840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      return IDNS_Ordinary;
18535bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    case Record:
18635bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis    case CXXRecord:
1870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    case Enum:
1880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      return IDNS_Tag;
1892d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis    case Namespace:
1902d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis      return IdentifierNamespace(IDNS_Tag | IDNS_Ordinary);
1910ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
1920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
193792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek
19469c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek  // getBody - If this Decl represents a declaration for a body of code,
195792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek  //  such as a function or method definition, this method returns the top-level
19669c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek  //  Stmt* of that body.  Otherwise this method returns null.
19769c8f0aab655257e9e532d9d53756acf4f7a2d78Ted Kremenek  virtual Stmt* getBody() const { return 0; }
198792481eec23d8c1aa92173be589e2ae9d02514a5Ted Kremenek
1990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // global temp stats (until we have a per-module visitor)
2000ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static void addDeclKind(Kind k);
2010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool CollectingStats(bool Enable = false);
2020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static void PrintStats();
2030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Implement isa/cast/dyncast/etc.
2050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const Decl *) { return true; }
20642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  static DeclContext *castToDeclContext(const Decl *);
20742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  static Decl *castFromDeclContext(const DeclContext *);
2080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Emit - Serialize this Decl to Bitcode.
2100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void Emit(llvm::Serializer& S) const;
2110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// Create - Deserialize a Decl from Bitcode.
213e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop  static Decl* Create(llvm::Deserializer& D, ASTContext& C);
2140ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
215bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop  /// Destroy - Call destructors and release memory.
21627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek  virtual void Destroy(ASTContext& C);
217bb45c512e0dfbe96bfe377ac642e726c0ba0affaSam Bishop
2180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
2190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// EmitImpl - Provides the subclass-specific serialization logic for
2200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  ///   serializing out a decl.
2210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  virtual void EmitImpl(llvm::Serializer& S) const {
2220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    // FIXME: This will eventually be a pure virtual function.
2230ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    assert (false && "Not implemented.");
2240ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2260ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  void EmitInRec(llvm::Serializer& S) const;
227e2563ca02a519c2ad6d64dfed87d6e86c5d3c072Sam Bishop  void ReadInRec(llvm::Deserializer& D, ASTContext& C);
2280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
2290ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
230b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner/// DeclContext - This is used only as base class of specific decl types that
2310ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner/// can act as declaration contexts. These decls are:
2320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
233ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis///   TranslationUnitDecl
2342d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis///   NamespaceDecl
2350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   FunctionDecl
236d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis///   CXXRecordDecl
237b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner///   EnumDecl
238d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis///   ObjCMethodDecl
2390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///   ObjCInterfaceDecl
24056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff///   BlockDecl
2410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner///
242b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnerclass DeclContext {
2430ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// DeclKind - This indicates which class this is.
2440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  Decl::Kind DeclKind   :  8;
2450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2467643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  /// DeclChain - Linked list of declarations that are defined inside this
2477643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  /// declaration context.
2487643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  ScopedDecl *DeclChain;
2497643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
2500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Used in the CastTo template to get the DeclKind
251b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  // from a Decl or a DeclContext. DeclContext doesn't have a getKind() method
2520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // to avoid 'ambiguous access' compiler errors.
2530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename T> struct KindTrait {
2540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    static Decl::Kind getKind(const T *D) { return D->getKind(); }
2550ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  };
2560ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  // Used only by the ToDecl and FromDecl methods
2580ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  template<typename To, typename From>
2590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static To *CastTo(const From *D) {
2600ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    Decl::Kind DK = KindTrait<From>::getKind(D);
2610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch(DK) {
262090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff      case Decl::Block:
263090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff        return static_cast<BlockDecl*>(const_cast<From*>(D));
264ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis      case Decl::TranslationUnit:
265ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis        return static_cast<TranslationUnitDecl*>(const_cast<From*>(D));
2662d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis      case Decl::Namespace:
2672d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis        return static_cast<NamespaceDecl*>(const_cast<From*>(D));
268d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis      case Decl::Enum:
269d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        return static_cast<EnumDecl*>(const_cast<From*>(D));
27035bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis      case Decl::CXXRecord:
27135bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis        return static_cast<CXXRecordDecl*>(const_cast<From*>(D));
2720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
2730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<ObjCMethodDecl*>(const_cast<From*>(D));
2740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCInterface:
2750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return static_cast<ObjCInterfaceDecl*>(const_cast<From*>(D));
2760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
277d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        if (DK >= Decl::FunctionFirst && DK <= Decl::FunctionLast)
278d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis          return static_cast<FunctionDecl*>(const_cast<From*>(D));
279d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
280b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        assert(false && "a decl that inherits DeclContext isn't handled");
2810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return 0;
2820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
2830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
2840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerprotected:
2867643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  DeclContext(Decl::Kind K) : DeclKind(K), DeclChain(0) {}
2870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerpublic:
289b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  /// getParent - Returns the containing DeclContext if this is a ScopedDecl,
2900ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  /// else returns NULL.
291d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis  DeclContext *getParent();
292d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis  const DeclContext *getParent() const {
293d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis    return const_cast<DeclContext*>(this)->getParent();
294d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis  }
2950ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
2960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  bool isFunctionOrMethod() const {
2970ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (DeclKind) {
29856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      case Decl::Block:
2990ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::Function:
300d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis      case Decl::CXXMethod:
3010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
3020ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return true;
3030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
3040ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return false;
3050ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
3060ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
308e2ed203b437c14de57a80d69b70164819d045d86Argyrios Kyrtzidis  const ScopedDecl *getDeclChain() const { return DeclChain; }
309e2ed203b437c14de57a80d69b70164819d045d86Argyrios Kyrtzidis  ScopedDecl *getDeclChain() { return DeclChain; }
3107643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  void setDeclChain(ScopedDecl *D) { DeclChain = D; }
3117643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
3120ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const Decl *D) {
3130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    switch (D->getKind()) {
314ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis      case Decl::TranslationUnit:
3152d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis      case Decl::Namespace:
316d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis      case Decl::Enum:
31735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis      case Decl::CXXRecord:
3180ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCMethod:
3190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      case Decl::ObjCInterface:
32056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      case Decl::Block:
3210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner        return true;
3220ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner      default:
323d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis        if (D->getKind() >= Decl::FunctionFirst &&
324d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis            D->getKind() <= Decl::FunctionLast)
325d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis          return true;
326b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner        return false;
3270ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    }
3280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
329b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static bool classof(const DeclContext *D) { return true; }
330ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis  static bool classof(const TranslationUnitDecl *D) { return true; }
3312d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis  static bool classof(const NamespaceDecl *D) { return true; }
3320ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const FunctionDecl *D) { return true; }
333d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  static bool classof(const CXXRecordDecl *D) { return true; }
334b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static bool classof(const EnumDecl *D) { return true; }
335d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  static bool classof(const ObjCMethodDecl *D) { return true; }
3360ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  static bool classof(const ObjCInterfaceDecl *D) { return true; }
33756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  static bool classof(const BlockDecl *D) { return true; }
3387643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
3397643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidisprivate:
3407643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  void EmitOutRec(llvm::Serializer& S) const;
3417643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  void ReadOutRec(llvm::Deserializer& D, ASTContext& C);
3427643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis
3437643536c36b0449256d5ee2efc03a7e4a784a0b3Argyrios Kyrtzidis  friend class Decl;
3440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
346b048c9835969c4f7fe06264748be18ed4b442116Chris Lattnertemplate<> struct DeclContext::KindTrait<DeclContext> {
347b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static Decl::Kind getKind(const DeclContext *D) { return D->DeclKind; }
3480ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3490ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end clang.
3510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnernamespace llvm {
3530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
35442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// Implement a isa_impl_wrap specialization to check whether a DeclContext is
35542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// a specific Decl.
35642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy>
35742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct isa_impl_wrap<ToTy,
35842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis                     const ::clang::DeclContext,const ::clang::DeclContext> {
35942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  static bool doit(const ::clang::DeclContext &Val) {
36042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis    return ToTy::classof(::clang::Decl::castFromDeclContext(&Val));
3610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
36342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy>
36442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct isa_impl_wrap<ToTy, ::clang::DeclContext, ::clang::DeclContext>
36542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  : public isa_impl_wrap<ToTy,
36642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis                      const ::clang::DeclContext,const ::clang::DeclContext> {};
3670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
36842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// Implement cast_convert_val for Decl -> DeclContext conversions.
3690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
37042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val< ::clang::DeclContext, FromTy, FromTy> {
371b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ::clang::DeclContext &doit(const FromTy &Val) {
37242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis    return *FromTy::castToDeclContext(&Val);
3730ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
3750ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
3760ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnertemplate<class FromTy>
37742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val< ::clang::DeclContext, FromTy*, FromTy*> {
378b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  static ::clang::DeclContext *doit(const FromTy *Val) {
37942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis    return FromTy::castToDeclContext(Val);
3800ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  }
3810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner};
38242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis
38342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis/// Implement cast_convert_val for DeclContext -> Decl conversions.
38442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy>
38542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy,
38642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis                        const ::clang::DeclContext,const ::clang::DeclContext> {
38742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  static ToTy &doit(const ::clang::DeclContext &Val) {
38842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis    return *reinterpret_cast<ToTy*>(ToTy::castFromDeclContext(&Val));
38942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  }
39042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis};
39142220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy>
39242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy, ::clang::DeclContext, ::clang::DeclContext>
39342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  : public cast_convert_val<ToTy,
39442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis                      const ::clang::DeclContext,const ::clang::DeclContext> {};
39542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis
39642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy>
39742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy,
39842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis                     const ::clang::DeclContext*, const ::clang::DeclContext*> {
39942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  static ToTy *doit(const ::clang::DeclContext *Val) {
40042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis    return reinterpret_cast<ToTy*>(ToTy::castFromDeclContext(Val));
40142220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  }
40242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis};
40342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidistemplate<class ToTy>
40442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidisstruct cast_convert_val<ToTy, ::clang::DeclContext*, ::clang::DeclContext*>
40542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  : public cast_convert_val<ToTy,
40642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis                    const ::clang::DeclContext*,const ::clang::DeclContext*> {};
4070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
4080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner} // end namespace llvm
4090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner
4100ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner#endif
411