2010-01-20 Doug Kwan <dougkwan@google.com>
[external/binutils.git] / gold / icf.h
1 // icf.h --  Identical Code Folding
2
3 // Copyright 2009, 2010 Free Software Foundation, Inc.
4 // Written by Sriraman Tallam <tmsriram@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #ifndef GOLD_ICF_H
24 #define GOLD_ICF_H
25
26 #include <vector>
27
28 #include "elfcpp.h"
29 #include "symtab.h"
30 #include "object.h"
31
32 namespace gold
33 {
34
35 class Object;
36 class Input_objects;
37 class Symbol_table;
38
39 class Icf
40 {
41  public:
42   typedef std::vector<Section_id> Sections_reachable_list;
43   typedef std::vector<Symbol*> Symbol_info;
44   typedef std::vector<std::pair<long long, long long> > Addend_info;
45   typedef Unordered_map<Section_id,
46                         Sections_reachable_list,
47                         Section_id_hash> Section_list;
48   typedef Unordered_map<Section_id, Symbol_info, Section_id_hash> Symbol_list;
49   typedef Unordered_map<Section_id, Addend_info, Section_id_hash> Addend_list;
50   typedef Unordered_map<Section_id,
51                         unsigned int,
52                         Section_id_hash> Uniq_secn_id_map;
53
54   Icf()
55   : id_section_(), section_id_(), kept_section_id_(),
56     num_tracked_relocs(NULL), icf_ready_(false),
57     section_reloc_list_(), symbol_reloc_list_(),
58     addend_reloc_list_()
59   { }
60
61   // Returns the kept folded identical section corresponding to
62   // dup_obj and dup_shndx.
63   Section_id
64   get_folded_section(Object* dup_obj, unsigned int dup_shndx);
65
66   // Forms groups of identical sections where the first member
67   // of each group is the kept section during folding.
68   void
69   find_identical_sections(const Input_objects* input_objects,
70                           Symbol_table* symtab);
71
72   // This is set when ICF has been run and the groups of
73   // identical sections have been formed.
74   void
75   icf_ready()
76   { this->icf_ready_ = true; }
77
78   // Returns true if ICF has been run.
79   bool
80   is_icf_ready()
81   { return this->icf_ready_; }
82
83   // Unfolds the section denoted by OBJ and SHNDX if folded.
84   void
85   unfold_section(Object* obj, unsigned int shndx);
86
87   // Returns the kept section corresponding to the 
88   // given section.
89   bool
90   is_section_folded(Object* obj, unsigned int shndx);
91     
92   // Returns a map of a section to a list of all sections referenced
93   // by its relocations.
94   Section_list&
95   section_reloc_list()
96   { return this->section_reloc_list_; }
97
98   // Returns a map of  a section to a list of all symbols referenced
99   // by its relocations.
100   Symbol_list&
101   symbol_reloc_list()
102   { return this->symbol_reloc_list_; }
103
104   // Returns a maps of a section to a list of symbol values and addends
105   // of its relocations.
106   Addend_list&
107   addend_reloc_list()
108   { return this->addend_reloc_list_; }
109   
110   // Returns a mapping of each section to a unique integer.
111   Uniq_secn_id_map&
112   section_to_int_map()
113   { return this->section_id_; }
114
115  private:
116
117   // Maps integers to sections.
118   std::vector<Section_id> id_section_;
119   // Does the reverse.
120   Uniq_secn_id_map section_id_;
121   // Given a section id, this maps it to the id of the kept
122   // section.  If the id's are the same then this section is
123   // not folded.
124   std::vector<unsigned int> kept_section_id_;
125   unsigned int* num_tracked_relocs;
126   // Flag to indicate if ICF has been run.
127   bool icf_ready_;
128
129   // These lists are populated by gc_process_relocs in gc.h.
130   Section_list section_reloc_list_;
131   Symbol_list symbol_reloc_list_;
132   Addend_list addend_reloc_list_;
133 };
134
135 // This function returns true if this section corresponds to a function that
136 // should be considered by icf as a possible candidate for folding.  Some
137 // earlier gcc versions, like 4.0.3, put constructors and destructors in
138 // .gnu.linkonce.t sections and hence should be included too.
139 inline bool
140 is_section_foldable_candidate(const char* section_name)
141 {
142   return (is_prefix_of(".text", section_name)
143           || is_prefix_of(".gnu.linkonce.t", section_name));
144 }
145
146 } // End of namespace gold.
147
148 #endif