1 //===- DeadTypeElimination.cpp - Eliminate unused types for symbol table --===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This pass is used to cleanup the output of GCC. It eliminate names for types
11 // that are unused in the entire translation unit, using the FindUsedTypes pass.
13 //===----------------------------------------------------------------------===//
15 #define DEBUG_TYPE "deadtypeelim"
16 #include "llvm/Transforms/IPO.h"
17 #include "llvm/Analysis/FindUsedTypes.h"
18 #include "llvm/Module.h"
19 #include "llvm/TypeSymbolTable.h"
20 #include "llvm/DerivedTypes.h"
21 #include "llvm/ADT/Statistic.h"
24 STATISTIC(NumKilled, "Number of unused typenames removed from symtab");
27 struct DTE : public ModulePass {
28 static char ID; // Pass identification, replacement for typeid
29 DTE() : ModulePass(ID) {}
31 // doPassInitialization - For this pass, it removes global symbol table
32 // entries for primitive types. These are never used for linking in GCC and
33 // they make the output uglier to look at, so we nuke them.
35 // Also, initialize instance variables.
37 bool runOnModule(Module &M);
39 // getAnalysisUsage - This function needs FindUsedTypes to do its job...
41 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
42 AU.addRequired<FindUsedTypes>();
48 INITIALIZE_PASS_BEGIN(DTE, "deadtypeelim", "Dead Type Elimination",
50 INITIALIZE_PASS_DEPENDENCY(FindUsedTypes)
51 INITIALIZE_PASS_END(DTE, "deadtypeelim", "Dead Type Elimination", false, false)
53 ModulePass *llvm::createDeadTypeEliminationPass() {
58 // ShouldNukeSymtabEntry - Return true if this module level symbol table entry
59 // should be eliminated.
61 static inline bool ShouldNukeSymtabEntry(const Type *Ty){
62 // Nuke all names for primitive types!
63 if (Ty->isPrimitiveType() || Ty->isIntegerTy())
66 // Nuke all pointers to primitive types as well...
67 if (const PointerType *PT = dyn_cast<PointerType>(Ty))
68 if (PT->getElementType()->isPrimitiveType() ||
69 PT->getElementType()->isIntegerTy())
75 // run - For this pass, it removes global symbol table entries for primitive
76 // types. These are never used for linking in GCC and they make the output
77 // uglier to look at, so we nuke them. Also eliminate types that are never used
78 // in the entire program as indicated by FindUsedTypes.
80 bool DTE::runOnModule(Module &M) {
83 TypeSymbolTable &ST = M.getTypeSymbolTable();
84 std::set<const Type *> UsedTypes = getAnalysis<FindUsedTypes>().getTypes();
86 // Check the symbol table for superfluous type entries...
88 // Grab the 'type' plane of the module symbol...
89 TypeSymbolTable::iterator TI = ST.begin();
90 TypeSymbolTable::iterator TE = ST.end();
92 // If this entry should be unconditionally removed, or if we detect that
93 // the type is not used, remove it.
94 const Type *RHS = TI->second;
95 if (ShouldNukeSymtabEntry(RHS) || !UsedTypes.count(RHS)) {
101 // We only need to leave one name for each type.
102 UsedTypes.erase(RHS);