Don't barf on empty basic blocks. Do not rely on assert
[oota-llvm.git] / lib / VMCore / Globals.cpp
index c64b719095dae422c8b6e587c0e89e5fb680dfc4..eb0df60757be4dff071e4b50dee4b1b34e9ee7ae 100644 (file)
@@ -12,6 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Constants.h"
 #include "llvm/GlobalVariable.h"
 #include "llvm/GlobalAlias.h"
 #include "llvm/DerivedTypes.h"
@@ -163,12 +164,15 @@ void GlobalVariable::replaceUsesOfWithOnConstant(Value *From, Value *To,
 //===----------------------------------------------------------------------===//
 
 GlobalAlias::GlobalAlias(const Type *Ty, LinkageTypes Link,
-                         const std::string &Name, const GlobalValue* aliasee,
+                         const std::string &Name, Constant* aliasee,
                          Module *ParentModule)
-  : GlobalValue(Ty, Value::GlobalAliasVal, 0, 0,
-                Link, Name), Aliasee(aliasee) {
+  : GlobalValue(Ty, Value::GlobalAliasVal, &Aliasee, 1, Link, Name) {
   LeakDetector::addGarbageObject(this);
 
+  if (aliasee)
+    assert(aliasee->getType() == Ty && "Alias and aliasee types should match!");
+  Aliasee.init(aliasee, this);
+
   if (ParentModule)
     ParentModule->getAliasList().push_back(this);
 }
@@ -190,12 +194,37 @@ void GlobalAlias::eraseFromParent() {
 }
 
 bool GlobalAlias::isDeclaration() const {
-  return (Aliasee && Aliasee->isDeclaration());
+  const GlobalValue* AV = getAliasedGlobal();
+  if (AV)
+    return AV->isDeclaration();
+  else
+    return false;
 }
 
-void GlobalAlias::setAliasee(const GlobalValue *GV
+void GlobalAlias::setAliasee(Constant *Aliasee
 {
-  // FIXME: Some checks?
-  Aliasee = GV;
+  if (Aliasee)
+    assert(Aliasee->getType() == getType() &&
+           "Alias and aliasee types should match!");
+  
+  setOperand(0, Aliasee);
+}
+
+const GlobalValue *GlobalAlias::getAliasedGlobal() const {
+  const Constant *C = getAliasee();
+  if (C) {
+    if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
+      return GV;
+    else {
+      const ConstantExpr *CE = 0;
+      if ((CE = dyn_cast<ConstantExpr>(C)) &&
+          (CE->getOpcode() == Instruction::BitCast || 
+           CE->getOpcode() == Instruction::GetElementPtr))
+        return dyn_cast<GlobalValue>(CE->getOperand(0));
+      else
+        assert(0 && "Unsupported aliasee");
+    }
+  }
+  return 0;
 }