[llvm] r242888 - [PM/AA] Try to fix libc++ build bots which require the type used in
Chandler Carruth
chandlerc at gmail.com
Wed Jul 22 04:10:42 PDT 2015
Author: chandlerc
Date: Wed Jul 22 06:10:41 2015
New Revision: 242888
URL: http://llvm.org/viewvc/llvm-project?rev=242888&view=rev
Log:
[PM/AA] Try to fix libc++ build bots which require the type used in
std::list to be complete by hoisting the entire definition into the
class. Ugly, but hopefully works.
Modified:
llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp
Modified: llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp?rev=242888&r1=242887&r2=242888&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp (original)
+++ llvm/trunk/lib/Analysis/IPA/GlobalsModRef.cpp Wed Jul 22 06:10:41 2015
@@ -104,7 +104,45 @@ class GlobalsModRef : public ModulePass,
std::map<const Function *, FunctionRecord> FunctionInfo;
/// Handle to clear this analysis on deletion of values.
- struct DeletionCallbackHandle;
+ struct DeletionCallbackHandle final : CallbackVH {
+ GlobalsModRef &GMR;
+ std::list<DeletionCallbackHandle>::iterator I;
+
+ DeletionCallbackHandle(GlobalsModRef &GMR, Value *V)
+ : CallbackVH(V), GMR(GMR) {}
+
+ void deleted() override {
+ Value *V = getValPtr();
+ if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
+ if (GMR.NonAddressTakenGlobals.erase(GV)) {
+ // This global might be an indirect global. If so, remove it and
+ // remove
+ // any AllocRelatedValues for it.
+ if (GMR.IndirectGlobals.erase(GV)) {
+ // Remove any entries in AllocsForIndirectGlobals for this global.
+ for (std::map<const Value *, const GlobalValue *>::iterator
+ I = GMR.AllocsForIndirectGlobals.begin(),
+ E = GMR.AllocsForIndirectGlobals.end();
+ I != E;) {
+ if (I->second == GV) {
+ GMR.AllocsForIndirectGlobals.erase(I++);
+ } else {
+ ++I;
+ }
+ }
+ }
+ }
+ }
+
+ // If this is an allocation related to an indirect global, remove it.
+ GMR.AllocsForIndirectGlobals.erase(V);
+
+ // And clear out the handle.
+ setValPtr(nullptr);
+ GMR.Handles.erase(I);
+ // This object is now destroyed!
+ }
+ };
/// List of callbacks for globals being tracked by this analysis. Note that
/// these objects are quite large, but we only anticipate having one per
@@ -221,45 +259,6 @@ INITIALIZE_AG_PASS_END(GlobalsModRef, Al
Pass *llvm::createGlobalsModRefPass() { return new GlobalsModRef(); }
-struct GlobalsModRef::DeletionCallbackHandle final : CallbackVH {
- GlobalsModRef &GMR;
- std::list<DeletionCallbackHandle>::iterator I;
-
- DeletionCallbackHandle(GlobalsModRef &GMR, Value *V)
- : CallbackVH(V), GMR(GMR) {}
-
- void deleted() override {
- Value *V = getValPtr();
- if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
- if (GMR.NonAddressTakenGlobals.erase(GV)) {
- // This global might be an indirect global. If so, remove it and remove
- // any AllocRelatedValues for it.
- if (GMR.IndirectGlobals.erase(GV)) {
- // Remove any entries in AllocsForIndirectGlobals for this global.
- for (std::map<const Value *, const GlobalValue *>::iterator
- I = GMR.AllocsForIndirectGlobals.begin(),
- E = GMR.AllocsForIndirectGlobals.end();
- I != E;) {
- if (I->second == GV) {
- GMR.AllocsForIndirectGlobals.erase(I++);
- } else {
- ++I;
- }
- }
- }
- }
- }
-
- // If this is an allocation related to an indirect global, remove it.
- GMR.AllocsForIndirectGlobals.erase(V);
-
- // And clear out the handle.
- setValPtr(nullptr);
- GMR.Handles.erase(I);
- // This object is now destroyed!
- }
-};
-
/// AnalyzeGlobals - Scan through the users of all of the internal
/// GlobalValue's in the program. If none of them have their "address taken"
/// (really, their address passed to something nontrivial), record this fact,
More information about the llvm-commits
mailing list