[llvm-commits] [llvm] r59208 - /llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp

John Criswell criswell at cs.uiuc.edu
Thu Nov 13 08:24:15 PST 2008


Dear Devang,

This patch breaks the -strip pass. The RemoveDeadConstant() method is 
defined as:

virtual void destroyConstant() { assert(0 && "Not reached!"); }

... on line 94 of include/llvm/Constant.h.

-- John T.

Devang Patel wrote:
> Author: dpatel
> Date: Wed Nov 12 19:28:40 2008
> New Revision: 59208
>
> URL: http://llvm.org/viewvc/llvm-project?rev=59208&view=rev
> Log:
> Really remove all debug information.
>
> Modified:
>     llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp
>
> Modified: llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp?rev=59208&r1=59207&r2=59208&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/StripSymbols.cpp Wed Nov 12 19:28:40 2008
> @@ -56,13 +56,23 @@
>    return new StripSymbols(OnlyDebugInfo);
>  }
>  
> +/// OnlyUsedBy - Return true if V is only used by Usr.
> +static bool OnlyUsedBy(Value *V, Value *Usr) {
> +  for(Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) {
> +    User *U = *I;
> +    if (U != Usr)
> +      return false;
> +  }
> +  return true;
> +}
> +
>  static void RemoveDeadConstant(Constant *C) {
>    assert(C->use_empty() && "Constant is not dead!");
> -  std::vector<Constant*> Operands;
> +  SmallPtrSet<Constant *, 4> Operands;
>    for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i)
>      if (isa<DerivedType>(C->getOperand(i)->getType()) &&
> -        C->getOperand(i)->hasOneUse())
> -      Operands.push_back(C->getOperand(i));
> +        OnlyUsedBy(C->getOperand(i), C)) 
> +      Operands.insert(C->getOperand(i));
>    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
>      if (!GV->hasInternalLinkage()) return;   // Don't delete non static globals.
>      GV->eraseFromParent();
> @@ -71,10 +81,9 @@
>      C->destroyConstant();
>  
>    // If the constant referenced anything, see if we can delete it as well.
> -  while (!Operands.empty()) {
> -    RemoveDeadConstant(Operands.back());
> -    Operands.pop_back();
> -  }
> +  for (SmallPtrSet<Constant *, 4>::iterator OI = Operands.begin(),
> +         OE = Operands.end(); OI != OE; ++OI)
> +    RemoveDeadConstant(*OI);
>  }
>  
>  // Strip the symbol table of its names.
> @@ -145,8 +154,6 @@
>    Function *RegionStart = M.getFunction("llvm.dbg.region.start");
>    Function *RegionEnd = M.getFunction("llvm.dbg.region.end");
>    Function *Declare = M.getFunction("llvm.dbg.declare");
> -  if (!FuncStart && !StopPoint && !RegionStart && !RegionEnd && !Declare)
> -    return true;
>  
>    std::vector<GlobalVariable*> DeadGlobals;
>  
> @@ -213,8 +220,30 @@
>      Declare->eraseFromParent();
>    }
>  
> -  // Finally, delete any internal globals that were only used by the debugger
> -  // intrinsics.
> +  // llvm.dbg.compile_units and llvm.dbg.subprograms are marked as linkonce
> +  // but since we are removing all debug information, make them internal now.
> +  if (Constant *C = M.getNamedGlobal("llvm.dbg.compile_units"))
> +    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C))
> +      GV->setLinkage(GlobalValue::InternalLinkage);
> +
> +  if (Constant *C = M.getNamedGlobal("llvm.dbg.subprograms"))
> +    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C))
> +      GV->setLinkage(GlobalValue::InternalLinkage);
> +
> +  // Delete all dbg variables.
> +  const Type *DbgVTy = M.getTypeByName("llvm.dbg.variable.type");
> +  const Type *DbgGVTy = M.getTypeByName("llvm.dbg.global_variable.type");
> +  if (DbgVTy || DbgGVTy)
> +    for (Module::global_iterator I = M.global_begin(), E = M.global_end(); 
> +         I != E; ++I) 
> +      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(I))
> +        if (GV->hasName() && GV->use_empty()
> +            && !strncmp(GV->getNameStart(), "llvm.dbg", 8)
> +            && (GV->getType()->getElementType() == DbgVTy
> +                || GV->getType()->getElementType() == DbgGVTy))
> +          DeadGlobals.push_back(GV);
> +
> +  // Delete any internal globals that were only used by the debugger intrinsics.
>    while (!DeadGlobals.empty()) {
>      GlobalVariable *GV = DeadGlobals.back();
>      DeadGlobals.pop_back();
> @@ -222,5 +251,17 @@
>        RemoveDeadConstant(GV);
>    }
>  
> +  // Remove all llvm.dbg types.
> +  TypeSymbolTable &ST = M.getTypeSymbolTable();
> +  TypeSymbolTable::iterator TI = ST.begin();
> +  TypeSymbolTable::iterator TE = ST.end();
> +  while ( TI != TE ) {
> +    const std::string &Name = TI->first;
> +    if (!strncmp(Name.c_str(), "llvm.dbg.", 9))
> +      ST.remove(TI++);
> +    else 
> +      ++TI;
> +  }
> +  
>    return true;
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>   




More information about the llvm-commits mailing list