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

Devang Patel dpatel at apple.com
Thu Nov 13 09:35:43 PST 2008


On Nov 13, 2008, at 8:24 AM, John Criswell wrote:

> 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.


Hmm.. the patch does not add RemoveDeadConstant() function.  However,  
this function uses destroyContent(). Do you have a test case handy ?
Thanks,
-
Devang
>
>
> -- 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