From c6c98af9e5814e8066c82f20ca11cf646a5fc289 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Sun, 29 Apr 2007 18:02:48 +0000 Subject: [PATCH] Implement review feedback git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36564 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.html | 2 +- include/llvm/Function.h | 4 ++-- include/llvm/GlobalAlias.h | 5 ++++- lib/CodeGen/AsmPrinter.cpp | 15 +++------------ lib/Transforms/IPO/GlobalDCE.cpp | 2 +- lib/VMCore/AsmWriter.cpp | 3 +-- lib/VMCore/Globals.cpp | 33 ++++++++++++++++++++++++++------ lib/VMCore/Verifier.cpp | 3 ++- 8 files changed, 41 insertions(+), 26 deletions(-) diff --git a/docs/LangRef.html b/docs/LangRef.html index d74ef742dbc..67a2fc8a4dd 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -24,7 +24,7 @@
  • Calling Conventions
  • Global Variables
  • Functions
  • -
  • Aliases +
  • Aliases
  • Parameter Attributes
  • Module-Level Inline Assembly
  • Data Layout
  • diff --git a/include/llvm/Function.h b/include/llvm/Function.h index 71fb87ea667..b3b9716d4df 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -150,12 +150,12 @@ public: /// removeFromParent - This method unlinks 'this' from the containing module, /// but does not delete it. /// - virtual void removeFromParent(); + void removeFromParent(); /// eraseFromParent - This method unlinks 'this' from the containing module /// and deletes it. /// - virtual void eraseFromParent(); + void eraseFromParent(); /// Get the underlying elements of the Function... the basic block list is diff --git a/include/llvm/GlobalAlias.h b/include/llvm/GlobalAlias.h index 04bd5fbd7fe..bbd19ba8816 100644 --- a/include/llvm/GlobalAlias.h +++ b/include/llvm/GlobalAlias.h @@ -75,7 +75,10 @@ public: Constant* getAliasee() { return cast_or_null(getOperand(0)); } - + /// getAliasedGlobal() - Aliasee can be either global or bitcast of + /// global. This method retrives the global for both aliasee flavours. + const GlobalValue* getAliasedGlobal() 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) { diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index f7571831a34..eb0f2f1b367 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -129,22 +129,13 @@ bool AsmPrinter::doFinalization(Module &M) { O << "\n"; for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); I!=E; ++I) { - const Constant *Aliasee = dyn_cast_or_null(I->getAliasee()); - assert(Aliasee && "Aliasee cannot be null"); - std::string Name = Mang->getValueName(I); std::string Target; - if (const GlobalValue *GV = dyn_cast(Aliasee)) + if (const GlobalValue *GV = I->getAliasedGlobal()) Target = Mang->getValueName(GV); - else { - const ConstantExpr *CE = 0; - if ((CE = dyn_cast(Aliasee)) && - (CE->getOpcode() == Instruction::BitCast)) - Target = Mang->getValueName(CE->getOperand(0)); - else - assert(0 && "Unsupported aliasee"); - } + else + assert(0 && "Unsupported aliasee"); if (I->hasExternalLinkage()) O << "\t.globl\t" << Name << "\n"; diff --git a/lib/Transforms/IPO/GlobalDCE.cpp b/lib/Transforms/IPO/GlobalDCE.cpp index 90150689cc8..56879e2b136 100644 --- a/lib/Transforms/IPO/GlobalDCE.cpp +++ b/lib/Transforms/IPO/GlobalDCE.cpp @@ -76,7 +76,7 @@ bool GlobalDCE::runOnModule(Module &M) { for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E; ++I) { // Aliases are always needed even if they are not used. - MarkUsedGlobalsAsNeeded(cast(I->getAliasee())); + MarkUsedGlobalsAsNeeded(I->getAliasee()); } // Now that all globals which are needed are in the AliveGlobals set, we loop diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 656a7bed74e..ac68e8d32fb 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -926,8 +926,7 @@ void AssemblyWriter::printAlias(const GlobalAlias *GA) { assert(0 && "Invalid alias linkage"); } - const Constant *Aliasee = dyn_cast_or_null(GA->getAliasee()); - assert(Aliasee && "Aliasee cannot be null"); + const Constant *Aliasee = GA->getAliasee(); if (const GlobalVariable *GV = dyn_cast(Aliasee)) { printType(GV->getType()); diff --git a/lib/VMCore/Globals.cpp b/lib/VMCore/Globals.cpp index 88a8c0b2a7a..aeb34f43715 100644 --- a/lib/VMCore/Globals.cpp +++ b/lib/VMCore/Globals.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Constants.h" #include "llvm/GlobalVariable.h" #include "llvm/GlobalAlias.h" #include "llvm/DerivedTypes.h" @@ -193,16 +194,36 @@ void GlobalAlias::eraseFromParent() { } bool GlobalAlias::isDeclaration() const { - const GlobalValue* AV = dyn_cast_or_null(getAliasee()); - return (AV && AV->isDeclaration()); + const GlobalValue* AV = getAliasedGlobal(); + if (AV) + return AV->isDeclaration(); + else + return false; } void GlobalAlias::setAliasee(Constant *Aliasee) { - if (Aliasee) { - assert(Aliasee->getType() == getType() && + if (Aliasee) + assert(Aliasee->getType() == getType() && "Alias and aliasee types should match!"); - setOperand(0, Aliasee); - } + + setOperand(0, Aliasee); +} + +const GlobalValue *GlobalAlias::getAliasedGlobal() const { + const Constant *C = getAliasee(); + if (C) { + if (const GlobalValue *GV = dyn_cast(C)) + return GV; + else { + const ConstantExpr *CE = 0; + if ((CE = dyn_cast(Aliasee)) && + (CE->getOpcode() == Instruction::BitCast)) + return cast(CE->getOperand(0)); + else + assert(0 && "Unsupported aliasee"); + } + } else + return 0; } diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index c580e70d84e..8e632e2f8da 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -321,7 +321,8 @@ void Verifier::visitGlobalAlias(GlobalAlias &GA) { if (!isa(GA.getAliasee())) { const ConstantExpr *CE = dyn_cast(GA.getAliasee()); - Assert1(CE && CE->getOpcode() == Instruction::BitCast, + Assert1(CE && CE->getOpcode() == Instruction::BitCast && + isa(CE->getOperand(0)), "Aliasee should be either GlobalValue or bitcast of GlobalValue", &GA); }