[cfe-commits] r146959 - in /cfe/trunk: include/clang/AST/ include/clang/Analysis/Analyses/ include/clang/Basic/ include/clang/CodeGen/ include/clang/Driver/ include/clang/Frontend/ include/clang/Lex/ include/clang/Sema/ include/clang/StaticAnalyzer/Core/ include/clang/StaticAnalyzer/Core/BugReporter/ include/clang/StaticAnalyzer/Core/PathSensitive/ lib/AST/ lib/Analysis/ lib/Basic/ lib/CodeGen/ lib/Driver/ lib/Frontend/ lib/Lex/ lib/Parse/ lib/Sema/ lib/StaticAnalyzer/Core/ utils/TableGen/

Ted Kremenek kremenek at apple.com
Mon Dec 19 20:33:45 PST 2011


Hi David,

I'm sorry to come down hard here, but I really don't like the idea of adding a fake method just unweaken the vtables.  Can we just move the offending virtual methods out-of-line?  Having weak vtables is one thing; have a dead method permanently embedded in that vtable is another.  We've now just increased the size of the clang executable (and make the code less pretty) just to perform this build-time optimization.

I'm going to revert this change.

Ted

On Dec 19, 2011, at 6:48 PM, David Blaikie wrote:

> Author: dblaikie
> Date: Mon Dec 19 20:48:34 2011
> New Revision: 146959
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=146959&view=rev
> Log:
> Unweaken vtables as per http://llvm.org/docs/CodingStandards.html#ll_virtual_anch
> 
> Added:
>    cfe/trunk/lib/Analysis/Dominators.cpp
>    cfe/trunk/lib/Frontend/ChainedDiagnosticConsumer.cpp
>    cfe/trunk/lib/Lex/PPCallbacks.cpp
>    cfe/trunk/lib/Sema/SemaConsumer.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/SubEngine.cpp
> Modified:
>    cfe/trunk/include/clang/AST/Attr.h
>    cfe/trunk/include/clang/AST/Decl.h
>    cfe/trunk/include/clang/AST/DeclCXX.h
>    cfe/trunk/include/clang/AST/DeclFriend.h
>    cfe/trunk/include/clang/AST/DeclObjC.h
>    cfe/trunk/include/clang/AST/DeclTemplate.h
>    cfe/trunk/include/clang/AST/ExprCXX.h
>    cfe/trunk/include/clang/AST/Mangle.h
>    cfe/trunk/include/clang/Analysis/Analyses/Dominators.h
>    cfe/trunk/include/clang/Analysis/Analyses/LiveVariables.h
>    cfe/trunk/include/clang/Analysis/Analyses/PostOrderCFGView.h
>    cfe/trunk/include/clang/Analysis/Analyses/ReachableCode.h
>    cfe/trunk/include/clang/Basic/Diagnostic.h
>    cfe/trunk/include/clang/Basic/FileSystemStatCache.h
>    cfe/trunk/include/clang/CodeGen/CodeGenAction.h
>    cfe/trunk/include/clang/CodeGen/ModuleBuilder.h
>    cfe/trunk/include/clang/Driver/Action.h
>    cfe/trunk/include/clang/Driver/Job.h
>    cfe/trunk/include/clang/Frontend/ChainedDiagnosticConsumer.h
>    cfe/trunk/include/clang/Frontend/FrontendAction.h
>    cfe/trunk/include/clang/Lex/Lexer.h
>    cfe/trunk/include/clang/Lex/PPCallbacks.h
>    cfe/trunk/include/clang/Lex/PreprocessorLexer.h
>    cfe/trunk/include/clang/Sema/SemaConsumer.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h
>    cfe/trunk/lib/AST/AttrImpl.cpp
>    cfe/trunk/lib/AST/Decl.cpp
>    cfe/trunk/lib/AST/DeclCXX.cpp
>    cfe/trunk/lib/AST/DeclFriend.cpp
>    cfe/trunk/lib/AST/DeclObjC.cpp
>    cfe/trunk/lib/AST/DeclTemplate.cpp
>    cfe/trunk/lib/AST/ExprCXX.cpp
>    cfe/trunk/lib/AST/Mangle.cpp
>    cfe/trunk/lib/Analysis/LiveVariables.cpp
>    cfe/trunk/lib/Analysis/PostOrderCFGView.cpp
>    cfe/trunk/lib/Analysis/ReachableCode.cpp
>    cfe/trunk/lib/Basic/Diagnostic.cpp
>    cfe/trunk/lib/Basic/FileSystemStatCache.cpp
>    cfe/trunk/lib/CodeGen/CodeGenAction.cpp
>    cfe/trunk/lib/CodeGen/ModuleBuilder.cpp
>    cfe/trunk/lib/Driver/Action.cpp
>    cfe/trunk/lib/Driver/Job.cpp
>    cfe/trunk/lib/Driver/ToolChains.cpp
>    cfe/trunk/lib/Driver/ToolChains.h
>    cfe/trunk/lib/Driver/Tools.cpp
>    cfe/trunk/lib/Driver/Tools.h
>    cfe/trunk/lib/Frontend/FrontendAction.cpp
>    cfe/trunk/lib/Lex/Lexer.cpp
>    cfe/trunk/lib/Lex/PreprocessorLexer.cpp
>    cfe/trunk/lib/Parse/ParseObjc.cpp
>    cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/Store.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp
>    cfe/trunk/utils/TableGen/TableGen.cpp
> 
> Modified: cfe/trunk/include/clang/AST/Attr.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Attr.h (original)
> +++ cfe/trunk/include/clang/AST/Attr.h Mon Dec 19 20:48:34 2011
> @@ -112,6 +112,7 @@
> };
> 
> class InheritableAttr : public Attr {
> +  virtual void anchor();
> protected:
>   InheritableAttr(attr::Kind AK, SourceRange R)
>     : Attr(AK, R) {}
> @@ -127,6 +128,7 @@
> };
> 
> class InheritableParamAttr : public InheritableAttr {
> +  virtual void anchor();
> protected:
>   InheritableParamAttr(attr::Kind AK, SourceRange R)
>     : InheritableAttr(AK, R) {}
> 
> Modified: cfe/trunk/include/clang/AST/Decl.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Decl.h (original)
> +++ cfe/trunk/include/clang/AST/Decl.h Mon Dec 19 20:48:34 2011
> @@ -67,6 +67,7 @@
> 
> /// TranslationUnitDecl - The top declaration context.
> class TranslationUnitDecl : public Decl, public DeclContext {
> +  virtual void anchor();
>   ASTContext &Ctx;
> 
>   /// The (most recently entered) anonymous namespace for this
> @@ -99,6 +100,7 @@
> /// NamedDecl - This represents a decl with a name.  Many decls have names such
> /// as ObjCMethodDecl, but not @class, etc.
> class NamedDecl : public Decl {
> +  virtual void anchor();
>   /// Name - The name of this declaration, which is typically a normal
>   /// identifier but may also be a special kind of name (C++
>   /// constructor, Objective-C selector, etc.)
> @@ -320,6 +322,7 @@
> /// location of the statement.  For GNU local labels (__label__), the decl
> /// location is where the __label__ is.
> class LabelDecl : public NamedDecl {
> +  virtual void anchor();
>   LabelStmt *TheStmt;
>   /// LocStart - For normal labels, this is the same as the main declaration
>   /// label, i.e., the location of the identifier; for GNU local labels,
> @@ -355,6 +358,7 @@
> 
> /// NamespaceDecl - Represent a C++ namespace.
> class NamespaceDecl : public NamedDecl, public DeclContext {
> +  virtual void anchor();
>   bool IsInline : 1;
> 
>   /// LocStart - The starting location of the source range, pointing
> @@ -498,6 +502,7 @@
> /// an lvalue) a function (in which case it is a function designator) or
> /// an enum constant.
> class ValueDecl : public NamedDecl {
> +  virtual void anchor();
>   QualType DeclType;
> 
> protected:
> @@ -1137,6 +1142,7 @@
> };
> 
> class ImplicitParamDecl : public VarDecl {
> +  virtual void anchor();
> public:
>   static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC,
>                                    SourceLocation IdLoc, IdentifierInfo *Id,
> @@ -2140,6 +2146,7 @@
> /// field injected from an anonymous union/struct into the parent scope.
> /// IndirectFieldDecl are always implicit.
> class IndirectFieldDecl : public ValueDecl {
> +  virtual void anchor();
>   NamedDecl **Chaining;
>   unsigned ChainingSize;
> 
> @@ -2179,6 +2186,7 @@
> /// TypeDecl - Represents a declaration of a type.
> ///
> class TypeDecl : public NamedDecl {
> +  virtual void anchor();
>   /// TypeForDecl - This indicates the Type object that represents
>   /// this TypeDecl.  It is a cache maintained by
>   /// ASTContext::getTypedefType, ASTContext::getTagDeclType, and
> @@ -2220,6 +2228,7 @@
> 
> /// Base class for declarations which introduce a typedef-name.
> class TypedefNameDecl : public TypeDecl, public Redeclarable<TypedefNameDecl> {
> +  virtual void anchor();
>   /// UnderlyingType - This is the type the typedef is set to.
>   TypeSourceInfo *TInfo;
> 
> @@ -2547,6 +2556,7 @@
> /// EnumDecl - Represents an enum.  As an extension, we allow forward-declared
> /// enums.
> class EnumDecl : public TagDecl {
> +  virtual void anchor();
>   /// IntegerType - This represent the integer type that the enum corresponds
>   /// to for code generation purposes.  Note that the enumerator constants may
>   /// have a different type than this does.
> @@ -2866,6 +2876,7 @@
> };
> 
> class FileScopeAsmDecl : public Decl {
> +  virtual void anchor();
>   StringLiteral *AsmString;
>   SourceLocation RParenLoc;
>   FileScopeAsmDecl(DeclContext *DC, StringLiteral *asmstring,
> 
> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
> +++ cfe/trunk/include/clang/AST/DeclCXX.h Mon Dec 19 20:48:34 2011
> @@ -104,6 +104,7 @@
> /// Also note that this class has nothing to do with so-called
> /// "access declarations" (C++98 11.3 [class.access.dcl]).
> class AccessSpecDecl : public Decl {
> +  virtual void anchor();
>   /// ColonLoc - The location of the ':'.
>   SourceLocation ColonLoc;
> 
> @@ -1316,6 +1317,7 @@
> /// CXXMethodDecl - Represents a static or instance method of a
> /// struct/union/class.
> class CXXMethodDecl : public FunctionDecl {
> +  virtual void anchor();
> protected:
>   CXXMethodDecl(Kind DK, CXXRecordDecl *RD, SourceLocation StartLoc,
>                 const DeclarationNameInfo &NameInfo,
> @@ -1325,9 +1327,9 @@
>     : FunctionDecl(DK, RD, StartLoc, NameInfo, T, TInfo,
>                    (isStatic ? SC_Static : SC_None),
>                    SCAsWritten, isInline, isConstexpr) {
> -      if (EndLocation.isValid())
> -        setRangeEnd(EndLocation);
> -    }
> +    if (EndLocation.isValid())
> +      setRangeEnd(EndLocation);
> +  }
> 
> public:
>   static CXXMethodDecl *Create(ASTContext &C, CXXRecordDecl *RD,
> @@ -1690,6 +1692,7 @@
> /// };
> /// @endcode
> class CXXConstructorDecl : public CXXMethodDecl {
> +  virtual void anchor();
>   /// IsExplicitSpecified - Whether this constructor declaration has the
>   /// 'explicit' keyword specified.
>   bool IsExplicitSpecified : 1;
> @@ -1918,6 +1921,7 @@
> /// };
> /// @endcode
> class CXXDestructorDecl : public CXXMethodDecl {
> +  virtual void anchor();
>   /// ImplicitlyDefined - Whether this destructor was implicitly
>   /// defined by the compiler. When false, the destructor was defined
>   /// by the user. In C++03, this flag will have the same value as
> @@ -1989,6 +1993,7 @@
> /// };
> /// @endcode
> class CXXConversionDecl : public CXXMethodDecl {
> +  virtual void anchor();
>   /// IsExplicitSpecified - Whether this conversion function declaration is
>   /// marked "explicit", meaning that it can only be applied when the user
>   /// explicitly wrote a cast. This is a C++0x feature.
> @@ -2045,6 +2050,7 @@
> ///   extern "C" void foo();
> ///
> class LinkageSpecDecl : public Decl, public DeclContext {
> +  virtual void anchor();
> public:
>   /// LanguageIDs - Used to represent the language in a linkage
>   /// specification.  The values are part of the serialization abi for
> @@ -2117,9 +2123,10 @@
> ///    using namespace std;
> ///
> // NB: UsingDirectiveDecl should be Decl not NamedDecl, but we provide
> -// artificial name, for all using-directives in order to store
> +// artificial names for all using-directives in order to store
> // them in DeclContext effectively.
> class UsingDirectiveDecl : public NamedDecl {
> +  virtual void anchor();
>   /// \brief The location of the "using" keyword.
>   SourceLocation UsingLoc;
> 
> @@ -2219,6 +2226,8 @@
> /// namespace Foo = Bar;
> /// @endcode
> class NamespaceAliasDecl : public NamedDecl {
> +  virtual void anchor();
> +
>   /// \brief The location of the "namespace" keyword.
>   SourceLocation NamespaceLoc;
> 
> @@ -2308,6 +2317,8 @@
> /// }
> ///
> class UsingShadowDecl : public NamedDecl {
> +  virtual void anchor();
> +
>   /// The referenced declaration.
>   NamedDecl *Underlying;
> 
> @@ -2367,6 +2378,8 @@
> /// UsingDecl - Represents a C++ using-declaration. For example:
> ///    using someNameSpace::someIdentifier;
> class UsingDecl : public NamedDecl {
> +  virtual void anchor();
> +
>   /// \brief The source location of the "using" location itself.
>   SourceLocation UsingLocation;
> 
> @@ -2497,6 +2510,8 @@
> ///   using Base<T>::foo;
> /// };
> class UnresolvedUsingValueDecl : public ValueDecl {
> +  virtual void anchor();
> +
>   /// \brief The source location of the 'using' keyword
>   SourceLocation UsingLocation;
> 
> @@ -2564,6 +2579,8 @@
> /// The type associated with a unresolved using typename decl is
> /// currently always a typename type.
> class UnresolvedUsingTypenameDecl : public TypeDecl {
> +  virtual void anchor();
> +
>   /// \brief The source location of the 'using' keyword
>   SourceLocation UsingLocation;
> 
> @@ -2612,6 +2629,7 @@
> 
> /// StaticAssertDecl - Represents a C++0x static_assert declaration.
> class StaticAssertDecl : public Decl {
> +  virtual void anchor();
>   Expr *AssertExpr;
>   StringLiteral *Message;
>   SourceLocation RParenLoc;
> 
> Modified: cfe/trunk/include/clang/AST/DeclFriend.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclFriend.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclFriend.h (original)
> +++ cfe/trunk/include/clang/AST/DeclFriend.h Mon Dec 19 20:48:34 2011
> @@ -35,6 +35,7 @@
> ///
> /// The semantic context of a friend decl is its declaring class.
> class FriendDecl : public Decl {
> +  virtual void anchor();
> public:
>   typedef llvm::PointerUnion<NamedDecl*,TypeSourceInfo*> FriendUnion;
> 
> 
> Modified: cfe/trunk/include/clang/AST/DeclObjC.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclObjC.h (original)
> +++ cfe/trunk/include/clang/AST/DeclObjC.h Mon Dec 19 20:48:34 2011
> @@ -426,6 +426,8 @@
> /// ObjCProtocolDecl, and ObjCImplDecl.
> ///
> class ObjCContainerDecl : public NamedDecl, public DeclContext {
> +  virtual void anchor();
> +
>   SourceLocation AtStart;
> 
>   // These two locations in the range mark the end of the method container.
> @@ -542,6 +544,8 @@
> ///
> class ObjCInterfaceDecl : public ObjCContainerDecl
>                         , public Redeclarable<ObjCInterfaceDecl> {
> +  virtual void anchor();
> +
>   /// TypeForDecl - This indicates the Type object that represents this
>   /// TypeDecl.  It is a cache maintained by ASTContext::getObjCInterfaceType
>   mutable const Type *TypeForDecl;
> @@ -949,6 +953,8 @@
> ///   }
> ///
> class ObjCIvarDecl : public FieldDecl {
> +  virtual void anchor();
> +
> public:
>   enum AccessControl {
>     None, Private, Protected, Public, Package
> @@ -1010,7 +1016,7 @@
> /// ObjCAtDefsFieldDecl - Represents a field declaration created by an
> ///  @defs(...).
> class ObjCAtDefsFieldDecl : public FieldDecl {
> -private:
> +  virtual void anchor();
>   ObjCAtDefsFieldDecl(DeclContext *DC, SourceLocation StartLoc,
>                       SourceLocation IdLoc, IdentifierInfo *Id,
>                       QualType T, Expr *BW)
> @@ -1055,6 +1061,8 @@
> /// id <NSDraggingInfo> anyObjectThatImplementsNSDraggingInfo;
> ///
> class ObjCProtocolDecl : public ObjCContainerDecl {
> +  virtual void anchor();
> +
>   /// Referenced protocols
>   ObjCProtocolList ReferencedProtocols;
> 
> @@ -1173,6 +1181,8 @@
> /// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
> ///
> class ObjCForwardProtocolDecl : public Decl {
> +  virtual void anchor();
> +
>   ObjCProtocolList ReferencedProtocols;
> 
>   ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L,
> @@ -1232,6 +1242,8 @@
> /// don't support this level of dynamism, which is both powerful and dangerous.
> ///
> class ObjCCategoryDecl : public ObjCContainerDecl {
> +  virtual void anchor();
> +
>   /// Interface belonging to this category
>   ObjCInterfaceDecl *ClassInterface;
> 
> @@ -1328,6 +1340,8 @@
> };
> 
> class ObjCImplDecl : public ObjCContainerDecl {
> +  virtual void anchor();
> +
>   /// Class interface for this class/category implementation
>   ObjCInterfaceDecl *ClassInterface;
> 
> @@ -1391,6 +1405,8 @@
> ///
> /// ObjCCategoryImplDecl
> class ObjCCategoryImplDecl : public ObjCImplDecl {
> +  virtual void anchor();
> +
>   // Category name
>   IdentifierInfo *Id;
> 
> @@ -1479,6 +1495,7 @@
> /// specified, they need to be *identical* to the interface.
> ///
> class ObjCImplementationDecl : public ObjCImplDecl {
> +  virtual void anchor();
>   /// Implementation Class's super class.
>   ObjCInterfaceDecl *SuperClass;
>   /// Support for ivar initialization.
> @@ -1609,6 +1626,7 @@
> /// ObjCCompatibleAliasDecl - Represents alias of a class. This alias is
> /// declared as @compatibility_alias alias class.
> class ObjCCompatibleAliasDecl : public NamedDecl {
> +  virtual void anchor();
>   /// Class that this is an alias of.
>   ObjCInterfaceDecl *AliasedClass;
> 
> @@ -1635,6 +1653,7 @@
> /// @property (assign, readwrite) int MyProperty;
> ///
> class ObjCPropertyDecl : public NamedDecl {
> +  virtual void anchor();
> public:
>   enum PropertyAttributeKind {
>     OBJC_PR_noattr    = 0x00,
> 
> Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
> +++ cfe/trunk/include/clang/AST/DeclTemplate.h Mon Dec 19 20:48:34 2011
> @@ -198,6 +198,7 @@
> /// parameters and a reference to the templated scoped declaration: the
> /// underlying AST node.
> class TemplateDecl : public NamedDecl {
> +  virtual void anchor();
> protected:
>   // This is probably never used.
>   TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
> @@ -1201,6 +1202,7 @@
> /// name of a template and the template parameters allowable for substitution.
> class TemplateTemplateParmDecl
>   : public TemplateDecl, protected TemplateParmPosition {
> +  virtual void anchor();
> 
>   /// DefaultArgument - The default template argument, if any.
>   TemplateArgumentLoc DefaultArgument;
> @@ -1561,6 +1563,8 @@
> 
> class ClassTemplatePartialSpecializationDecl
>   : public ClassTemplateSpecializationDecl {
> +  virtual void anchor();
> +
>   /// \brief The list of template parameters
>   TemplateParameterList* TemplateParams;
> 
> @@ -1941,6 +1945,7 @@
> /// NOTE: This class is not currently in use.  All of the above
> /// will yield a FriendDecl, not a FriendTemplateDecl.
> class FriendTemplateDecl : public Decl {
> +  virtual void anchor();
> public:
>   typedef llvm::PointerUnion<NamedDecl*,TypeSourceInfo*> FriendUnion;
> 
> @@ -2107,7 +2112,8 @@
> /// CXXMethodDecl. Then during an instantiation of class A, it will be
> /// transformed into an actual function specialization.
> class ClassScopeFunctionSpecializationDecl : public Decl {
> -private:
> +  virtual void anchor();
> +
>   ClassScopeFunctionSpecializationDecl(DeclContext *DC, SourceLocation Loc,
>                                        CXXMethodDecl *FD)
>     : Decl(Decl::ClassScopeFunctionSpecialization, DC, Loc),
> 
> Modified: cfe/trunk/include/clang/AST/ExprCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ExprCXX.h (original)
> +++ cfe/trunk/include/clang/AST/ExprCXX.h Mon Dec 19 20:48:34 2011
> @@ -1643,6 +1643,8 @@
> /// __array_rank(int[10][20]) == 2
> /// __array_extent(int, 1)    == 20
> class ArrayTypeTraitExpr : public Expr {
> +  virtual void anchor();
> +
>   /// ATT - The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
>   unsigned ATT : 2;
> 
> 
> Modified: cfe/trunk/include/clang/AST/Mangle.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Mangle.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Mangle.h (original)
> +++ cfe/trunk/include/clang/AST/Mangle.h Mon Dec 19 20:48:34 2011
> @@ -64,6 +64,8 @@
> /// MangleContext - Context for tracking state which persists across multiple
> /// calls to the C++ name mangler.
> class MangleContext {
> +  virtual void anchor();
> +
>   ASTContext &Context;
>   DiagnosticsEngine &Diags;
> 
> 
> Modified: cfe/trunk/include/clang/Analysis/Analyses/Dominators.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/Dominators.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/Analyses/Dominators.h (original)
> +++ cfe/trunk/include/clang/Analysis/Analyses/Dominators.h Mon Dec 19 20:48:34 2011
> @@ -31,6 +31,7 @@
> /// This class implements the dominators tree functionality given a Clang CFG.
> ///
> class DominatorTree : public ManagedAnalysis {
> +  virtual void anchor();
> public:
>   llvm::DominatorTreeBase<CFGBlock>* DT;
> 
> @@ -155,7 +156,7 @@
>   CFG *cfg;
> };
> 
> -void WriteAsOperand(raw_ostream &OS, const CFGBlock *BB,
> +inline void WriteAsOperand(raw_ostream &OS, const CFGBlock *BB,
>                           bool t) {
>   OS << "BB#" << BB->getBlockID();
> }
> 
> Modified: cfe/trunk/include/clang/Analysis/Analyses/LiveVariables.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/LiveVariables.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/Analyses/LiveVariables.h (original)
> +++ cfe/trunk/include/clang/Analysis/Analyses/LiveVariables.h Mon Dec 19 20:48:34 2011
> @@ -52,7 +52,9 @@
>     friend class LiveVariables;    
>   };
> 
> -  struct Observer {
> +  class Observer {
> +    virtual void anchor();
> +  public:
>     virtual ~Observer() {}
> 
>     /// A callback invoked right before invoking the
> 
> Modified: cfe/trunk/include/clang/Analysis/Analyses/PostOrderCFGView.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/PostOrderCFGView.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/Analyses/PostOrderCFGView.h (original)
> +++ cfe/trunk/include/clang/Analysis/Analyses/PostOrderCFGView.h Mon Dec 19 20:48:34 2011
> @@ -27,6 +27,7 @@
> namespace clang {
> 
> class PostOrderCFGView : public ManagedAnalysis {
> +  virtual void anchor();
> public:
>   /// \brief Implements a set of CFGBlocks using a BitVector.
>   ///
> 
> Modified: cfe/trunk/include/clang/Analysis/Analyses/ReachableCode.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Analyses/ReachableCode.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/Analyses/ReachableCode.h (original)
> +++ cfe/trunk/include/clang/Analysis/Analyses/ReachableCode.h Mon Dec 19 20:48:34 2011
> @@ -37,6 +37,7 @@
> namespace reachable_code {
> 
> class Callback {
> +  virtual void anchor();
> public:
>   virtual ~Callback() {}
>   virtual void HandleUnreachable(SourceLocation L, SourceRange R1,
> 
> Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
> +++ cfe/trunk/include/clang/Basic/Diagnostic.h Mon Dec 19 20:48:34 2011
> @@ -1118,6 +1118,7 @@
> /// IgnoringDiagConsumer - This is a diagnostic client that just ignores all
> /// diags.
> class IgnoringDiagConsumer : public DiagnosticConsumer {
> +  virtual void anchor();
>   void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
>                         const Diagnostic &Info) {
>     // Just ignore it.
> 
> Modified: cfe/trunk/include/clang/Basic/FileSystemStatCache.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/FileSystemStatCache.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/FileSystemStatCache.h (original)
> +++ cfe/trunk/include/clang/Basic/FileSystemStatCache.h Mon Dec 19 20:48:34 2011
> @@ -25,6 +25,7 @@
> /// system calls, which is used by precompiled and pretokenized headers to
> /// improve performance.
> class FileSystemStatCache {
> +  virtual void anchor();
> protected:
>   llvm::OwningPtr<FileSystemStatCache> NextStatCache;
> 
> 
> Modified: cfe/trunk/include/clang/CodeGen/CodeGenAction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/CodeGen/CodeGenAction.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/CodeGen/CodeGenAction.h (original)
> +++ cfe/trunk/include/clang/CodeGen/CodeGenAction.h Mon Dec 19 20:48:34 2011
> @@ -63,31 +63,37 @@
> };
> 
> class EmitAssemblyAction : public CodeGenAction {
> +  virtual void anchor();
> public:
>   EmitAssemblyAction(llvm::LLVMContext *_VMContext = 0);
> };
> 
> class EmitBCAction : public CodeGenAction {
> +  virtual void anchor();
> public:
>   EmitBCAction(llvm::LLVMContext *_VMContext = 0);
> };
> 
> class EmitLLVMAction : public CodeGenAction {
> +  virtual void anchor();
> public:
>   EmitLLVMAction(llvm::LLVMContext *_VMContext = 0);
> };
> 
> class EmitLLVMOnlyAction : public CodeGenAction {
> +  virtual void anchor();
> public:
>   EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = 0);
> };
> 
> class EmitCodeGenOnlyAction : public CodeGenAction {
> +  virtual void anchor();
> public:
>   EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = 0);
> };
> 
> class EmitObjAction : public CodeGenAction {
> +  virtual void anchor();
> public:
>   EmitObjAction(llvm::LLVMContext *_VMContext = 0);
> };
> 
> Modified: cfe/trunk/include/clang/CodeGen/ModuleBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/CodeGen/ModuleBuilder.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/CodeGen/ModuleBuilder.h (original)
> +++ cfe/trunk/include/clang/CodeGen/ModuleBuilder.h Mon Dec 19 20:48:34 2011
> @@ -28,6 +28,7 @@
>   class CodeGenOptions;
> 
>   class CodeGenerator : public ASTConsumer {
> +    virtual void anchor();
>   public:
>     virtual llvm::Module* GetModule() = 0;
>     virtual llvm::Module* ReleaseModule() = 0;
> 
> Modified: cfe/trunk/include/clang/Driver/Action.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Action.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Action.h (original)
> +++ cfe/trunk/include/clang/Driver/Action.h Mon Dec 19 20:48:34 2011
> @@ -94,6 +94,7 @@
> };
> 
> class InputAction : public Action {
> +  virtual void anchor();
>   const Arg &Input;
> public:
>   InputAction(const Arg &_Input, types::ID _Type);
> @@ -107,6 +108,7 @@
> };
> 
> class BindArchAction : public Action {
> +  virtual void anchor();
>   /// The architecture to bind, or 0 if the default architecture
>   /// should be bound.
>   const char *ArchName;
> @@ -123,6 +125,7 @@
> };
> 
> class JobAction : public Action {
> +  virtual void anchor();
> protected:
>   JobAction(ActionClass Kind, Action *Input, types::ID Type);
>   JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type);
> @@ -136,6 +139,7 @@
> };
> 
> class PreprocessJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   PreprocessJobAction(Action *Input, types::ID OutputType);
> 
> @@ -146,6 +150,7 @@
> };
> 
> class PrecompileJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   PrecompileJobAction(Action *Input, types::ID OutputType);
> 
> @@ -156,6 +161,7 @@
> };
> 
> class AnalyzeJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   AnalyzeJobAction(Action *Input, types::ID OutputType);
> 
> @@ -166,6 +172,7 @@
> };
> 
> class CompileJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   CompileJobAction(Action *Input, types::ID OutputType);
> 
> @@ -176,6 +183,7 @@
> };
> 
> class AssembleJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   AssembleJobAction(Action *Input, types::ID OutputType);
> 
> @@ -186,6 +194,7 @@
> };
> 
> class LinkJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   LinkJobAction(ActionList &Inputs, types::ID Type);
> 
> @@ -196,6 +205,7 @@
> };
> 
> class LipoJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   LipoJobAction(ActionList &Inputs, types::ID Type);
> 
> @@ -206,6 +216,7 @@
> };
> 
> class DsymutilJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   DsymutilJobAction(ActionList &Inputs, types::ID Type);
> 
> @@ -216,6 +227,7 @@
> };
> 
> class VerifyJobAction : public JobAction {
> +  virtual void anchor();
> public:
>   VerifyJobAction(ActionList &Inputs, types::ID Type);
>   static bool classof(const Action *A) {
> 
> Modified: cfe/trunk/include/clang/Driver/Job.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Job.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Job.h (original)
> +++ cfe/trunk/include/clang/Driver/Job.h Mon Dec 19 20:48:34 2011
> @@ -46,6 +46,8 @@
>   /// Command - An executable path/name and argument vector to
>   /// execute.
> class Command : public Job {
> +  virtual void anchor();
> +
>   /// Source - The action which caused the creation of this job.
>   const Action &Source;
> 
> 
> Modified: cfe/trunk/include/clang/Frontend/ChainedDiagnosticConsumer.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ChainedDiagnosticConsumer.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/ChainedDiagnosticConsumer.h (original)
> +++ cfe/trunk/include/clang/Frontend/ChainedDiagnosticConsumer.h Mon Dec 19 20:48:34 2011
> @@ -21,6 +21,7 @@
> /// should be the "primary" client, and will be used for computing whether the
> /// diagnostics should be included in counts.
> class ChainedDiagnosticConsumer : public DiagnosticConsumer {
> +  virtual void anchor();
>   llvm::OwningPtr<DiagnosticConsumer> Primary;
>   llvm::OwningPtr<DiagnosticConsumer> Secondary;
> 
> 
> Modified: cfe/trunk/include/clang/Frontend/FrontendAction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendAction.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/FrontendAction.h (original)
> +++ cfe/trunk/include/clang/Frontend/FrontendAction.h Mon Dec 19 20:48:34 2011
> @@ -231,6 +231,7 @@
> };
> 
> class PluginASTAction : public ASTFrontendAction {
> +  virtual void anchor();
> protected:
>   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
>                                          StringRef InFile) = 0;
> 
> Modified: cfe/trunk/include/clang/Lex/Lexer.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Lexer.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/Lexer.h (original)
> +++ cfe/trunk/include/clang/Lex/Lexer.h Mon Dec 19 20:48:34 2011
> @@ -44,6 +44,8 @@
> /// or buffering/seeking of tokens, only forward lexing is supported.  It relies
> /// on the specified Preprocessor object to handle preprocessor directives, etc.
> class Lexer : public PreprocessorLexer {
> +  virtual void anchor();
> +
>   //===--------------------------------------------------------------------===//
>   // Constant configuration values for this lexer.
>   const char *BufferStart;       // Start of the buffer.
> 
> Modified: cfe/trunk/include/clang/Lex/PPCallbacks.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PPCallbacks.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/PPCallbacks.h (original)
> +++ cfe/trunk/include/clang/Lex/PPCallbacks.h Mon Dec 19 20:48:34 2011
> @@ -224,6 +224,7 @@
> 
> /// PPChainedCallbacks - Simple wrapper class for chaining callbacks.
> class PPChainedCallbacks : public PPCallbacks {
> +  virtual void anchor();
>   PPCallbacks *First, *Second;
> 
> public:
> 
> Modified: cfe/trunk/include/clang/Lex/PreprocessorLexer.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PreprocessorLexer.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/PreprocessorLexer.h (original)
> +++ cfe/trunk/include/clang/Lex/PreprocessorLexer.h Mon Dec 19 20:48:34 2011
> @@ -24,6 +24,7 @@
> class Preprocessor;
> 
> class PreprocessorLexer {
> +  virtual void anchor();
> protected:
>   Preprocessor *PP;              // Preprocessor object controlling lexing.
> 
> 
> Modified: cfe/trunk/include/clang/Sema/SemaConsumer.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/SemaConsumer.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/SemaConsumer.h (original)
> +++ cfe/trunk/include/clang/Sema/SemaConsumer.h Mon Dec 19 20:48:34 2011
> @@ -24,6 +24,7 @@
>   /// clients that read ASTs and then require further semantic
>   /// analysis of the entities in those ASTs.
>   class SemaConsumer : public ASTConsumer {
> +    virtual void anchor();
>   public:
>     SemaConsumer() {
>       ASTConsumer::SemaConsumer = true;
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h Mon Dec 19 20:48:34 2011
> @@ -52,6 +52,7 @@
> class BugReport {
> public:
>   class NodeResolver {
> +    virtual void anchor();
>   public:
>     virtual ~NodeResolver() {}
>     virtual const ExplodedNode*
> @@ -374,6 +375,7 @@
> };
> 
> class BugReporterContext {
> +  virtual void anchor();
>   GRBugReporter &BR;
> public:
>   BugReporterContext(GRBugReporter& br) : BR(br) {}
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h Mon Dec 19 20:48:34 2011
> @@ -49,6 +49,7 @@
> };
> 
> class BuiltinBug : public BugType {
> +  virtual void anchor();
>   const std::string desc;
> public:
>   BuiltinBug(const char *name, const char *description)
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h Mon Dec 19 20:48:34 2011
> @@ -46,6 +46,7 @@
> class PathDiagnostic;
> 
> class PathDiagnosticConsumer {
> +  virtual void anchor();
> public:
>   PathDiagnosticConsumer() {}
> 
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h Mon Dec 19 20:48:34 2011
> @@ -383,6 +383,7 @@
>                 check::_VoidCheck, check::_VoidCheck, check::_VoidCheck>
>   : public CheckerBase 
> {
> +  virtual void anchor();
> public:
>   static void _register(void *checker, CheckerManager &mgr) { }
> };
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h Mon Dec 19 20:48:34 2011
> @@ -31,6 +31,7 @@
>   class CheckerManager;
> 
> class AnalysisManager : public BugReporterData {
> +  virtual void anchor();
>   AnalysisDeclContextManager AnaCtxMgr;
> 
>   ASTContext &Ctx;
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h Mon Dec 19 20:48:34 2011
> @@ -211,6 +211,7 @@
> /// added to the builder (either as the input node set or as the newly
> /// constructed nodes) but did not have any outgoing transitions added.
> class NodeBuilder {
> +  virtual void anchor();
> protected:
>   const NodeBuilderContext &C;
> 
> @@ -305,6 +306,7 @@
> /// \class NodeBuilderWithSinks
> /// \brief This node builder keeps track of the generated sink nodes.
> class NodeBuilderWithSinks: public NodeBuilder {
> +  virtual void anchor();
> protected:
>   SmallVector<ExplodedNode*, 2> sinksGenerated;
>   ProgramPoint &Location;
> @@ -381,6 +383,7 @@
> /// \brief BranchNodeBuilder is responsible for constructing the nodes
> /// corresponding to the two branches of the if statement - true and false.
> class BranchNodeBuilder: public NodeBuilder {
> +  virtual void anchor();
>   const CFGBlock *DstT;
>   const CFGBlock *DstF;
> 
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h Mon Dec 19 20:48:34 2011
> @@ -228,6 +228,7 @@
> 
> // FIXME: Is this class necessary?
> class InterExplodedGraphMap {
> +  virtual void anchor();
>   llvm::DenseMap<const ExplodedNode*, ExplodedNode*> M;
>   friend class ExplodedGraph;
> 
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h Mon Dec 19 20:48:34 2011
> @@ -177,6 +177,7 @@
> };
> 
> class GlobalsSpaceRegion : public MemSpaceRegion {
> +  virtual void anchor();
> protected:
>   GlobalsSpaceRegion(MemRegionManager *mgr, Kind k)
>     : MemSpaceRegion(mgr, k) {}
> @@ -223,6 +224,7 @@
> };
> 
> class HeapSpaceRegion : public MemSpaceRegion {
> +  virtual void anchor();
>   friend class MemRegionManager;
> 
>   HeapSpaceRegion(MemRegionManager *mgr)
> @@ -234,6 +236,7 @@
> };
> 
> class UnknownSpaceRegion : public MemSpaceRegion {
> +  virtual void anchor();
>   friend class MemRegionManager;
>   UnknownSpaceRegion(MemRegionManager *mgr)
>     : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {}
> @@ -266,7 +269,7 @@
> };
> 
> class StackLocalsSpaceRegion : public StackSpaceRegion {
> -private:
> +  virtual void anchor();
>   friend class MemRegionManager;
>   StackLocalsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
>     : StackSpaceRegion(mgr, StackLocalsSpaceRegionKind, sfc) {}
> @@ -278,6 +281,7 @@
> 
> class StackArgumentsSpaceRegion : public StackSpaceRegion {
> private:
> +  virtual void anchor();
>   friend class MemRegionManager;
>   StackArgumentsSpaceRegion(MemRegionManager *mgr, const StackFrameContext *sfc)
>     : StackSpaceRegion(mgr, StackArgumentsSpaceRegionKind, sfc) {}
> @@ -291,6 +295,8 @@
> /// SubRegion - A region that subsets another larger region.  Most regions
> ///  are subclasses of SubRegion.
> class SubRegion : public MemRegion {
> +private:
> +  virtual void anchor();
> protected:
>   const MemRegion* superRegion;
>   SubRegion(const MemRegion* sReg, Kind k) : MemRegion(k), superRegion(sReg) {}
> @@ -351,6 +357,8 @@
> 
> /// TypedRegion - An abstract class representing regions that are typed.
> class TypedRegion : public SubRegion {
> +public:
> +  virtual void anchor();
> protected:
>   TypedRegion(const MemRegion* sReg, Kind k) : SubRegion(sReg, k) {}
> 
> @@ -371,6 +379,8 @@
> 
> /// TypedValueRegion - An abstract class representing regions having a typed value.
> class TypedValueRegion : public TypedRegion {
> +public:
> +  virtual void anchor();
> protected:
>   TypedValueRegion(const MemRegion* sReg, Kind k) : TypedRegion(sReg, k) {}
> 
> @@ -399,6 +409,8 @@
> 
> 
> class CodeTextRegion : public TypedRegion {
> +public:
> +  virtual void anchor();
> protected:
>   CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {}
> public:
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h Mon Dec 19 20:48:34 2011
> @@ -806,6 +806,7 @@
> /// A Utility class that allows to visit the reachable symbols using a custom
> /// SymbolVisitor.
> class ScanReachableSymbols : public SubRegionMap::Visitor  {
> +  virtual void anchor();
>   typedef llvm::DenseMap<const void*, unsigned> VisitedItems;
> 
>   VisitedItems visited;
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h Mon Dec 19 20:48:34 2011
> @@ -28,6 +28,7 @@
> class ProgramState;
> 
> class SValBuilder {
> +  virtual void anchor();
> protected:
>   ASTContext &Context;
> 
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h Mon Dec 19 20:48:34 2011
> @@ -258,10 +258,12 @@
> /// SubRegionMap - An abstract interface that represents a queryable map
> ///  between MemRegion objects and their subregions.
> class SubRegionMap {
> +  virtual void anchor();
> public:
>   virtual ~SubRegionMap() {}
> 
>   class Visitor {
> +    virtual void anchor();
>   public:
>     virtual ~Visitor() {}
>     virtual bool Visit(const MemRegion* Parent, const MemRegion* SubRegion) = 0;
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h Mon Dec 19 20:48:34 2011
> @@ -43,6 +43,7 @@
> class MemRegion;
> 
> class SubEngine {
> +  virtual void anchor();
> public:
>   virtual ~SubEngine() {}
> 
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h Mon Dec 19 20:48:34 2011
> @@ -43,6 +43,7 @@
> /// \brief Symbolic value. These values used to capture symbolic execution of
> /// the program.
> class SymExpr : public llvm::FoldingSetNode {
> +  virtual void anchor();
> public:
>   enum Kind { RegionValueKind, ConjuredKind, DerivedKind, ExtentKind,
>               MetadataKind,
> @@ -102,7 +103,7 @@
> /// \brief A symbol representing data which can be stored in a memory location
> /// (region).
> class SymbolData : public SymExpr {
> -private:
> +  virtual void anchor();
>   const SymbolID Sym;
> 
> protected:
> 
> Modified: cfe/trunk/lib/AST/AttrImpl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/AttrImpl.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/AttrImpl.cpp (original)
> +++ cfe/trunk/lib/AST/AttrImpl.cpp Mon Dec 19 20:48:34 2011
> @@ -19,4 +19,8 @@
> 
> Attr::~Attr() { }
> 
> +void InheritableAttr::anchor() { }
> +
> +void InheritableParamAttr::anchor() { }
> +
> #include "clang/AST/AttrImpl.inc"
> 
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Mon Dec 19 20:48:34 2011
> @@ -624,6 +624,8 @@
>   }
> }
> 
> +void NamedDecl::anchor() { }
> +
> void NamedDecl::ClearLinkageCache() {
>   // Note that we can't skip clearing the linkage of children just
>   // because the parent doesn't have cached linkage:  we don't cache
> @@ -2424,6 +2426,8 @@
> // EnumDecl Implementation
> //===----------------------------------------------------------------------===//
> 
> +void EnumDecl::anchor() { }
> +
> EnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC,
>                            SourceLocation StartLoc, SourceLocation IdLoc,
>                            IdentifierInfo *Id,
> @@ -2587,10 +2591,14 @@
> // Other Decl Allocation/Deallocation Method Implementations
> //===----------------------------------------------------------------------===//
> 
> +void TranslationUnitDecl::anchor() { }
> +
> TranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) {
>   return new (C) TranslationUnitDecl(C);
> }
> 
> +void LabelDecl::anchor() { }
> +
> LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC,
>                              SourceLocation IdentL, IdentifierInfo *II) {
>   return new (C) LabelDecl(DC, IdentL, II, 0, IdentL);
> @@ -2603,6 +2611,7 @@
>   return new (C) LabelDecl(DC, IdentL, II, 0, GnuLabelL);
> }
> 
> +void NamespaceDecl::anchor() { }
> 
> NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
>                                      SourceLocation StartLoc,
> @@ -2615,6 +2624,10 @@
>                        NextNamespace.get(getASTContext().getExternalSource()));
> }
> 
> +void ValueDecl::anchor() { }
> +
> +void ImplicitParamDecl::anchor() { }
> +
> ImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
>                                              SourceLocation IdLoc,
>                                              IdentifierInfo *Id,
> @@ -2649,6 +2662,8 @@
>   return new (C) EnumConstantDecl(CD, L, Id, T, E, V);
> }
> 
> +void IndirectFieldDecl::anchor() { }
> +
> IndirectFieldDecl *
> IndirectFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
>                           IdentifierInfo *Id, QualType T, NamedDecl **CH,
> @@ -2663,12 +2678,16 @@
>   return SourceRange(getLocation(), End);
> }
> 
> +void TypeDecl::anchor() { }
> +
> TypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
>                                  SourceLocation StartLoc, SourceLocation IdLoc,
>                                  IdentifierInfo *Id, TypeSourceInfo *TInfo) {
>   return new (C) TypedefDecl(DC, StartLoc, IdLoc, Id, TInfo);
> }
> 
> +void TypedefNameDecl::anchor() { }
> +
> TypeAliasDecl *TypeAliasDecl::Create(ASTContext &C, DeclContext *DC,
>                                      SourceLocation StartLoc,
>                                      SourceLocation IdLoc, IdentifierInfo *Id,
> @@ -2692,6 +2711,8 @@
>   return SourceRange(getLocStart(), RangeEnd);
> }
> 
> +void FileScopeAsmDecl::anchor() { }
> +
> FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC,
>                                            StringLiteral *Str,
>                                            SourceLocation AsmLoc,
> 
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Dec 19 20:48:34 2011
> @@ -28,6 +28,8 @@
> // Decl Allocation/Deallocation Method Implementations
> //===----------------------------------------------------------------------===//
> 
> +void AccessSpecDecl::anchor() { }
> +
> CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
>   : UserDeclaredConstructor(false), UserDeclaredCopyConstructor(false),
>     UserDeclaredMoveConstructor(false), UserDeclaredCopyAssignment(false),
> @@ -1155,6 +1157,8 @@
>   return false;
> }
> 
> +void CXXMethodDecl::anchor() { }
> +
> CXXMethodDecl *
> CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
>                       SourceLocation StartLoc,
> @@ -1404,6 +1408,8 @@
>   return SourceRange(getSourceLocation(), getRParenLoc());
> }
> 
> +void CXXConstructorDecl::anchor() { }
> +
> CXXConstructorDecl *
> CXXConstructorDecl::Create(ASTContext &C, EmptyShell Empty) {
>   return new (C) CXXConstructorDecl(0, SourceLocation(), DeclarationNameInfo(),
> @@ -1548,6 +1554,8 @@
>   addOverriddenMethod(BaseCtor);
> }
> 
> +void CXXDestructorDecl::anchor() { }
> +
> CXXDestructorDecl *
> CXXDestructorDecl::Create(ASTContext &C, EmptyShell Empty) {
>   return new (C) CXXDestructorDecl(0, SourceLocation(), DeclarationNameInfo(),
> @@ -1567,6 +1575,8 @@
>                                    isImplicitlyDeclared);
> }
> 
> +void CXXConversionDecl::anchor() { }
> +
> CXXConversionDecl *
> CXXConversionDecl::Create(ASTContext &C, EmptyShell Empty) {
>   return new (C) CXXConversionDecl(0, SourceLocation(), DeclarationNameInfo(),
> @@ -1589,6 +1599,8 @@
>                                    EndLocation);
> }
> 
> +void LinkageSpecDecl::anchor() { }
> +
> LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
>                                          DeclContext *DC,
>                                          SourceLocation ExternLoc,
> @@ -1598,6 +1610,8 @@
>   return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc);
> }
> 
> +void UsingDirectiveDecl::anchor() { }
> +
> UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
>                                                SourceLocation L,
>                                                SourceLocation NamespaceLoc,
> @@ -1618,6 +1632,8 @@
>   return cast_or_null<NamespaceDecl>(NominatedNamespace);
> }
> 
> +void NamespaceAliasDecl::anchor() { }
> +
> NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
>                                                SourceLocation UsingLoc,
>                                                SourceLocation AliasLoc,
> @@ -1631,6 +1647,8 @@
>                                     QualifierLoc, IdentLoc, Namespace);
> }
> 
> +void UsingShadowDecl::anchor() { }
> +
> UsingDecl *UsingShadowDecl::getUsingDecl() const {
>   const UsingShadowDecl *Shadow = this;
>   while (const UsingShadowDecl *NextShadow =
> @@ -1639,6 +1657,8 @@
>   return cast<UsingDecl>(Shadow->UsingOrNextShadow);
> }
> 
> +void UsingDecl::anchor() { }
> +
> void UsingDecl::addShadowDecl(UsingShadowDecl *S) {
>   assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() &&
>          "declaration already in set");
> @@ -1676,6 +1696,8 @@
>   return new (C) UsingDecl(DC, UL, QualifierLoc, NameInfo, IsTypeNameArg);
> }
> 
> +void UnresolvedUsingValueDecl::anchor() { }
> +
> UnresolvedUsingValueDecl *
> UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
>                                  SourceLocation UsingLoc,
> @@ -1685,6 +1707,8 @@
>                                           QualifierLoc, NameInfo);
> }
> 
> +void UnresolvedUsingTypenameDecl::anchor() { }
> +
> UnresolvedUsingTypenameDecl *
> UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
>                                     SourceLocation UsingLoc,
> @@ -1697,6 +1721,8 @@
>                                              TargetName.getAsIdentifierInfo());
> }
> 
> +void StaticAssertDecl::anchor() { }
> +
> StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
>                                            SourceLocation StaticAssertLoc,
>                                            Expr *AssertExpr,
> 
> Modified: cfe/trunk/lib/AST/DeclFriend.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclFriend.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclFriend.cpp (original)
> +++ cfe/trunk/lib/AST/DeclFriend.cpp Mon Dec 19 20:48:34 2011
> @@ -16,6 +16,8 @@
> #include "clang/AST/DeclTemplate.h"
> using namespace clang;
> 
> +void FriendDecl::anchor() { }
> +
> FriendDecl *FriendDecl::Create(ASTContext &C, DeclContext *DC,
>                                SourceLocation L,
>                                FriendUnion Friend,
> 
> Modified: cfe/trunk/lib/AST/DeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclObjC.cpp (original)
> +++ cfe/trunk/lib/AST/DeclObjC.cpp Mon Dec 19 20:48:34 2011
> @@ -46,6 +46,8 @@
> // ObjCInterfaceDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCContainerDecl::anchor() { }
> +
> /// getIvarDecl - This method looks up an ivar in this ContextDecl.
> ///
> ObjCIvarDecl *
> @@ -147,6 +149,8 @@
>   return 0;
> }
> 
> +void ObjCInterfaceDecl::anchor() { }
> +
> /// FindPropertyVisibleInPrimaryClass - Finds declaration of the property
> /// with name 'PropertyId' in the primary class; including those in protocols
> /// (direct or indirect) used by the primary class.
> @@ -876,6 +880,8 @@
> // ObjCIvarDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCIvarDecl::anchor() { }
> +
> ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCContainerDecl *DC,
>                                    SourceLocation StartLoc,
>                                    SourceLocation IdLoc, IdentifierInfo *Id,
> @@ -946,6 +952,8 @@
> // ObjCAtDefsFieldDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCAtDefsFieldDecl::anchor() { }
> +
> ObjCAtDefsFieldDecl
> *ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC,
>                              SourceLocation StartLoc,  SourceLocation IdLoc,
> @@ -957,6 +965,8 @@
> // ObjCProtocolDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCProtocolDecl::anchor() { }
> +
> ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC,
>                                            IdentifierInfo *Id,
>                                            SourceLocation nameLoc,
> @@ -1026,6 +1036,8 @@
> // ObjCForwardProtocolDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCForwardProtocolDecl::anchor() { }
> +
> ObjCForwardProtocolDecl::
> ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L,
>                         ObjCProtocolDecl *const *Elts, unsigned nElts,
> @@ -1048,6 +1060,8 @@
> // ObjCCategoryDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCCategoryDecl::anchor() { }
> +
> ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC,
>                                            SourceLocation AtLoc, 
>                                            SourceLocation ClassNameLoc,
> @@ -1089,6 +1103,8 @@
> // ObjCCategoryImplDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCCategoryImplDecl::anchor() { }
> +
> ObjCCategoryImplDecl *
> ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC,
>                              IdentifierInfo *Id,
> @@ -1108,6 +1124,8 @@
> }
> 
> 
> +void ObjCImplDecl::anchor() { }
> +
> void ObjCImplDecl::addPropertyImplementation(ObjCPropertyImplDecl *property) {
>   // FIXME: The context should be correct before we get here.
>   property->setLexicalDeclContext(this);
> @@ -1170,6 +1188,8 @@
> // ObjCImplementationDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCImplementationDecl::anchor() { }
> +
> ObjCImplementationDecl *
> ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC,
>                                ObjCInterfaceDecl *ClassInterface,
> @@ -1203,6 +1223,8 @@
> // ObjCCompatibleAliasDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCCompatibleAliasDecl::anchor() { }
> +
> ObjCCompatibleAliasDecl *
> ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC,
>                                 SourceLocation L,
> @@ -1215,6 +1237,8 @@
> // ObjCPropertyDecl
> //===----------------------------------------------------------------------===//
> 
> +void ObjCPropertyDecl::anchor() { }
> +
> ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC,
>                                            SourceLocation L,
>                                            IdentifierInfo *Id,
> 
> Modified: cfe/trunk/lib/AST/DeclTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclTemplate.cpp (original)
> +++ cfe/trunk/lib/AST/DeclTemplate.cpp Mon Dec 19 20:48:34 2011
> @@ -537,6 +537,8 @@
> // TemplateTemplateParmDecl Method Implementations
> //===----------------------------------------------------------------------===//
> 
> +void TemplateTemplateParmDecl::anchor() { }
> +
> TemplateTemplateParmDecl *
> TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
>                                  SourceLocation L, unsigned D, unsigned P,
> @@ -582,6 +584,12 @@
> }
> 
> //===----------------------------------------------------------------------===//
> +// TemplateDecl Implementation
> +//===----------------------------------------------------------------------===//
> +
> +void TemplateDecl::anchor() { }
> +
> +//===----------------------------------------------------------------------===//
> // ClassTemplateSpecializationDecl Implementation
> //===----------------------------------------------------------------------===//
> ClassTemplateSpecializationDecl::
> @@ -682,6 +690,8 @@
> //===----------------------------------------------------------------------===//
> // ClassTemplatePartialSpecializationDecl Implementation
> //===----------------------------------------------------------------------===//
> +void ClassTemplatePartialSpecializationDecl::anchor() { }
> +
> ClassTemplatePartialSpecializationDecl::
> ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
>                                        DeclContext *DC,
> @@ -749,6 +759,8 @@
> // FriendTemplateDecl Implementation
> //===----------------------------------------------------------------------===//
> 
> +void FriendTemplateDecl::anchor() { }
> +
> FriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
>                                                DeclContext *DC,
>                                                SourceLocation L,
> @@ -796,3 +808,8 @@
>   return CommonPtr;
> }
> 
> +//===----------------------------------------------------------------------===//
> +// ClassScopeFunctionSpecializationDecl Implementation
> +//===----------------------------------------------------------------------===//
> +
> +void ClassScopeFunctionSpecializationDecl::anchor() { }
> 
> Modified: cfe/trunk/lib/AST/ExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprCXX.cpp (original)
> +++ cfe/trunk/lib/AST/ExprCXX.cpp Mon Dec 19 20:48:34 2011
> @@ -1023,4 +1023,4 @@
>   return TemplateArgument(Arguments, NumArguments);
> }
> 
> -
> +void ArrayTypeTraitExpr::anchor() { }
> 
> Modified: cfe/trunk/lib/AST/Mangle.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Mangle.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Mangle.cpp (original)
> +++ cfe/trunk/lib/AST/Mangle.cpp Mon Dec 19 20:48:34 2011
> @@ -59,6 +59,8 @@
> 
> }
> 
> +void MangleContext::anchor() { }
> +
> void MangleContext::mangleGlobalBlock(const BlockDecl *BD,
>                                       raw_ostream &Out) {
>   Out << "__block_global_" << getBlockId(BD, false);
> 
> Added: cfe/trunk/lib/Analysis/Dominators.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/Dominators.cpp?rev=146959&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Analysis/Dominators.cpp (added)
> +++ cfe/trunk/lib/Analysis/Dominators.cpp Mon Dec 19 20:48:34 2011
> @@ -0,0 +1,14 @@
> +//=- Dominators.cpp - Implementation of dominators tree for Clang CFG C++ -*-=//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Analysis/Analyses/Dominators.h"
> +
> +using namespace clang;
> +
> +void DominatorTree::anchor() { }
> 
> Modified: cfe/trunk/lib/Analysis/LiveVariables.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/LiveVariables.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/LiveVariables.cpp (original)
> +++ cfe/trunk/lib/Analysis/LiveVariables.cpp Mon Dec 19 20:48:34 2011
> @@ -143,6 +143,8 @@
>   }
> }
> 
> +void LiveVariables::Observer::anchor() { }
> +
> LiveVariables::LivenessValues
> LiveVariablesImpl::merge(LiveVariables::LivenessValues valsA,
>                          LiveVariables::LivenessValues valsB) {  
> 
> Modified: cfe/trunk/lib/Analysis/PostOrderCFGView.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/PostOrderCFGView.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/PostOrderCFGView.cpp (original)
> +++ cfe/trunk/lib/Analysis/PostOrderCFGView.cpp Mon Dec 19 20:48:34 2011
> @@ -15,6 +15,8 @@
> 
> using namespace clang;
> 
> +void PostOrderCFGView::anchor() { }
> +
> PostOrderCFGView::PostOrderCFGView(const CFG *cfg) {
>   Blocks.reserve(cfg->getNumBlockIDs());
>   CFGBlockSet BSet(cfg);
> 
> Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/ReachableCode.cpp (original)
> +++ cfe/trunk/lib/Analysis/ReachableCode.cpp Mon Dec 19 20:48:34 2011
> @@ -251,7 +251,9 @@
> }
> 
> namespace clang { namespace reachable_code {
> -  
> +
> +void Callback::anchor() { }  
> +
> unsigned ScanReachableFromBlock(const CFGBlock *Start,
>                                 llvm::BitVector &Reachable) {
>   unsigned count = 0;
> 
> Modified: cfe/trunk/lib/Basic/Diagnostic.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/Diagnostic.cpp (original)
> +++ cfe/trunk/lib/Basic/Diagnostic.cpp Mon Dec 19 20:48:34 2011
> @@ -825,6 +825,8 @@
> ///  reported by DiagnosticsEngine.
> bool DiagnosticConsumer::IncludeInDiagnosticCounts() const { return true; }
> 
> +void IgnoringDiagConsumer::anchor() { }
> +
> PartialDiagnostic::StorageAllocator::StorageAllocator() {
>   for (unsigned I = 0; I != NumCached; ++I)
>     FreeList[I] = Cached + I;
> 
> Modified: cfe/trunk/lib/Basic/FileSystemStatCache.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/FileSystemStatCache.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/FileSystemStatCache.cpp (original)
> +++ cfe/trunk/lib/Basic/FileSystemStatCache.cpp Mon Dec 19 20:48:34 2011
> @@ -28,6 +28,8 @@
> #define S_ISDIR(s) ((_S_IFDIR & s) !=0)
> #endif
> 
> +void FileSystemStatCache::anchor() { }
> +
> /// FileSystemStatCache::get - Get the 'stat' information for the specified
> /// path, using the cache to accelerate it if possible.  This returns true if
> /// the path does not exist or false if it exists.
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Mon Dec 19 20:48:34 2011
> @@ -33,6 +33,7 @@
> 
> namespace clang {
>   class BackendConsumer : public ASTConsumer {
> +    virtual void anchor();
>     DiagnosticsEngine &Diags;
>     BackendAction Action;
>     const CodeGenOptions &CodeGenOpts;
> @@ -180,6 +181,8 @@
>     void InlineAsmDiagHandler2(const llvm::SMDiagnostic &,
>                                SourceLocation LocCookie);
>   };
> +  
> +  void BackendConsumer::anchor() {}
> }
> 
> /// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr
> @@ -406,20 +409,26 @@
> 
> //
> 
> +void EmitAssemblyAction::anchor() { }
> EmitAssemblyAction::EmitAssemblyAction(llvm::LLVMContext *_VMContext)
>   : CodeGenAction(Backend_EmitAssembly, _VMContext) {}
> 
> +void EmitBCAction::anchor() { }
> EmitBCAction::EmitBCAction(llvm::LLVMContext *_VMContext)
>   : CodeGenAction(Backend_EmitBC, _VMContext) {}
> 
> +void EmitLLVMAction::anchor() { }
> EmitLLVMAction::EmitLLVMAction(llvm::LLVMContext *_VMContext)
>   : CodeGenAction(Backend_EmitLL, _VMContext) {}
> 
> +void EmitLLVMOnlyAction::anchor() { }
> EmitLLVMOnlyAction::EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext)
>   : CodeGenAction(Backend_EmitNothing, _VMContext) {}
> 
> +void EmitCodeGenOnlyAction::anchor() { }
> EmitCodeGenOnlyAction::EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext)
>   : CodeGenAction(Backend_EmitMCNull, _VMContext) {}
> 
> +void EmitObjAction::anchor() { }
> EmitObjAction::EmitObjAction(llvm::LLVMContext *_VMContext)
>   : CodeGenAction(Backend_EmitObj, _VMContext) {}
> 
> Modified: cfe/trunk/lib/CodeGen/ModuleBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ModuleBuilder.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/ModuleBuilder.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ModuleBuilder.cpp Mon Dec 19 20:48:34 2011
> @@ -113,6 +113,8 @@
>   };
> }
> 
> +void CodeGenerator::anchor() { }
> +
> CodeGenerator *clang::CreateLLVMCodeGen(DiagnosticsEngine &Diags,
>                                         const std::string& ModuleName,
>                                         const CodeGenOptions &CGO,
> 
> Modified: cfe/trunk/lib/Driver/Action.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Action.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Action.cpp (original)
> +++ cfe/trunk/lib/Driver/Action.cpp Mon Dec 19 20:48:34 2011
> @@ -38,14 +38,20 @@
>   llvm_unreachable("invalid class");
> }
> 
> +void InputAction::anchor() {}
> +
> InputAction::InputAction(const Arg &_Input, types::ID _Type)
>   : Action(InputClass, _Type), Input(_Input) {
> }
> 
> +void BindArchAction::anchor() {}
> +
> BindArchAction::BindArchAction(Action *Input, const char *_ArchName)
>   : Action(BindArchClass, Input, Input->getType()), ArchName(_ArchName) {
> }
> 
> +void JobAction::anchor() {}
> +
> JobAction::JobAction(ActionClass Kind, Action *Input, types::ID Type)
>   : Action(Kind, Input, Type) {
> }
> @@ -54,38 +60,56 @@
>   : Action(Kind, Inputs, Type) {
> }
> 
> +void PreprocessJobAction::anchor() {}
> +
> PreprocessJobAction::PreprocessJobAction(Action *Input, types::ID OutputType)
>   : JobAction(PreprocessJobClass, Input, OutputType) {
> }
> 
> +void PrecompileJobAction::anchor() {}
> +
> PrecompileJobAction::PrecompileJobAction(Action *Input, types::ID OutputType)
>   : JobAction(PrecompileJobClass, Input, OutputType) {
> }
> 
> +void AnalyzeJobAction::anchor() {}
> +
> AnalyzeJobAction::AnalyzeJobAction(Action *Input, types::ID OutputType)
>   : JobAction(AnalyzeJobClass, Input, OutputType) {
> }
> 
> +void CompileJobAction::anchor() {}
> +
> CompileJobAction::CompileJobAction(Action *Input, types::ID OutputType)
>   : JobAction(CompileJobClass, Input, OutputType) {
> }
> 
> +void AssembleJobAction::anchor() {}
> +
> AssembleJobAction::AssembleJobAction(Action *Input, types::ID OutputType)
>   : JobAction(AssembleJobClass, Input, OutputType) {
> }
> 
> +void LinkJobAction::anchor() {}
> +
> LinkJobAction::LinkJobAction(ActionList &Inputs, types::ID Type)
>   : JobAction(LinkJobClass, Inputs, Type) {
> }
> 
> +void LipoJobAction::anchor() {}
> +
> LipoJobAction::LipoJobAction(ActionList &Inputs, types::ID Type)
>   : JobAction(LipoJobClass, Inputs, Type) {
> }
> 
> +void DsymutilJobAction::anchor() {}
> +
> DsymutilJobAction::DsymutilJobAction(ActionList &Inputs, types::ID Type)
>   : JobAction(DsymutilJobClass, Inputs, Type) {
> }
> 
> +void VerifyJobAction::anchor() {}
> +
> VerifyJobAction::VerifyJobAction(ActionList &Inputs, types::ID Type)
>   : JobAction(VerifyJobClass, Inputs, Type) {
> }
> 
> Modified: cfe/trunk/lib/Driver/Job.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Job.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Job.cpp (original)
> +++ cfe/trunk/lib/Driver/Job.cpp Mon Dec 19 20:48:34 2011
> @@ -16,6 +16,8 @@
> 
> Job::~Job() {}
> 
> +void Command::anchor() {}
> +
> Command::Command(const Action &_Source, const Tool &_Creator,
>                  const char *_Executable, const ArgStringList &_Arguments)
>   : Job(CommandClass), Source(_Source), Creator(_Creator),
> 
> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains.cpp Mon Dec 19 20:48:34 2011
> @@ -192,6 +192,8 @@
>   return Triple.getTriple();
> }
> 
> +void Generic_ELF::anchor() {}
> +
> Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
>                          const ActionList &Inputs) const {
>   Action::ActionClass Key;
> 
> Modified: cfe/trunk/lib/Driver/ToolChains.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains.h (original)
> +++ cfe/trunk/lib/Driver/ToolChains.h Mon Dec 19 20:48:34 2011
> @@ -423,7 +423,8 @@
> };
> 
> class LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
> - public:
> +  virtual void anchor();
> +public:
>   Generic_ELF(const HostInfo &Host, const llvm::Triple& Triple)
>     : Generic_GCC(Host, Triple) {}
> 
> 
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Mon Dec 19 20:48:34 2011
> @@ -2865,6 +2865,8 @@
>   }
> }
> 
> +void darwin::CC1::anchor() {}
> +
> const char *darwin::CC1::getBaseInputName(const ArgList &Args,
>                                           const InputInfoList &Inputs) {
>   return Args.MakeArgString(
> @@ -3509,6 +3511,8 @@
>   C.addCommand(new Command(JA, *this, Exec, CmdArgs));
> }
> 
> +void darwin::DarwinTool::anchor() {}
> +
> void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
>                                        ArgStringList &CmdArgs) const {
>   StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
> 
> Modified: cfe/trunk/lib/Driver/Tools.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.h (original)
> +++ cfe/trunk/lib/Driver/Tools.h Mon Dec 19 20:48:34 2011
> @@ -192,6 +192,7 @@
> 
> namespace darwin {
>   class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
> +    virtual void anchor();
>   protected:
>     void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
> 
> @@ -205,6 +206,7 @@
>   };
> 
>   class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool  {
> +    virtual void anchor();
>   public:
>     static const char *getBaseInputName(const ArgList &Args,
>                                  const InputInfoList &Input);
> 
> Added: cfe/trunk/lib/Frontend/ChainedDiagnosticConsumer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ChainedDiagnosticConsumer.cpp?rev=146959&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ChainedDiagnosticConsumer.cpp (added)
> +++ cfe/trunk/lib/Frontend/ChainedDiagnosticConsumer.cpp Mon Dec 19 20:48:34 2011
> @@ -0,0 +1,14 @@
> +//===- ChainedDiagnosticConsumer.cpp - Chain Diagnostic Clients -*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Frontend/ChainedDiagnosticConsumer.h"
> +
> +using namespace clang;
> +
> +void ChainedDiagnosticConsumer::anchor() { }
> 
> Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/FrontendAction.cpp (original)
> +++ cfe/trunk/lib/Frontend/FrontendAction.cpp Mon Dec 19 20:48:34 2011
> @@ -411,6 +411,8 @@
>   ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats);
> }
> 
> +void PluginASTAction::anchor() { }
> +
> ASTConsumer *
> PreprocessorFrontendAction::CreateASTConsumer(CompilerInstance &CI,
>                                               StringRef InFile) {
> 
> Modified: cfe/trunk/lib/Lex/Lexer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/Lexer.cpp (original)
> +++ cfe/trunk/lib/Lex/Lexer.cpp Mon Dec 19 20:48:34 2011
> @@ -59,6 +59,8 @@
> // Lexer Class Implementation
> //===----------------------------------------------------------------------===//
> 
> +void Lexer::anchor() { }
> +
> void Lexer::InitLexer(const char *BufStart, const char *BufPtr,
>                       const char *BufEnd) {
>   InitCharacterInfo();
> 
> Added: cfe/trunk/lib/Lex/PPCallbacks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPCallbacks.cpp?rev=146959&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPCallbacks.cpp (added)
> +++ cfe/trunk/lib/Lex/PPCallbacks.cpp Mon Dec 19 20:48:34 2011
> @@ -0,0 +1,14 @@
> +//===--- PPCallbacks.cpp - Callbacks for Preprocessor actions ---*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Lex/PPCallbacks.h"
> +
> +using namespace clang;
> +
> +void PPChainedCallbacks::anchor() { }
> 
> Modified: cfe/trunk/lib/Lex/PreprocessorLexer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PreprocessorLexer.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/PreprocessorLexer.cpp (original)
> +++ cfe/trunk/lib/Lex/PreprocessorLexer.cpp Mon Dec 19 20:48:34 2011
> @@ -17,6 +17,8 @@
> #include "clang/Basic/SourceManager.h"
> using namespace clang;
> 
> +void PreprocessorLexer::anchor() { }
> +
> PreprocessorLexer::PreprocessorLexer(Preprocessor *pp, FileID fid)
>   : PP(pp), FID(fid), InitialNumSLocEntries(0),
>     ParsingPreprocessorDirective(false),
> 
> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Mon Dec 19 20:48:34 2011
> @@ -284,6 +284,9 @@
> /// The Objective-C property callback.  This should be defined where
> /// it's used, but instead it's been lifted to here to support VS2005.
> struct Parser::ObjCPropertyCallback : FieldCallback {
> +private:
> +  virtual void anchor();
> +public:
>   Parser &P;
>   SmallVectorImpl<Decl *> &Props;
>   ObjCDeclSpec &OCDS;
> @@ -337,6 +340,9 @@
>   }
> };
> 
> +void Parser::ObjCPropertyCallback::anchor() {
> +}
> +
> ///   objc-interface-decl-list:
> ///     empty
> ///     objc-interface-decl-list objc-property-decl [OBJC2]
> 
> Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)
> +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Mon Dec 19 20:48:34 2011
> @@ -634,6 +634,7 @@
>   }
> };
> 
> +namespace {
> class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler {
>   Sema &S;
>   DiagList Warnings;
> @@ -744,6 +745,7 @@
> };
> }
> }
> +}
> 
> //===----------------------------------------------------------------------===//
> // AnalysisBasedWarnings - Worker object used by Sema to execute analysis-based
> 
> Added: cfe/trunk/lib/Sema/SemaConsumer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaConsumer.cpp?rev=146959&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaConsumer.cpp (added)
> +++ cfe/trunk/lib/Sema/SemaConsumer.cpp Mon Dec 19 20:48:34 2011
> @@ -0,0 +1,14 @@
> +//===-- SemaConsumer.cpp - Abstract interface for AST semantics -*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Sema/SemaConsumer.h"
> +
> +using namespace clang;
> +
> +void SemaConsumer::anchor() { }
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp Mon Dec 19 20:48:34 2011
> @@ -14,6 +14,8 @@
> using namespace clang;
> using namespace ento;
> 
> +void AnalysisManager::anchor() { }
> +
> AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
>                                  const LangOptions &lang,
>                                  PathDiagnosticConsumer *pd,
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp Mon Dec 19 20:48:34 2011
> @@ -34,6 +34,8 @@
> 
> BugReporterVisitor::~BugReporterVisitor() {}
> 
> +void BugReporterContext::anchor() {}
> +
> //===----------------------------------------------------------------------===//
> // Helper routines for walking the ExplodedGraph and fetching statements.
> //===----------------------------------------------------------------------===//
> @@ -1204,10 +1206,14 @@
> 
> void BugType::FlushReports(BugReporter &BR) {}
> 
> +void BuiltinBug::anchor() {}
> +
> //===----------------------------------------------------------------------===//
> // Methods for BugReport and subclasses.
> //===----------------------------------------------------------------------===//
> 
> +void BugReport::NodeResolver::anchor() {}
> +
> void BugReport::addVisitor(BugReporterVisitor* visitor) {
>   if (!visitor)
>     return;
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/Checker.cpp Mon Dec 19 20:48:34 2011
> @@ -20,3 +20,11 @@
>   // FIXME: We want to return the package + name of the checker here.
>   return "A Checker";  
> }
> +
> +void Checker<check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
> +             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
> +             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
> +             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
> +             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
> +             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck
> +             >::anchor() { }
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp Mon Dec 19 20:48:34 2011
> @@ -537,6 +537,8 @@
> }
> 
> 
> +void NodeBuilder::anchor() { }
> +
> ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc,
>                                             const ProgramState *State,
>                                             ExplodedNode *FromN,
> @@ -556,6 +558,8 @@
>   return N;
> }
> 
> +void NodeBuilderWithSinks::anchor() { }
> +
> StmtNodeBuilder::~StmtNodeBuilder() {
>   if (EnclosingBldr)
>     for (ExplodedNodeSet::iterator I = Frontier.begin(),
> @@ -563,6 +567,8 @@
>       EnclosingBldr->addNodes(*I);
> }
> 
> +void BranchNodeBuilder::anchor() { }
> +
> ExplodedNode *BranchNodeBuilder::generateNode(const ProgramState *State,
>                                               bool branch,
>                                               ExplodedNode *NodePred) {
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExplodedGraph.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExplodedGraph.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExplodedGraph.cpp Mon Dec 19 20:48:34 2011
> @@ -379,6 +379,8 @@
>   return G;
> }
> 
> +void InterExplodedGraphMap::anchor() { }
> +
> ExplodedNode*
> InterExplodedGraphMap::getMappedNode(const ExplodedNode *N) const {
>   llvm::DenseMap<const ExplodedNode*, ExplodedNode*>::const_iterator I =
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp Mon Dec 19 20:48:34 2011
> @@ -384,6 +384,20 @@
> }
> 
> //===----------------------------------------------------------------------===//
> +// Region anchors.
> +//===----------------------------------------------------------------------===//
> +
> +void GlobalsSpaceRegion::anchor() { }
> +void HeapSpaceRegion::anchor() { }
> +void UnknownSpaceRegion::anchor() { }
> +void StackLocalsSpaceRegion::anchor() { }
> +void StackArgumentsSpaceRegion::anchor() { }
> +void TypedRegion::anchor() { }
> +void TypedValueRegion::anchor() { }
> +void CodeTextRegion::anchor() { }
> +void SubRegion::anchor() { }
> +
> +//===----------------------------------------------------------------------===//
> // Region pretty-printing.
> //===----------------------------------------------------------------------===//
> 
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Mon Dec 19 20:48:34 2011
> @@ -82,6 +82,8 @@
>     Desc(StripTrailingDots(desc)),
>     Category(StripTrailingDots(category)) {}
> 
> +void PathDiagnosticConsumer::anchor() { }
> +
> void PathDiagnosticConsumer::HandlePathDiagnostic(const PathDiagnostic *D) {
>   // For now this simply forwards to HandlePathDiagnosticImpl.  In the future
>   // we can use this indirection to control for multi-threaded access to
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp Mon Dec 19 20:48:34 2011
> @@ -536,6 +536,8 @@
>   return getPersistentState(NewState);
> }
> 
> +void ScanReachableSymbols::anchor() { }
> +
> bool ScanReachableSymbols::scan(nonloc::CompoundVal val) {
>   for (nonloc::CompoundVal::iterator I=val.begin(), E=val.end(); I!=E; ++I)
>     if (!scan(*I))
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp Mon Dec 19 20:48:34 2011
> @@ -25,6 +25,8 @@
> // Basic SVal creation.
> //===----------------------------------------------------------------------===//
> 
> +void SValBuilder::anchor() { }
> +
> DefinedOrUnknownSVal SValBuilder::makeZeroVal(QualType type) {
>   if (Loc::isLocType(type))
>     return makeNull();
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/Store.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/Store.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/Store.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/Store.cpp Mon Dec 19 20:48:34 2011
> @@ -331,3 +331,5 @@
> 
> StoreManager::BindingsHandler::~BindingsHandler() {}
> 
> +void SubRegionMap::anchor() { }
> +void SubRegionMap::Visitor::anchor() { }
> 
> Added: cfe/trunk/lib/StaticAnalyzer/Core/SubEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/SubEngine.cpp?rev=146959&view=auto
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/SubEngine.cpp (added)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/SubEngine.cpp Mon Dec 19 20:48:34 2011
> @@ -0,0 +1,14 @@
> +//== SubEngine.cpp - Interface of the subengine of CoreEngine ------*- C++ -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h"
> +
> +using namespace clang::ento;
> +
> +void SubEngine::anchor() { }
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp Mon Dec 19 20:48:34 2011
> @@ -21,6 +21,8 @@
> using namespace clang;
> using namespace ento;
> 
> +void SymExpr::anchor() { }
> +
> void SymExpr::dump() const {
>   dumpToStream(llvm::errs());
> }
> @@ -99,6 +101,8 @@
>      << getRegion() << ',' << T.getAsString() << '}';
> }
> 
> +void SymbolData::anchor() { }
> +
> void SymbolRegionValue::dumpToStream(raw_ostream &os) const {
>   os << "reg_$" << getSymbolID() << "<" << R << ">";
> }
> 
> Modified: cfe/trunk/utils/TableGen/TableGen.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/TableGen.cpp?rev=146959&r1=146958&r2=146959&view=diff
> ==============================================================================
> --- cfe/trunk/utils/TableGen/TableGen.cpp (original)
> +++ cfe/trunk/utils/TableGen/TableGen.cpp Mon Dec 19 20:48:34 2011
> @@ -96,7 +96,6 @@
>   ClangComponent("clang-component",
>                  cl::desc("Only use warnings from specified component"),
>                  cl::value_desc("component"), cl::Hidden);
> -}
> 
> class ClangTableGenAction : public TableGenAction {
> public:
> @@ -165,6 +164,7 @@
>     return false;
>   }
> };
> +}
> 
> int main(int argc, char **argv) {
>   sys::PrintStackTraceOnErrorSignal();
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list