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(DTE, "deadtypeelim", "Dead Type Elimination", false, false);
50
ModulePass *llvm::createDeadTypeEliminationPass() {
55
// ShouldNukeSymtabEntry - Return true if this module level symbol table entry
56
// should be eliminated.
58
static inline bool ShouldNukeSymtabEntry(const Type *Ty){
59
// Nuke all names for primitive types!
60
if (Ty->isPrimitiveType() || Ty->isIntegerTy())
63
// Nuke all pointers to primitive types as well...
64
if (const PointerType *PT = dyn_cast<PointerType>(Ty))
65
if (PT->getElementType()->isPrimitiveType() ||
66
PT->getElementType()->isIntegerTy())
72
// run - For this pass, it removes global symbol table entries for primitive
73
// types. These are never used for linking in GCC and they make the output
74
// uglier to look at, so we nuke them. Also eliminate types that are never used
75
// in the entire program as indicated by FindUsedTypes.
77
bool DTE::runOnModule(Module &M) {
80
TypeSymbolTable &ST = M.getTypeSymbolTable();
81
std::set<const Type *> UsedTypes = getAnalysis<FindUsedTypes>().getTypes();
83
// Check the symbol table for superfluous type entries...
85
// Grab the 'type' plane of the module symbol...
86
TypeSymbolTable::iterator TI = ST.begin();
87
TypeSymbolTable::iterator TE = ST.end();
89
// If this entry should be unconditionally removed, or if we detect that
90
// the type is not used, remove it.
91
const Type *RHS = TI->second;
92
if (ShouldNukeSymtabEntry(RHS) || !UsedTypes.count(RHS)) {
98
// We only need to leave one name for each type.