diff --git a/include/llvm/Analysis/AliasAnalysis.h b/include/llvm/Analysis/AliasAnalysis.h index d715e0880b6..2fff77420ae 100644 --- a/include/llvm/Analysis/AliasAnalysis.h +++ b/include/llvm/Analysis/AliasAnalysis.h @@ -318,14 +318,13 @@ public: } }; +} // End llvm namespace + // Because of the way .a files work, we must force the BasicAA implementation to // be pulled in if the AliasAnalysis header is included. Otherwise we run // the risk of AliasAnalysis being used, but the default implementation not // being linked into the tool that uses it. -// -extern int BasicAAStub; -static IncludeFile HDR_INCLUDE_BASICAA_CPP(&BasicAAStub); - -} // End llvm namespace +FORCE_DEFINING_FILE_TO_BE_LINKED(AliasAnalysis) +FORCE_DEFINING_FILE_TO_BE_LINKED(BasicAliasAnalysis) #endif diff --git a/include/llvm/Analysis/CallGraph.h b/include/llvm/Analysis/CallGraph.h index e51a3c7fb18..94cea100485 100644 --- a/include/llvm/Analysis/CallGraph.h +++ b/include/llvm/Analysis/CallGraph.h @@ -287,13 +287,9 @@ template<> struct GraphTraits : static nodes_iterator nodes_end (const CallGraph *CG) { return CG->end(); } }; -// Make sure that any clients of this file link in CallGraph.cpp -static IncludeFile -CALLGRAPH_INCLUDE_FILE(&CallGraph::stub); - -extern int BasicCallGraphStub; -static IncludeFile HDR_INCLUDE_CALLGRAPH_CPP(&BasicCallGraphStub); - } // End llvm namespace +// Make sure that any clients of this file link in CallGraph.cpp +FORCE_DEFINING_FILE_TO_BE_LINKED(CallGraph) + #endif diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h index 224e529915f..31b8562f2c3 100644 --- a/include/llvm/Analysis/Dominators.h +++ b/include/llvm/Analysis/Dominators.h @@ -652,9 +652,9 @@ private: }; -// Make sure that any clients of this file link in Dominators.cpp -static IncludeFile -DOMINATORS_INCLUDE_FILE(&DominatorSet::stub); } // End llvm namespace +// Make sure that any clients of this file link in Dominators.cpp +FORCE_DEFINING_FILE_TO_BE_LINKED(DominatorSet) + #endif diff --git a/include/llvm/Analysis/FindUsedTypes.h b/include/llvm/Analysis/FindUsedTypes.h index e16fe9d7c30..fbf41de7cb6 100644 --- a/include/llvm/Analysis/FindUsedTypes.h +++ b/include/llvm/Analysis/FindUsedTypes.h @@ -53,15 +53,11 @@ public: virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } - - // stub - dummy function, just ignore it - static int stub; }; -// Make sure that any clients of this file link in PostDominators.cpp -static IncludeFile -FIND_USED_TYPES_INCLUDE_FILE(&FindUsedTypes::stub); - } // End llvm namespace +// Make sure that any clients of this file link in PostDominators.cpp +FORCE_DEFINING_FILE_TO_BE_LINKED(FindUsedTypes) + #endif diff --git a/include/llvm/Analysis/LoopInfo.h b/include/llvm/Analysis/LoopInfo.h index 065ce31d8bb..06b007cf3fc 100644 --- a/include/llvm/Analysis/LoopInfo.h +++ b/include/llvm/Analysis/LoopInfo.h @@ -295,7 +295,6 @@ public: /// BasicBlocks to loops. void removeBlock(BasicBlock *BB); - static int stub; // Noop private: void Calculate(ETForest &EF); Loop *ConsiderForLoop(BasicBlock *BB, ETForest &EF); @@ -304,10 +303,6 @@ private: }; -// Make sure that any clients of this file link in LoopInfo.cpp -static IncludeFile -LOOP_INFO_INCLUDE_FILE(&LoopInfo::stub); - // Allow clients to walk the list of nested loops... template <> struct GraphTraits { typedef const Loop NodeType; @@ -337,4 +332,7 @@ template <> struct GraphTraits { } // End llvm namespace +// Make sure that any clients of this file link in LoopInfo.cpp +FORCE_DEFINING_FILE_TO_BE_LINKED(LoopInfo) + #endif diff --git a/include/llvm/Analysis/PostDominators.h b/include/llvm/Analysis/PostDominators.h index 1436be30375..4d8d140373e 100644 --- a/include/llvm/Analysis/PostDominators.h +++ b/include/llvm/Analysis/PostDominators.h @@ -128,18 +128,14 @@ struct PostDominanceFrontier : public DominanceFrontierBase { AU.addRequired(); } - // stub - dummy function, just ignore it - static int stub; - private: const DomSetType &calculate(const PostDominatorTree &DT, const DominatorTree::Node *Node); }; -// Make sure that any clients of this file link in PostDominators.cpp -static IncludeFile -POST_DOMINATOR_INCLUDE_FILE(&PostDominanceFrontier::stub); - } // End llvm namespace +// Make sure that any clients of this file link in PostDominators.cpp +FORCE_DEFINING_FILE_TO_BE_LINKED(PostDominanceFrontier) + #endif diff --git a/include/llvm/Analysis/ValueNumbering.h b/include/llvm/Analysis/ValueNumbering.h index 2fc949766e7..f708f48382b 100644 --- a/include/llvm/Analysis/ValueNumbering.h +++ b/include/llvm/Analysis/ValueNumbering.h @@ -65,10 +65,9 @@ struct ValueNumbering { } }; -extern int BasicValueNumberingStub; -static IncludeFile -HDR_INCLUDE_VALUENUMBERING_CPP(&BasicValueNumberingStub); - } // End llvm namespace +// Force any file including this header to get the implementation as well +FORCE_DEFINING_FILE_TO_BE_LINKED(BasicValueNumbering) + #endif diff --git a/include/llvm/IntrinsicInst.h b/include/llvm/IntrinsicInst.h index fbc3968f264..5b784fc2b90 100644 --- a/include/llvm/IntrinsicInst.h +++ b/include/llvm/IntrinsicInst.h @@ -314,11 +314,10 @@ namespace llvm { } }; -// A hack to ensure that the IntrinsicInst.cpp file gets added as a dependency -// of any file that -extern char LinkIntrinsicInstStub; -static IncludeFile LinkIntrinsicInst(&LinkIntrinsicInstStub); - } +// Ensure that the IntrinsicInst.cpp file gets added as a dependency of any +// file that includes this header +FORCE_DEFINING_FILE_TO_BE_LINKED(IntrinsicInst) + #endif diff --git a/include/llvm/Support/IncludeFile.h b/include/llvm/Support/IncludeFile.h index 8e96f7571f6..798c6b454fc 100644 --- a/include/llvm/Support/IncludeFile.h +++ b/include/llvm/Support/IncludeFile.h @@ -27,13 +27,15 @@ /// And, foo.cp would use:
/// DEFINING_FILE_FOR(foo)
#define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ - extern char name ## LinkVar; \ - static IncludeFile name ## LinkObj ( &name ## LinkVar ) + namespace llvm { \ + extern char name ## LinkVar; \ + static IncludeFile name ## LinkObj ( &name ## LinkVar ); \ + } /// This macro is the counterpart to FORCE_DEFINING_FILE_TO_BE_LINKED. It should /// be used in a .cpp file to define the name referenced in a header file that /// will cause linkage of the .cpp file. It should only be used at extern level. -#define DEFINING_FILE_FOR(name) char name +#define DEFINING_FILE_FOR(name) namespace llvm { char name ## LinkVar; } namespace llvm { diff --git a/include/llvm/System/IncludeFile.h b/include/llvm/System/IncludeFile.h index 8e96f7571f6..798c6b454fc 100644 --- a/include/llvm/System/IncludeFile.h +++ b/include/llvm/System/IncludeFile.h @@ -27,13 +27,15 @@ /// And, foo.cp would use:
/// DEFINING_FILE_FOR(foo)
#define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ - extern char name ## LinkVar; \ - static IncludeFile name ## LinkObj ( &name ## LinkVar ) + namespace llvm { \ + extern char name ## LinkVar; \ + static IncludeFile name ## LinkObj ( &name ## LinkVar ); \ + } /// This macro is the counterpart to FORCE_DEFINING_FILE_TO_BE_LINKED. It should /// be used in a .cpp file to define the name referenced in a header file that /// will cause linkage of the .cpp file. It should only be used at extern level. -#define DEFINING_FILE_FOR(name) char name +#define DEFINING_FILE_FOR(name) namespace llvm { char name ## LinkVar; } namespace llvm { diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index 2abcbde74e7..1843cd41d43 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -188,8 +188,4 @@ bool AliasAnalysis::canInstructionRangeModify(const Instruction &I1, // be pulled in if the AliasAnalysis classes are pulled in. Otherwise we run // the risk of AliasAnalysis being used, but the default implementation not // being linked into the tool that uses it. -// -namespace llvm { - extern int BasicAAStub; -} -static IncludeFile INCLUDE_BASICAA_CPP((void*)&BasicAAStub); +DEFINING_FILE_FOR(AliasAnalysis) diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 3cda92e49f5..fa4a029648f 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -26,9 +26,6 @@ #include using namespace llvm; -// Make sure that anything that uses AliasAnalysis pulls in this file... -int llvm::BasicAAStub; - namespace { /// NoAA - This class implements the -no-aa pass, which always returns "I /// don't know" for alias queries. NoAA is unlike other alias analysis @@ -846,3 +843,6 @@ BasicAliasAnalysis::getModRefBehavior(Function *F, CallSite CS, return UnknownModRefBehavior; } + +// Make sure that anything that uses AliasAnalysis pulls in this file... +DEFINING_FILE_FOR(BasicAliasAnalysis) diff --git a/lib/Analysis/IPA/CallGraph.cpp b/lib/Analysis/IPA/CallGraph.cpp index f8846d390a5..78bb735ffa2 100644 --- a/lib/Analysis/IPA/CallGraph.cpp +++ b/lib/Analysis/IPA/CallGraph.cpp @@ -19,8 +19,6 @@ #include using namespace llvm; -int llvm::BasicCallGraphStub; - static bool isOnlyADirectCall(Function *F, CallSite CS) { if (!CS.getInstruction()) return false; for (CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end(); I != E; ++I) @@ -256,10 +254,6 @@ CallGraphNode *CallGraph::getOrInsertFunction(const Function *F) { return CGN = new CallGraphNode(const_cast(F)); } - - -int CallGraph::stub; // to ensure linkage of this file. - void CallGraphNode::print(std::ostream &OS) const { if (Function *F = getFunction()) OS << "Call graph node for function: '" << F->getName() <<"'\n"; @@ -297,3 +291,6 @@ void CallGraphNode::removeAnyCallEdgeTo(CallGraphNode *Callee) { --i; --e; } } + +// Enuse that users of CallGraph.h also link with this file +DEFINING_FILE_FOR(CallGraph) diff --git a/lib/Analysis/IPA/FindUsedTypes.cpp b/lib/Analysis/IPA/FindUsedTypes.cpp index f7efc7d3a41..725cec4c018 100644 --- a/lib/Analysis/IPA/FindUsedTypes.cpp +++ b/lib/Analysis/IPA/FindUsedTypes.cpp @@ -24,9 +24,6 @@ using namespace llvm; static RegisterAnalysis X("printusedtypes", "Find Used Types"); -// stub to help linkage -int FindUsedTypes::stub; // to ensure linkage of this file - // IncorporateType - Incorporate one type and all of its subtypes into the // collection of used types. // @@ -104,3 +101,6 @@ void FindUsedTypes::print(std::ostream &o, const Module *M) const { E = UsedTypes.end(); I != E; ++I) o << " " << **I << "\n"; } + +// Ensure that this file gets linked in when FindUsedTypes.h is used. +DEFINING_FILE_FOR(FindUsedTypes) diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp index f2ef17682fc..c7ce58ef915 100644 --- a/lib/Analysis/LoopInfo.cpp +++ b/lib/Analysis/LoopInfo.cpp @@ -86,8 +86,6 @@ void Loop::dump() const { //===----------------------------------------------------------------------===// // LoopInfo implementation // -int LoopInfo::stub; - bool LoopInfo::runOnFunction(Function &) { releaseMemory(); Calculate(getAnalysis()); // Update @@ -557,3 +555,6 @@ Loop *Loop::removeChildLoop(iterator I) { void Loop::removeBlockFromLoop(BasicBlock *BB) { RemoveFromVector(Blocks, BB); } + +// Ensure this file gets linked when LoopInfo.h is used. +DEFINING_FILE_FOR(LoopInfo) diff --git a/lib/Analysis/PostDominators.cpp b/lib/Analysis/PostDominators.cpp index 611ea60a672..e195d7a4c77 100644 --- a/lib/Analysis/PostDominators.cpp +++ b/lib/Analysis/PostDominators.cpp @@ -359,6 +359,5 @@ PostDominanceFrontier::calculate(const PostDominatorTree &DT, return S; } -// stub - a dummy function to make linking work ok. -int PostDominanceFrontier::stub; - +// Ensure that this .cpp file gets linked when PostDominators.h is used. +DEFINING_FILE_FOR(PostDominanceFrontier) diff --git a/lib/Analysis/ValueNumbering.cpp b/lib/Analysis/ValueNumbering.cpp index 06482224544..c534bba4dcb 100644 --- a/lib/Analysis/ValueNumbering.cpp +++ b/lib/Analysis/ValueNumbering.cpp @@ -239,4 +239,5 @@ void BVNImpl::handleTernaryInst(Instruction &I) { } -int llvm::BasicValueNumberingStub; // to ensure linkage of this file +// Ensure that users of ValueNumbering.h will link with this file +DEFINING_FILE_FOR(BasicValueNumbering) diff --git a/lib/VMCore/Dominators.cpp b/lib/VMCore/Dominators.cpp index a0a6d253b28..35c847f7d6d 100644 --- a/lib/VMCore/Dominators.cpp +++ b/lib/VMCore/Dominators.cpp @@ -304,8 +304,6 @@ bool DominatorSet::runOnFunction(Function &F) { return false; } -int DominatorSet::stub; - namespace llvm { static std::ostream &operator<<(std::ostream &o, const std::set &BBs) { @@ -933,3 +931,5 @@ void ETForestBase::print(std::ostream &o, const Module *) const { } o << "\n"; } + +DEFINING_FILE_FOR(DominatorSet) diff --git a/lib/VMCore/IntrinsicInst.cpp b/lib/VMCore/IntrinsicInst.cpp index b4395e1cd32..598a99f18fd 100644 --- a/lib/VMCore/IntrinsicInst.cpp +++ b/lib/VMCore/IntrinsicInst.cpp @@ -71,7 +71,5 @@ std::string DbgStopPointInst::getDirectory() const { } //===----------------------------------------------------------------------===// -/// LinkIntrinsicInstStub -- This is a hack to make sure that programs that -/// #include IntrinsicInst.h also link this file. See Support/IncludeFile.h -/// for further details. -char llvm::LinkIntrinsicInstStub; +/// Ensure that users of IntrinsicInst.h will link with this module. +DEFINING_FILE_FOR(IntrinsicInst)