summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2015-07-22 11:10:41 +0000
committerChandler Carruth <chandlerc@gmail.com>2015-07-22 11:10:41 +0000
commit8f1b63e973bc6b489b4cc2f968e6a70692ef3831 (patch)
treee6a580882068d8e1d811b62b09cc679a2cd5a77d /llvm/lib/Analysis
parent050d1e8a348c0afa91e01e07157bfc103ea9e1b4 (diff)
downloadbcm5719-llvm-8f1b63e973bc6b489b4cc2f968e6a70692ef3831.tar.gz
bcm5719-llvm-8f1b63e973bc6b489b4cc2f968e6a70692ef3831.zip
[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. llvm-svn: 242888
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r--llvm/lib/Analysis/IPA/GlobalsModRef.cpp79
1 files changed, 39 insertions, 40 deletions
diff --git a/llvm/lib/Analysis/IPA/GlobalsModRef.cpp b/llvm/lib/Analysis/IPA/GlobalsModRef.cpp
index 5f23d7ec23f..720bef85798 100644
--- a/llvm/lib/Analysis/IPA/GlobalsModRef.cpp
+++ b/llvm/lib/Analysis/IPA/GlobalsModRef.cpp
@@ -104,7 +104,45 @@ class GlobalsModRef : public ModulePass, public AliasAnalysis {
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, AliasAnalysis, "globalsmodref-aa",
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,
OpenPOWER on IntegriCloud