From: David Blaikie Date: Tue, 20 Dec 2011 02:48:34 +0000 (+0000) Subject: Unweaken vtables as per http://llvm.org/docs/CodingStandards.html#ll_virtual_anch X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=99ba9e3bd70671f3441fb974895f226a83ce0e66;p=clang Unweaken vtables as per http://llvm.org/docs/CodingStandards.html#ll_virtual_anch git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146959 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Attr.h b/include/clang/AST/Attr.h index 345cc94510..449e916eb1 100644 --- a/include/clang/AST/Attr.h +++ b/include/clang/AST/Attr.h @@ -112,6 +112,7 @@ public: }; class InheritableAttr : public Attr { + virtual void anchor(); protected: InheritableAttr(attr::Kind AK, SourceRange R) : Attr(AK, R) {} @@ -127,6 +128,7 @@ public: }; class InheritableParamAttr : public InheritableAttr { + virtual void anchor(); protected: InheritableParamAttr(attr::Kind AK, SourceRange R) : InheritableAttr(AK, R) {} diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 0a24b72560..6b97a5775a 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -67,6 +67,7 @@ public: /// 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 @@ public: /// 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 @@ inline raw_ostream &operator<<(raw_ostream &OS, const NamedDecl &ND) { /// 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 @@ public: /// 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 @@ public: /// 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 @@ public: }; class ImplicitParamDecl : public VarDecl { + virtual void anchor(); public: static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, @@ -2140,6 +2146,7 @@ public: /// 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 @@ public: /// 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 @@ public: /// Base class for declarations which introduce a typedef-name. class TypedefNameDecl : public TypeDecl, public Redeclarable { + virtual void anchor(); /// UnderlyingType - This is the type the typedef is set to. TypeSourceInfo *TInfo; @@ -2547,6 +2556,7 @@ public: /// 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 @@ private: }; class FileScopeAsmDecl : public Decl { + virtual void anchor(); StringLiteral *AsmString; SourceLocation RParenLoc; FileScopeAsmDecl(DeclContext *DC, StringLiteral *asmstring, diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index c8a703f38f..7c040e7d2e 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -104,6 +104,7 @@ namespace clang { /// 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 @@ public: /// 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 @@ protected: : 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 @@ public: /// }; /// @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 @@ public: /// }; /// @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 @@ public: /// }; /// @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 @@ public: /// 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 @@ public: /// 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 @@ public: /// namespace Foo = Bar; /// @endcode class NamespaceAliasDecl : public NamedDecl { + virtual void anchor(); + /// \brief The location of the "namespace" keyword. SourceLocation NamespaceLoc; @@ -2308,6 +2317,8 @@ public: /// } /// class UsingShadowDecl : public NamedDecl { + virtual void anchor(); + /// The referenced declaration. NamedDecl *Underlying; @@ -2367,6 +2378,8 @@ public: /// 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 @@ public: /// using Base::foo; /// }; class UnresolvedUsingValueDecl : public ValueDecl { + virtual void anchor(); + /// \brief The source location of the 'using' keyword SourceLocation UsingLocation; @@ -2564,6 +2579,8 @@ public: /// 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 @@ public: /// StaticAssertDecl - Represents a C++0x static_assert declaration. class StaticAssertDecl : public Decl { + virtual void anchor(); Expr *AssertExpr; StringLiteral *Message; SourceLocation RParenLoc; diff --git a/include/clang/AST/DeclFriend.h b/include/clang/AST/DeclFriend.h index b84e5bba86..07f696a4df 100644 --- a/include/clang/AST/DeclFriend.h +++ b/include/clang/AST/DeclFriend.h @@ -35,6 +35,7 @@ namespace clang { /// /// The semantic context of a friend decl is its declaring class. class FriendDecl : public Decl { + virtual void anchor(); public: typedef llvm::PointerUnion FriendUnion; diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 6a0b6acc87..8cc6e7374d 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -426,6 +426,8 @@ public: /// 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 @@ public: /// class ObjCInterfaceDecl : public ObjCContainerDecl , public Redeclarable { + 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 @@ public: /// } /// class ObjCIvarDecl : public FieldDecl { + virtual void anchor(); + public: enum AccessControl { None, Private, Protected, Public, Package @@ -1010,7 +1016,7 @@ private: /// 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 @@ public: /// id anyObjectThatImplementsNSDraggingInfo; /// class ObjCProtocolDecl : public ObjCContainerDecl { + virtual void anchor(); + /// Referenced protocols ObjCProtocolList ReferencedProtocols; @@ -1173,6 +1181,8 @@ public: /// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo; /// class ObjCForwardProtocolDecl : public Decl { + virtual void anchor(); + ObjCProtocolList ReferencedProtocols; ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, @@ -1232,6 +1242,8 @@ public: /// 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 @@ public: }; class ObjCImplDecl : public ObjCContainerDecl { + virtual void anchor(); + /// Class interface for this class/category implementation ObjCInterfaceDecl *ClassInterface; @@ -1391,6 +1405,8 @@ public: /// /// ObjCCategoryImplDecl class ObjCCategoryImplDecl : public ObjCImplDecl { + virtual void anchor(); + // Category name IdentifierInfo *Id; @@ -1479,6 +1495,7 @@ raw_ostream &operator<<(raw_ostream &OS, /// 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 @@ raw_ostream &operator<<(raw_ostream &OS, /// 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 @@ public: /// @property (assign, readwrite) int MyProperty; /// class ObjCPropertyDecl : public NamedDecl { + virtual void anchor(); public: enum PropertyAttributeKind { OBJC_PR_noattr = 0x00, diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index 9149850e8f..f6bc41a640 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -198,6 +198,7 @@ public: /// 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 @@ public: /// 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 @@ public: class ClassTemplatePartialSpecializationDecl : public ClassTemplateSpecializationDecl { + virtual void anchor(); + /// \brief The list of template parameters TemplateParameterList* TemplateParams; @@ -1941,6 +1945,7 @@ public: /// 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 FriendUnion; @@ -2107,7 +2112,8 @@ public: /// 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), diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index 4ea1ef4aa9..9d07e051ad 100644 --- a/include/clang/AST/ExprCXX.h +++ b/include/clang/AST/ExprCXX.h @@ -1643,6 +1643,8 @@ public: /// __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; diff --git a/include/clang/AST/Mangle.h b/include/clang/AST/Mangle.h index f58a83b54b..5a42aec0dc 100644 --- a/include/clang/AST/Mangle.h +++ b/include/clang/AST/Mangle.h @@ -64,6 +64,8 @@ private: /// MangleContext - Context for tracking state which persists across multiple /// calls to the C++ name mangler. class MangleContext { + virtual void anchor(); + ASTContext &Context; DiagnosticsEngine &Diags; diff --git a/include/clang/Analysis/Analyses/Dominators.h b/include/clang/Analysis/Analyses/Dominators.h index a9b80593d1..e9a431a991 100644 --- a/include/clang/Analysis/Analyses/Dominators.h +++ b/include/clang/Analysis/Analyses/Dominators.h @@ -31,6 +31,7 @@ typedef llvm::DomTreeNodeBase DomTreeNode; /// This class implements the dominators tree functionality given a Clang CFG. /// class DominatorTree : public ManagedAnalysis { + virtual void anchor(); public: llvm::DominatorTreeBase* DT; @@ -155,7 +156,7 @@ private: 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(); } diff --git a/include/clang/Analysis/Analyses/LiveVariables.h b/include/clang/Analysis/Analyses/LiveVariables.h index 42e56b26e0..c9f39b46b9 100644 --- a/include/clang/Analysis/Analyses/LiveVariables.h +++ b/include/clang/Analysis/Analyses/LiveVariables.h @@ -52,7 +52,9 @@ public: friend class LiveVariables; }; - struct Observer { + class Observer { + virtual void anchor(); + public: virtual ~Observer() {} /// A callback invoked right before invoking the diff --git a/include/clang/Analysis/Analyses/PostOrderCFGView.h b/include/clang/Analysis/Analyses/PostOrderCFGView.h index 57db398054..4e3244e7b7 100644 --- a/include/clang/Analysis/Analyses/PostOrderCFGView.h +++ b/include/clang/Analysis/Analyses/PostOrderCFGView.h @@ -27,6 +27,7 @@ namespace clang { class PostOrderCFGView : public ManagedAnalysis { + virtual void anchor(); public: /// \brief Implements a set of CFGBlocks using a BitVector. /// diff --git a/include/clang/Analysis/Analyses/ReachableCode.h b/include/clang/Analysis/Analyses/ReachableCode.h index a5dba6eefe..30c5b2d7a5 100644 --- a/include/clang/Analysis/Analyses/ReachableCode.h +++ b/include/clang/Analysis/Analyses/ReachableCode.h @@ -37,6 +37,7 @@ namespace clang { namespace reachable_code { class Callback { + virtual void anchor(); public: virtual ~Callback() {} virtual void HandleUnreachable(SourceLocation L, SourceRange R1, diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index e6f30b17dc..0a785fd0a7 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -1118,6 +1118,7 @@ public: /// 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. diff --git a/include/clang/Basic/FileSystemStatCache.h b/include/clang/Basic/FileSystemStatCache.h index 77828b3ecb..f27312fade 100644 --- a/include/clang/Basic/FileSystemStatCache.h +++ b/include/clang/Basic/FileSystemStatCache.h @@ -25,6 +25,7 @@ namespace clang { /// system calls, which is used by precompiled and pretokenized headers to /// improve performance. class FileSystemStatCache { + virtual void anchor(); protected: llvm::OwningPtr NextStatCache; diff --git a/include/clang/CodeGen/CodeGenAction.h b/include/clang/CodeGen/CodeGenAction.h index 9697bc62af..5c2e2bbe8d 100644 --- a/include/clang/CodeGen/CodeGenAction.h +++ b/include/clang/CodeGen/CodeGenAction.h @@ -63,31 +63,37 @@ public: }; 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); }; diff --git a/include/clang/CodeGen/ModuleBuilder.h b/include/clang/CodeGen/ModuleBuilder.h index 38aba89002..ba9d1f9305 100644 --- a/include/clang/CodeGen/ModuleBuilder.h +++ b/include/clang/CodeGen/ModuleBuilder.h @@ -28,6 +28,7 @@ namespace clang { class CodeGenOptions; class CodeGenerator : public ASTConsumer { + virtual void anchor(); public: virtual llvm::Module* GetModule() = 0; virtual llvm::Module* ReleaseModule() = 0; diff --git a/include/clang/Driver/Action.h b/include/clang/Driver/Action.h index a33c33bf73..41ce4d92c4 100644 --- a/include/clang/Driver/Action.h +++ b/include/clang/Driver/Action.h @@ -94,6 +94,7 @@ public: }; class InputAction : public Action { + virtual void anchor(); const Arg &Input; public: InputAction(const Arg &_Input, types::ID _Type); @@ -107,6 +108,7 @@ public: }; 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 @@ public: }; 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 @@ public: }; class PreprocessJobAction : public JobAction { + virtual void anchor(); public: PreprocessJobAction(Action *Input, types::ID OutputType); @@ -146,6 +150,7 @@ public: }; class PrecompileJobAction : public JobAction { + virtual void anchor(); public: PrecompileJobAction(Action *Input, types::ID OutputType); @@ -156,6 +161,7 @@ public: }; class AnalyzeJobAction : public JobAction { + virtual void anchor(); public: AnalyzeJobAction(Action *Input, types::ID OutputType); @@ -166,6 +172,7 @@ public: }; class CompileJobAction : public JobAction { + virtual void anchor(); public: CompileJobAction(Action *Input, types::ID OutputType); @@ -176,6 +183,7 @@ public: }; class AssembleJobAction : public JobAction { + virtual void anchor(); public: AssembleJobAction(Action *Input, types::ID OutputType); @@ -186,6 +194,7 @@ public: }; class LinkJobAction : public JobAction { + virtual void anchor(); public: LinkJobAction(ActionList &Inputs, types::ID Type); @@ -196,6 +205,7 @@ public: }; class LipoJobAction : public JobAction { + virtual void anchor(); public: LipoJobAction(ActionList &Inputs, types::ID Type); @@ -206,6 +216,7 @@ public: }; class DsymutilJobAction : public JobAction { + virtual void anchor(); public: DsymutilJobAction(ActionList &Inputs, types::ID Type); @@ -216,6 +227,7 @@ public: }; class VerifyJobAction : public JobAction { + virtual void anchor(); public: VerifyJobAction(ActionList &Inputs, types::ID Type); static bool classof(const Action *A) { diff --git a/include/clang/Driver/Job.h b/include/clang/Driver/Job.h index 367955f59f..c94886dc26 100644 --- a/include/clang/Driver/Job.h +++ b/include/clang/Driver/Job.h @@ -46,6 +46,8 @@ public: /// 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; diff --git a/include/clang/Frontend/ChainedDiagnosticConsumer.h b/include/clang/Frontend/ChainedDiagnosticConsumer.h index b47fac5217..6ffcec51cf 100644 --- a/include/clang/Frontend/ChainedDiagnosticConsumer.h +++ b/include/clang/Frontend/ChainedDiagnosticConsumer.h @@ -21,6 +21,7 @@ class LangOptions; /// 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 Primary; llvm::OwningPtr Secondary; diff --git a/include/clang/Frontend/FrontendAction.h b/include/clang/Frontend/FrontendAction.h index f85cc7ec91..b6ef9a5ed3 100644 --- a/include/clang/Frontend/FrontendAction.h +++ b/include/clang/Frontend/FrontendAction.h @@ -231,6 +231,7 @@ public: }; class PluginASTAction : public ASTFrontendAction { + virtual void anchor(); protected: virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, StringRef InFile) = 0; diff --git a/include/clang/Lex/Lexer.h b/include/clang/Lex/Lexer.h index e01427f574..0a62389b64 100644 --- a/include/clang/Lex/Lexer.h +++ b/include/clang/Lex/Lexer.h @@ -44,6 +44,8 @@ enum ConflictMarkerKind { /// 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. diff --git a/include/clang/Lex/PPCallbacks.h b/include/clang/Lex/PPCallbacks.h index 0c783d474d..19e8521ea1 100644 --- a/include/clang/Lex/PPCallbacks.h +++ b/include/clang/Lex/PPCallbacks.h @@ -224,6 +224,7 @@ public: /// PPChainedCallbacks - Simple wrapper class for chaining callbacks. class PPChainedCallbacks : public PPCallbacks { + virtual void anchor(); PPCallbacks *First, *Second; public: diff --git a/include/clang/Lex/PreprocessorLexer.h b/include/clang/Lex/PreprocessorLexer.h index e2e30bf878..b551cd4310 100644 --- a/include/clang/Lex/PreprocessorLexer.h +++ b/include/clang/Lex/PreprocessorLexer.h @@ -24,6 +24,7 @@ class FileEntry; class Preprocessor; class PreprocessorLexer { + virtual void anchor(); protected: Preprocessor *PP; // Preprocessor object controlling lexing. diff --git a/include/clang/Sema/SemaConsumer.h b/include/clang/Sema/SemaConsumer.h index 3689a6e7a8..139cce8d73 100644 --- a/include/clang/Sema/SemaConsumer.h +++ b/include/clang/Sema/SemaConsumer.h @@ -24,6 +24,7 @@ namespace clang { /// 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; diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h index bfb7ef8964..633085527b 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h @@ -52,6 +52,7 @@ class BugType; class BugReport { public: class NodeResolver { + virtual void anchor(); public: virtual ~NodeResolver() {} virtual const ExplodedNode* @@ -374,6 +375,7 @@ public: }; class BugReporterContext { + virtual void anchor(); GRBugReporter &BR; public: BugReporterContext(GRBugReporter& br) : BR(br) {} diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h index 78067cd61c..cb49122e4a 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h @@ -49,6 +49,7 @@ public: }; class BuiltinBug : public BugType { + virtual void anchor(); const std::string desc; public: BuiltinBug(const char *name, const char *description) diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h index 5a004746b7..23a1635788 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h @@ -46,6 +46,7 @@ class ExplodedNode; class PathDiagnostic; class PathDiagnosticConsumer { + virtual void anchor(); public: PathDiagnosticConsumer() {} diff --git a/include/clang/StaticAnalyzer/Core/Checker.h b/include/clang/StaticAnalyzer/Core/Checker.h index cb59268a65..99408d7b33 100644 --- a/include/clang/StaticAnalyzer/Core/Checker.h +++ b/include/clang/StaticAnalyzer/Core/Checker.h @@ -383,6 +383,7 @@ class Checker : public CheckerBase { + virtual void anchor(); public: static void _register(void *checker, CheckerManager &mgr) { } }; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h b/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h index e6af93fbd1..d4408aef11 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h @@ -31,6 +31,7 @@ namespace ento { class CheckerManager; class AnalysisManager : public BugReporterData { + virtual void anchor(); AnalysisDeclContextManager AnaCtxMgr; ASTContext &Ctx; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h index 2079cdfaff..3a51182172 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h @@ -211,6 +211,7 @@ struct NodeBuilderContext { /// 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 @@ public: /// \class NodeBuilderWithSinks /// \brief This node builder keeps track of the generated sink nodes. class NodeBuilderWithSinks: public NodeBuilder { + virtual void anchor(); protected: SmallVector sinksGenerated; ProgramPoint &Location; @@ -381,6 +383,7 @@ public: /// \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; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h index f7ffd0af64..dcaa9e5a2d 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h @@ -228,6 +228,7 @@ private: // FIXME: Is this class necessary? class InterExplodedGraphMap { + virtual void anchor(); llvm::DenseMap M; friend class ExplodedGraph; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h b/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h index ced75982b7..406cd5a944 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h @@ -177,6 +177,7 @@ public: }; class GlobalsSpaceRegion : public MemSpaceRegion { + virtual void anchor(); protected: GlobalsSpaceRegion(MemRegionManager *mgr, Kind k) : MemSpaceRegion(mgr, k) {} @@ -223,6 +224,7 @@ public: }; class HeapSpaceRegion : public MemSpaceRegion { + virtual void anchor(); friend class MemRegionManager; HeapSpaceRegion(MemRegionManager *mgr) @@ -234,6 +236,7 @@ public: }; class UnknownSpaceRegion : public MemSpaceRegion { + virtual void anchor(); friend class MemRegionManager; UnknownSpaceRegion(MemRegionManager *mgr) : MemSpaceRegion(mgr, UnknownSpaceRegionKind) {} @@ -266,7 +269,7 @@ public: }; 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 @@ public: 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 @@ public: /// 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 @@ public: /// 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 @@ public: /// 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 @@ public: class CodeTextRegion : public TypedRegion { +public: + virtual void anchor(); protected: CodeTextRegion(const MemRegion *sreg, Kind k) : TypedRegion(sreg, k) {} public: diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index 5391f1a585..700a26505b 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -806,6 +806,7 @@ CB ProgramState::scanReachableSymbols(const MemRegion * const *beg, /// 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 VisitedItems; VisitedItems visited; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h b/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h index 76df8c28e5..a44d2747b8 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h @@ -28,6 +28,7 @@ namespace ento { class ProgramState; class SValBuilder { + virtual void anchor(); protected: ASTContext &Context; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h b/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h index a688d7f219..e7835dbab8 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h @@ -258,10 +258,12 @@ inline StoreRef &StoreRef::operator=(StoreRef const &newStore) { /// 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; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h index 8732addce4..f2fa8fc9e9 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h @@ -43,6 +43,7 @@ class NodeBuilderWithSinks; class MemRegion; class SubEngine { + virtual void anchor(); public: virtual ~SubEngine() {} diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 2a56c541ee..5a5506f5e6 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -43,6 +43,7 @@ namespace ento { /// \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 @@ typedef unsigned SymbolID; /// \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: diff --git a/lib/AST/AttrImpl.cpp b/lib/AST/AttrImpl.cpp index 3ca7d4d01d..cffcc6501e 100644 --- a/lib/AST/AttrImpl.cpp +++ b/lib/AST/AttrImpl.cpp @@ -19,4 +19,8 @@ using namespace clang; Attr::~Attr() { } +void InheritableAttr::anchor() { } + +void InheritableParamAttr::anchor() { } + #include "clang/AST/AttrImpl.inc" diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 305c41c51c..9028a09bc3 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -624,6 +624,8 @@ static void clearLinkageForClass(const CXXRecordDecl *record) { } } +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 @@ void TagDecl::setTemplateParameterListsInfo(ASTContext &Context, // EnumDecl Implementation //===----------------------------------------------------------------------===// +void EnumDecl::anchor() { } + EnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, @@ -2587,10 +2591,14 @@ SourceRange BlockDecl::getSourceRange() const { // 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 @@ LabelDecl *LabelDecl::Create(ASTContext &C, DeclContext *DC, 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 @@ NamespaceDecl *NamespaceDecl::getNextNamespace() { 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 @@ EnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 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 @@ SourceRange EnumConstantDecl::getSourceRange() const { 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 @@ SourceRange TypeAliasDecl::getSourceRange() const { return SourceRange(getLocStart(), RangeEnd); } +void FileScopeAsmDecl::anchor() { } + FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, StringLiteral *Str, SourceLocation AsmLoc, diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index b86cf28118..ddb61e5950 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -28,6 +28,8 @@ using namespace clang; // 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 @@ bool CXXRecordDecl::mayBeAbstract() const { return false; } +void CXXMethodDecl::anchor() { } + CXXMethodDecl * CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, @@ -1404,6 +1408,8 @@ SourceRange CXXCtorInitializer::getSourceRange() const { 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 @@ CXXConstructorDecl::setInheritedConstructor(const CXXConstructorDecl *BaseCtor){ addOverriddenMethod(BaseCtor); } +void CXXDestructorDecl::anchor() { } + CXXDestructorDecl * CXXDestructorDecl::Create(ASTContext &C, EmptyShell Empty) { return new (C) CXXDestructorDecl(0, SourceLocation(), DeclarationNameInfo(), @@ -1567,6 +1575,8 @@ CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, isImplicitlyDeclared); } +void CXXConversionDecl::anchor() { } + CXXConversionDecl * CXXConversionDecl::Create(ASTContext &C, EmptyShell Empty) { return new (C) CXXConversionDecl(0, SourceLocation(), DeclarationNameInfo(), @@ -1589,6 +1599,8 @@ CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD, EndLocation); } +void LinkageSpecDecl::anchor() { } + LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, @@ -1598,6 +1610,8 @@ LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, 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 @@ NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() { return cast_or_null(NominatedNamespace); } +void NamespaceAliasDecl::anchor() { } + NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation AliasLoc, @@ -1631,6 +1647,8 @@ NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC, QualifierLoc, IdentLoc, Namespace); } +void UsingShadowDecl::anchor() { } + UsingDecl *UsingShadowDecl::getUsingDecl() const { const UsingShadowDecl *Shadow = this; while (const UsingShadowDecl *NextShadow = @@ -1639,6 +1657,8 @@ UsingDecl *UsingShadowDecl::getUsingDecl() const { return cast(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 @@ UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL, 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 @@ UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC, QualifierLoc, NameInfo); } +void UnresolvedUsingTypenameDecl::anchor() { } + UnresolvedUsingTypenameDecl * UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, @@ -1697,6 +1721,8 @@ UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC, TargetName.getAsIdentifierInfo()); } +void StaticAssertDecl::anchor() { } + StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, diff --git a/lib/AST/DeclFriend.cpp b/lib/AST/DeclFriend.cpp index 99bfe40c31..e44333effa 100644 --- a/lib/AST/DeclFriend.cpp +++ b/lib/AST/DeclFriend.cpp @@ -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, diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 18be26def9..2960b13d6d 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -46,6 +46,8 @@ void ObjCProtocolList::set(ObjCProtocolDecl* const* InList, unsigned Elts, // ObjCInterfaceDecl //===----------------------------------------------------------------------===// +void ObjCContainerDecl::anchor() { } + /// getIvarDecl - This method looks up an ivar in this ContextDecl. /// ObjCIvarDecl * @@ -147,6 +149,8 @@ ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const { 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 @@ bool ObjCInterfaceDecl::ClassImplementsProtocol(ObjCProtocolDecl *lProto, // ObjCIvarDecl //===----------------------------------------------------------------------===// +void ObjCIvarDecl::anchor() { } + ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCContainerDecl *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, @@ -946,6 +952,8 @@ const ObjCInterfaceDecl *ObjCIvarDecl::getContainingInterface() const { // ObjCAtDefsFieldDecl //===----------------------------------------------------------------------===// +void ObjCAtDefsFieldDecl::anchor() { } + ObjCAtDefsFieldDecl *ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, @@ -957,6 +965,8 @@ ObjCAtDefsFieldDecl // ObjCProtocolDecl //===----------------------------------------------------------------------===// +void ObjCProtocolDecl::anchor() { } + ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, SourceLocation nameLoc, @@ -1026,6 +1036,8 @@ SourceRange ObjCClassDecl::getSourceRange() const { // ObjCForwardProtocolDecl //===----------------------------------------------------------------------===// +void ObjCForwardProtocolDecl::anchor() { } + ObjCForwardProtocolDecl:: ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, ObjCProtocolDecl *const *Elts, unsigned nElts, @@ -1048,6 +1060,8 @@ ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC, // ObjCCategoryDecl //===----------------------------------------------------------------------===// +void ObjCCategoryDecl::anchor() { } + ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation AtLoc, SourceLocation ClassNameLoc, @@ -1089,6 +1103,8 @@ void ObjCCategoryDecl::setImplementation(ObjCCategoryImplDecl *ImplD) { // ObjCCategoryImplDecl //===----------------------------------------------------------------------===// +void ObjCCategoryImplDecl::anchor() { } + ObjCCategoryImplDecl * ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, @@ -1108,6 +1124,8 @@ ObjCCategoryDecl *ObjCCategoryImplDecl::getCategoryDecl() const { } +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 @@ raw_ostream &clang::operator<<(raw_ostream &OS, // ObjCImplementationDecl //===----------------------------------------------------------------------===// +void ObjCImplementationDecl::anchor() { } + ObjCImplementationDecl * ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC, ObjCInterfaceDecl *ClassInterface, @@ -1203,6 +1223,8 @@ raw_ostream &clang::operator<<(raw_ostream &OS, // ObjCCompatibleAliasDecl //===----------------------------------------------------------------------===// +void ObjCCompatibleAliasDecl::anchor() { } + ObjCCompatibleAliasDecl * ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, @@ -1215,6 +1237,8 @@ ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC, // ObjCPropertyDecl //===----------------------------------------------------------------------===// +void ObjCPropertyDecl::anchor() { } + ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index 558a4ccac9..a2d5a2d70d 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -537,6 +537,8 @@ SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { // TemplateTemplateParmDecl Method Implementations //===----------------------------------------------------------------------===// +void TemplateTemplateParmDecl::anchor() { } + TemplateTemplateParmDecl * TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, @@ -581,6 +583,12 @@ FunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, POI); } +//===----------------------------------------------------------------------===// +// TemplateDecl Implementation +//===----------------------------------------------------------------------===// + +void TemplateDecl::anchor() { } + //===----------------------------------------------------------------------===// // ClassTemplateSpecializationDecl Implementation //===----------------------------------------------------------------------===// @@ -682,6 +690,8 @@ ClassTemplateSpecializationDecl::getSourceRange() const { //===----------------------------------------------------------------------===// // ClassTemplatePartialSpecializationDecl Implementation //===----------------------------------------------------------------------===// +void ClassTemplatePartialSpecializationDecl::anchor() { } + ClassTemplatePartialSpecializationDecl:: ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, DeclContext *DC, @@ -749,6 +759,8 @@ ClassTemplatePartialSpecializationDecl::Create(ASTContext &Context, // FriendTemplateDecl Implementation //===----------------------------------------------------------------------===// +void FriendTemplateDecl::anchor() { } + FriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, DeclContext *DC, SourceLocation L, @@ -796,3 +808,8 @@ TypeAliasTemplateDecl::newCommon(ASTContext &C) { return CommonPtr; } +//===----------------------------------------------------------------------===// +// ClassScopeFunctionSpecializationDecl Implementation +//===----------------------------------------------------------------------===// + +void ClassScopeFunctionSpecializationDecl::anchor() { } diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 1bbf8494fa..285d38cbdf 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -1023,4 +1023,4 @@ TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const { return TemplateArgument(Arguments, NumArguments); } - +void ArrayTypeTraitExpr::anchor() { } diff --git a/lib/AST/Mangle.cpp b/lib/AST/Mangle.cpp index 5cb8f47519..68e0098c1a 100644 --- a/lib/AST/Mangle.cpp +++ b/lib/AST/Mangle.cpp @@ -59,6 +59,8 @@ static void checkMangleDC(const DeclContext *DC, const BlockDecl *BD) { } +void MangleContext::anchor() { } + void MangleContext::mangleGlobalBlock(const BlockDecl *BD, raw_ostream &Out) { Out << "__block_global_" << getBlockId(BD, false); diff --git a/lib/Analysis/Dominators.cpp b/lib/Analysis/Dominators.cpp new file mode 100644 index 0000000000..0e02c6d717 --- /dev/null +++ b/lib/Analysis/Dominators.cpp @@ -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() { } diff --git a/lib/Analysis/LiveVariables.cpp b/lib/Analysis/LiveVariables.cpp index 3a325009d4..ff6607d51a 100644 --- a/lib/Analysis/LiveVariables.cpp +++ b/lib/Analysis/LiveVariables.cpp @@ -143,6 +143,8 @@ namespace { } } +void LiveVariables::Observer::anchor() { } + LiveVariables::LivenessValues LiveVariablesImpl::merge(LiveVariables::LivenessValues valsA, LiveVariables::LivenessValues valsB) { diff --git a/lib/Analysis/PostOrderCFGView.cpp b/lib/Analysis/PostOrderCFGView.cpp index 311423f285..cfd66f7aa1 100644 --- a/lib/Analysis/PostOrderCFGView.cpp +++ b/lib/Analysis/PostOrderCFGView.cpp @@ -15,6 +15,8 @@ using namespace clang; +void PostOrderCFGView::anchor() { } + PostOrderCFGView::PostOrderCFGView(const CFG *cfg) { Blocks.reserve(cfg->getNumBlockIDs()); CFGBlockSet BSet(cfg); diff --git a/lib/Analysis/ReachableCode.cpp b/lib/Analysis/ReachableCode.cpp index 62575f9f23..bb63e2c184 100644 --- a/lib/Analysis/ReachableCode.cpp +++ b/lib/Analysis/ReachableCode.cpp @@ -251,7 +251,9 @@ void DeadCodeScan::reportDeadCode(const Stmt *S, } namespace clang { namespace reachable_code { - + +void Callback::anchor() { } + unsigned ScanReachableFromBlock(const CFGBlock *Start, llvm::BitVector &Reachable) { unsigned count = 0; diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 1643572159..67ea056417 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -825,6 +825,8 @@ StoredDiagnostic::~StoredDiagnostic() { } /// 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; diff --git a/lib/Basic/FileSystemStatCache.cpp b/lib/Basic/FileSystemStatCache.cpp index c8b07af295..875d397a1d 100644 --- a/lib/Basic/FileSystemStatCache.cpp +++ b/lib/Basic/FileSystemStatCache.cpp @@ -28,6 +28,8 @@ using namespace clang; #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. diff --git a/lib/CodeGen/CodeGenAction.cpp b/lib/CodeGen/CodeGenAction.cpp index 2ddcc3e5dc..eedfc57a10 100644 --- a/lib/CodeGen/CodeGenAction.cpp +++ b/lib/CodeGen/CodeGenAction.cpp @@ -33,6 +33,7 @@ using namespace llvm; namespace clang { class BackendConsumer : public ASTConsumer { + virtual void anchor(); DiagnosticsEngine &Diags; BackendAction Action; const CodeGenOptions &CodeGenOpts; @@ -180,6 +181,8 @@ namespace clang { void InlineAsmDiagHandler2(const llvm::SMDiagnostic &, SourceLocation LocCookie); }; + + void BackendConsumer::anchor() {} } /// ConvertBackendLocation - Convert a location in a temporary llvm::SourceMgr @@ -406,20 +409,26 @@ void CodeGenAction::ExecuteAction() { // +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) {} diff --git a/lib/CodeGen/ModuleBuilder.cpp b/lib/CodeGen/ModuleBuilder.cpp index 30572ed9af..8aa788d9a1 100644 --- a/lib/CodeGen/ModuleBuilder.cpp +++ b/lib/CodeGen/ModuleBuilder.cpp @@ -113,6 +113,8 @@ namespace { }; } +void CodeGenerator::anchor() { } + CodeGenerator *clang::CreateLLVMCodeGen(DiagnosticsEngine &Diags, const std::string& ModuleName, const CodeGenOptions &CGO, diff --git a/lib/Driver/Action.cpp b/lib/Driver/Action.cpp index 52c0dbb5f1..a9dc17b320 100644 --- a/lib/Driver/Action.cpp +++ b/lib/Driver/Action.cpp @@ -38,14 +38,20 @@ const char *Action::getClassName(ActionClass AC) { 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 @@ JobAction::JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type) : 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) { } diff --git a/lib/Driver/Job.cpp b/lib/Driver/Job.cpp index 5443d70e82..825c86a826 100644 --- a/lib/Driver/Job.cpp +++ b/lib/Driver/Job.cpp @@ -16,6 +16,8 @@ using namespace clang::driver; 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), diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 728255e3fb..b53f2d3388 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -192,6 +192,8 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, return Triple.getTriple(); } +void Generic_ELF::anchor() {} + Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA, const ActionList &Inputs) const { Action::ActionClass Key; diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 6772477eb4..c0860c5263 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -423,7 +423,8 @@ public: }; 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) {} diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index c8f99c4f91..d99b4f2fce 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2865,6 +2865,8 @@ const char *darwin::CC1::getCC1Name(types::ID Type) const { } } +void darwin::CC1::anchor() {} + const char *darwin::CC1::getBaseInputName(const ArgList &Args, const InputInfoList &Inputs) { return Args.MakeArgString( @@ -3509,6 +3511,8 @@ void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 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); diff --git a/lib/Driver/Tools.h b/lib/Driver/Tools.h index c06e22b1d5..b304e9626a 100644 --- a/lib/Driver/Tools.h +++ b/lib/Driver/Tools.h @@ -192,6 +192,7 @@ namespace hexagon { 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 @@ namespace darwin { }; class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool { + virtual void anchor(); public: static const char *getBaseInputName(const ArgList &Args, const InputInfoList &Input); diff --git a/lib/Frontend/ChainedDiagnosticConsumer.cpp b/lib/Frontend/ChainedDiagnosticConsumer.cpp new file mode 100644 index 0000000000..c1d3db873f --- /dev/null +++ b/lib/Frontend/ChainedDiagnosticConsumer.cpp @@ -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() { } diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp index 439a124f3b..6ef07c447d 100644 --- a/lib/Frontend/FrontendAction.cpp +++ b/lib/Frontend/FrontendAction.cpp @@ -411,6 +411,8 @@ void ASTFrontendAction::ExecuteAction() { ParseAST(CI.getSema(), CI.getFrontendOpts().ShowStats); } +void PluginASTAction::anchor() { } + ASTConsumer * PreprocessorFrontendAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index a9b11d69c9..25e320df51 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -59,6 +59,8 @@ tok::ObjCKeywordKind Token::getObjCKeywordID() const { // Lexer Class Implementation //===----------------------------------------------------------------------===// +void Lexer::anchor() { } + void Lexer::InitLexer(const char *BufStart, const char *BufPtr, const char *BufEnd) { InitCharacterInfo(); diff --git a/lib/Lex/PPCallbacks.cpp b/lib/Lex/PPCallbacks.cpp new file mode 100644 index 0000000000..952b926005 --- /dev/null +++ b/lib/Lex/PPCallbacks.cpp @@ -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() { } diff --git a/lib/Lex/PreprocessorLexer.cpp b/lib/Lex/PreprocessorLexer.cpp index 0da9ef5531..a72bbca6bc 100644 --- a/lib/Lex/PreprocessorLexer.cpp +++ b/lib/Lex/PreprocessorLexer.cpp @@ -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), diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 1f20924c9b..83b1ed0c3c 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -284,6 +284,9 @@ Decl *Parser::ParseObjCAtInterfaceDeclaration(SourceLocation AtLoc, /// 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 &Props; ObjCDeclSpec &OCDS; @@ -337,6 +340,9 @@ struct Parser::ObjCPropertyCallback : FieldCallback { } }; +void Parser::ObjCPropertyCallback::anchor() { +} + /// objc-interface-decl-list: /// empty /// objc-interface-decl-list objc-property-decl [OBJC2] diff --git a/lib/Sema/AnalysisBasedWarnings.cpp b/lib/Sema/AnalysisBasedWarnings.cpp index 1b7b2f0299..3567b6bbe0 100644 --- a/lib/Sema/AnalysisBasedWarnings.cpp +++ b/lib/Sema/AnalysisBasedWarnings.cpp @@ -634,6 +634,7 @@ struct SortDiagBySourceLocation { } }; +namespace { class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler { Sema &S; DiagList Warnings; @@ -744,6 +745,7 @@ class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler { }; } } +} //===----------------------------------------------------------------------===// // AnalysisBasedWarnings - Worker object used by Sema to execute analysis-based diff --git a/lib/Sema/SemaConsumer.cpp b/lib/Sema/SemaConsumer.cpp new file mode 100644 index 0000000000..d83a13e2f1 --- /dev/null +++ b/lib/Sema/SemaConsumer.cpp @@ -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() { } diff --git a/lib/StaticAnalyzer/Core/AnalysisManager.cpp b/lib/StaticAnalyzer/Core/AnalysisManager.cpp index 72aed74237..af18eff899 100644 --- a/lib/StaticAnalyzer/Core/AnalysisManager.cpp +++ b/lib/StaticAnalyzer/Core/AnalysisManager.cpp @@ -14,6 +14,8 @@ using namespace clang; using namespace ento; +void AnalysisManager::anchor() { } + AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, const LangOptions &lang, PathDiagnosticConsumer *pd, diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index fbbdb040e4..8ef9c21913 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -34,6 +34,8 @@ using namespace ento; BugReporterVisitor::~BugReporterVisitor() {} +void BugReporterContext::anchor() {} + //===----------------------------------------------------------------------===// // Helper routines for walking the ExplodedGraph and fetching statements. //===----------------------------------------------------------------------===// @@ -1204,10 +1206,14 @@ BugType::~BugType() { } 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; diff --git a/lib/StaticAnalyzer/Core/Checker.cpp b/lib/StaticAnalyzer/Core/Checker.cpp index a3bf2c236f..f793c7fe29 100644 --- a/lib/StaticAnalyzer/Core/Checker.cpp +++ b/lib/StaticAnalyzer/Core/Checker.cpp @@ -20,3 +20,11 @@ StringRef CheckerBase::getTagDescription() const { // FIXME: We want to return the package + name of the checker here. return "A Checker"; } + +void Checker::anchor() { } diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp index 0b9371c4b5..bf4bf2db88 100644 --- a/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -537,6 +537,8 @@ void CoreEngine::enqueueEndOfFunction(ExplodedNodeSet &Set) { } +void NodeBuilder::anchor() { } + ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc, const ProgramState *State, ExplodedNode *FromN, @@ -556,6 +558,8 @@ ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc, return N; } +void NodeBuilderWithSinks::anchor() { } + StmtNodeBuilder::~StmtNodeBuilder() { if (EnclosingBldr) for (ExplodedNodeSet::iterator I = Frontier.begin(), @@ -563,6 +567,8 @@ StmtNodeBuilder::~StmtNodeBuilder() { EnclosingBldr->addNodes(*I); } +void BranchNodeBuilder::anchor() { } + ExplodedNode *BranchNodeBuilder::generateNode(const ProgramState *State, bool branch, ExplodedNode *NodePred) { diff --git a/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/lib/StaticAnalyzer/Core/ExplodedGraph.cpp index 7edcb752f7..691a82ed3c 100644 --- a/lib/StaticAnalyzer/Core/ExplodedGraph.cpp +++ b/lib/StaticAnalyzer/Core/ExplodedGraph.cpp @@ -379,6 +379,8 @@ ExplodedGraph::TrimInternal(const ExplodedNode* const* BeginSources, return G; } +void InterExplodedGraphMap::anchor() { } + ExplodedNode* InterExplodedGraphMap::getMappedNode(const ExplodedNode *N) const { llvm::DenseMap::const_iterator I = diff --git a/lib/StaticAnalyzer/Core/MemRegion.cpp b/lib/StaticAnalyzer/Core/MemRegion.cpp index 2cc0607cb4..2ddaed5b05 100644 --- a/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -383,6 +383,20 @@ void CXXBaseObjectRegion::Profile(llvm::FoldingSetNodeID &ID) const { ProfileRegion(ID, decl, superRegion); } +//===----------------------------------------------------------------------===// +// 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. //===----------------------------------------------------------------------===// diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index 6c2f2ae46f..50ebe3b746 100644 --- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -82,6 +82,8 @@ PathDiagnostic::PathDiagnostic(StringRef bugtype, StringRef desc, 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 diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp index d4b31c1f51..eac9c1c99c 100644 --- a/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -536,6 +536,8 @@ const ProgramState *ProgramStateManager::removeGDM(const ProgramState *state, vo 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)) diff --git a/lib/StaticAnalyzer/Core/SValBuilder.cpp b/lib/StaticAnalyzer/Core/SValBuilder.cpp index 7e7b034692..7fc947828f 100644 --- a/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -25,6 +25,8 @@ using namespace ento; // Basic SVal creation. //===----------------------------------------------------------------------===// +void SValBuilder::anchor() { } + DefinedOrUnknownSVal SValBuilder::makeZeroVal(QualType type) { if (Loc::isLocType(type)) return makeNull(); diff --git a/lib/StaticAnalyzer/Core/Store.cpp b/lib/StaticAnalyzer/Core/Store.cpp index fd3828fc29..825510e00b 100644 --- a/lib/StaticAnalyzer/Core/Store.cpp +++ b/lib/StaticAnalyzer/Core/Store.cpp @@ -331,3 +331,5 @@ SVal StoreManager::getLValueElement(QualType elementType, NonLoc Offset, StoreManager::BindingsHandler::~BindingsHandler() {} +void SubRegionMap::anchor() { } +void SubRegionMap::Visitor::anchor() { } diff --git a/lib/StaticAnalyzer/Core/SubEngine.cpp b/lib/StaticAnalyzer/Core/SubEngine.cpp new file mode 100644 index 0000000000..350f4b8bb3 --- /dev/null +++ b/lib/StaticAnalyzer/Core/SubEngine.cpp @@ -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() { } diff --git a/lib/StaticAnalyzer/Core/SymbolManager.cpp b/lib/StaticAnalyzer/Core/SymbolManager.cpp index 6f5d8f90bb..d31dd06092 100644 --- a/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -21,6 +21,8 @@ using namespace clang; using namespace ento; +void SymExpr::anchor() { } + void SymExpr::dump() const { dumpToStream(llvm::errs()); } @@ -99,6 +101,8 @@ void SymbolMetadata::dumpToStream(raw_ostream &os) const { << getRegion() << ',' << T.getAsString() << '}'; } +void SymbolData::anchor() { } + void SymbolRegionValue::dumpToStream(raw_ostream &os) const { os << "reg_$" << getSymbolID() << "<" << R << ">"; } diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp index 5c016d32dd..56b28db4e2 100644 --- a/utils/TableGen/TableGen.cpp +++ b/utils/TableGen/TableGen.cpp @@ -96,7 +96,6 @@ namespace { 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 @@ public: return false; } }; +} int main(int argc, char **argv) { sys::PrintStackTraceOnErrorSignal();