[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