зеркало из https://github.com/microsoft/clang-1.git
Replace MarkVarRequired with a more generic
HandleCXXStaticMemberVarInstantiation. Suggested by Argyrios. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152320 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4fae2d9357
Коммит
025039377d
|
@ -90,10 +90,9 @@ public:
|
|||
/// modified by the introduction of an implicit zero initializer.
|
||||
virtual void CompleteTentativeDefinition(VarDecl *D) {}
|
||||
|
||||
/// MarkVarRequired - Tell the consumer that this variable must be output.
|
||||
/// This is needed when the definition is initially one that can be deferred,
|
||||
/// but we then see an explicit template instantiation definition.
|
||||
virtual void MarkVarRequired(VarDecl *D) {}
|
||||
/// HandleCXXStaticMemberVarInstantiation - Tell the consumer that this
|
||||
// variable has been instantiated.
|
||||
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *D) {}
|
||||
|
||||
/// \brief Callback involved at the end of a translation unit to
|
||||
/// notify the consumer that a vtable for the given C++ class is
|
||||
|
|
|
@ -35,7 +35,7 @@ public:
|
|||
|
||||
// ASTConsumer
|
||||
virtual void Initialize(ASTContext &Context);
|
||||
virtual void MarkVarRequired(VarDecl *VD);
|
||||
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD);
|
||||
virtual bool HandleTopLevelDecl(DeclGroupRef D);
|
||||
virtual void HandleInterestingDecl(DeclGroupRef D);
|
||||
virtual void HandleTranslationUnit(ASTContext &Ctx);
|
||||
|
|
|
@ -73,8 +73,8 @@ namespace clang {
|
|||
llvm::Module *takeModule() { return TheModule.take(); }
|
||||
llvm::Module *takeLinkModule() { return LinkModule.take(); }
|
||||
|
||||
virtual void MarkVarRequired(VarDecl *VD) {
|
||||
Gen->MarkVarRequired(VD);
|
||||
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
|
||||
Gen->HandleCXXStaticMemberVarInstantiation(VD);
|
||||
}
|
||||
|
||||
virtual void Initialize(ASTContext &Ctx) {
|
||||
|
|
|
@ -1722,8 +1722,12 @@ static void ReplaceUsesOfNonProtoTypeWithRealFunction(llvm::GlobalValue *Old,
|
|||
}
|
||||
}
|
||||
|
||||
void CodeGenModule::MarkVarRequired(VarDecl *VD) {
|
||||
GetAddrOfGlobalVar(VD);
|
||||
void CodeGenModule::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
|
||||
TemplateSpecializationKind TSK = VD->getTemplateSpecializationKind();
|
||||
// If we have a definition, this might be a deferred decl. If the
|
||||
// instantiation is explicit, make sure we emit it at the end.
|
||||
if (VD->getDefinition() && TSK == TSK_ExplicitInstantiationDefinition)
|
||||
GetAddrOfGlobalVar(VD);
|
||||
}
|
||||
|
||||
void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD) {
|
||||
|
|
|
@ -658,10 +658,9 @@ public:
|
|||
/// EmitTopLevelDecl - Emit code for a single top level declaration.
|
||||
void EmitTopLevelDecl(Decl *D);
|
||||
|
||||
/// MarkVarRequired - Tell the consumer that this variable must be output.
|
||||
/// This is needed when the definition is initially one that can be deferred,
|
||||
/// but we then see an explicit template instantiation definition.
|
||||
void MarkVarRequired(VarDecl *VD);
|
||||
/// HandleCXXStaticMemberVarInstantiation - Tell the consumer that this
|
||||
// variable has been instantiated.
|
||||
void HandleCXXStaticMemberVarInstantiation(VarDecl *VD);
|
||||
|
||||
/// AddUsedGlobal - Add a global which should be forced to be
|
||||
/// present in the object file; these are emitted to the llvm.used
|
||||
|
|
|
@ -59,8 +59,8 @@ namespace {
|
|||
*M, *TD, Diags));
|
||||
}
|
||||
|
||||
virtual void MarkVarRequired(VarDecl *VD) {
|
||||
Builder->MarkVarRequired(VD);
|
||||
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
|
||||
Builder->HandleCXXStaticMemberVarInstantiation(VD);
|
||||
}
|
||||
|
||||
virtual bool HandleTopLevelDecl(DeclGroupRef DG) {
|
||||
|
|
|
@ -209,9 +209,9 @@ bool MultiplexConsumer::HandleTopLevelDecl(DeclGroupRef D) {
|
|||
return Continue;
|
||||
}
|
||||
|
||||
void MultiplexConsumer::MarkVarRequired(VarDecl *VD) {
|
||||
void MultiplexConsumer::HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
|
||||
for (size_t i = 0, e = Consumers.size(); i != e; ++i)
|
||||
Consumers[i]->MarkVarRequired(VD);
|
||||
Consumers[i]->HandleCXXStaticMemberVarInstantiation(VD);
|
||||
}
|
||||
|
||||
void MultiplexConsumer::HandleInterestingDecl(DeclGroupRef D) {
|
||||
|
|
|
@ -2609,12 +2609,11 @@ void Sema::InstantiateStaticDataMemberDefinition(
|
|||
if (TSK == TSK_ExplicitInstantiationDeclaration)
|
||||
return;
|
||||
|
||||
Consumer.HandleCXXStaticMemberVarInstantiation(Var);
|
||||
|
||||
// If we already have a definition, we're done.
|
||||
if (Var->getDefinition()) {
|
||||
if (TSK == TSK_ExplicitInstantiationDefinition)
|
||||
Consumer.MarkVarRequired(Var);
|
||||
if (Var->getDefinition())
|
||||
return;
|
||||
}
|
||||
|
||||
InstantiatingTemplate Inst(*this, PointOfInstantiation, Var);
|
||||
if (Inst)
|
||||
|
|
Загрузка…
Ссылка в новой задаче