Add helper for ultimate aliasee resoltion
authorAnton Korobeynikov <asl@math.spbu.ru>
Tue, 11 Mar 2008 22:28:56 +0000 (22:28 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Tue, 11 Mar 2008 22:28:56 +0000 (22:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48255 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/GlobalAlias.h
lib/VMCore/Globals.cpp

index 572de670371899f03ddc6829349d8064453d65fa..1dee0414ebc764c102a4b823af65f54aff86d3ad 100644 (file)
@@ -78,7 +78,12 @@ public:
   /// getAliasedGlobal() - Aliasee can be either global or bitcast of
   /// global. This method retrives the global for both aliasee flavours.
   const GlobalValue* getAliasedGlobal() const;
-    
+
+  /// resolveAliasedGlobal() - This method tries to ultimately resolve alias by
+  /// going through aliasing chain and trying to find the very last
+  /// global. Return NULL is cycle was found.
+  const GlobalValue* resolveAliasedGlobal() const;
+
   // Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const GlobalAlias *) { return true; }
   static inline bool classof(const Value *V) {
index dae22e48aea1294ed49da7c65de9f02c93ab20ac..d66d351bc23d2cf252fc7a55bc2f5ff3fae01fca 100644 (file)
@@ -17,6 +17,7 @@
 #include "llvm/GlobalAlias.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
+#include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/Support/LeakDetector.h"
 using namespace llvm;
 
@@ -230,3 +231,18 @@ const GlobalValue *GlobalAlias::getAliasedGlobal() const {
   return 0;
 }
 
+const GlobalValue *GlobalAlias::resolveAliasedGlobal() const {
+  SmallPtrSet<const GlobalValue*, 1> Visited;
+
+  const GlobalValue *GV = getAliasedGlobal();
+  Visited.insert(GV);
+
+  while (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) {
+    GV = GA->getAliasedGlobal();
+
+    if (!Visited.insert(GV))
+      return NULL;
+  }
+
+  return GV;
+}