Update copyright disclaimer structure by outlining copyright notice. Add LLNL and...
[dyninst.git] / symtabAPI / src / LinkMap.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #include "LinkMap.h"
32 #include <iostream>
33
34 using namespace Dyninst;
35 using namespace SymtabAPI;
36
37 LinkMap::LinkMap() :
38     allocatedData(NULL), allocatedSize(0), commonStorage(NULL),
39     bssRegionOffset(0), bssSize(0), bssRegionAlign(0),
40     dataRegionOffset(0), dataSize(0), dataRegionAlign(0),
41     codeRegionOffset(0), codeSize(0), codeRegionAlign(0),
42     tlsRegionOffset(0), tlsSize(0), tlsRegionAlign(0),
43     gotRegionOffset(0), gotSize(0), gotRegionAlign(0),
44     ctorDtorHandler(NULL), ctorRegionOffset(0), ctorSize(0),
45     ctorRegionAlign(0), originalCtorRegion(NULL), dtorRegionOffset(0),
46     dtorSize(0), dtorRegionAlign(0), originalDtorRegion(NULL) 
47 {
48 }
49
50 LinkMap::~LinkMap() {
51     if( commonStorage ) delete commonStorage;
52 }
53
54 ostream & operator<<(ostream &os, LinkMap &lm) {
55      lm.printAll(os, 0);
56      return os;
57 }
58
59 void LinkMap::print(Offset globalOffset) {
60     printAll(std::cout, globalOffset);
61 }
62
63 void LinkMap::printAll(ostream &os, Offset globalOffset) {
64     os << "Size of allocated space = 0x" << hex << allocatedSize << dec << endl;
65
66     if( codeRegions.size() > 0 ) {
67         os << "New CODE Region: Offset: 0x" << hex << (globalOffset + codeRegionOffset) << dec
68            << " Size: 0x" << hex << codeSize << dec 
69            << " Alignment: 0x" << hex << codeRegionAlign << dec
70            << endl;
71         printRegions(os, codeRegions, globalOffset);
72         os << endl;
73     }
74
75     if( dataRegions.size() > 0 ) {
76         os << "New DATA Region: Offset: 0x" << hex << (globalOffset + dataRegionOffset) << dec
77            << " Size: 0x" << hex << dataSize << dec 
78            << " Alignment: 0x" << hex << dataRegionAlign << dec
79            << endl;
80         printRegions(os, dataRegions, globalOffset);
81         os << endl;
82     }
83
84     if( tlsRegions.size() > 0 ) {
85         os << "New TLS Region: Offset: 0x" << hex << (globalOffset + tlsRegionOffset) << dec
86            << " Size: 0x" << hex << tlsSize << dec 
87            << " Alignment: 0x" << hex << tlsRegionAlign << dec
88            << endl;
89         printRegions(os, tlsRegions, globalOffset);
90
91         os << endl;
92
93         // Print each symbol ordered by its offset from the TCB
94         map<Offset, Symbol *> off2Sym;
95         vector<Symbol *>::iterator sym_it;
96         for(sym_it = tlsSymbols.begin(); sym_it != tlsSymbols.end(); ++sym_it) {
97             off2Sym.insert(make_pair((*sym_it)->getOffset(), *sym_it));
98         }
99
100         map<Offset, Symbol *>::iterator off_it;
101         for(off_it = off2Sym.begin(); off_it != off2Sym.end(); ++off_it) {
102             os << "\tSymbol: " << off_it->second->getMangledName() 
103                << " Offset: 0x" << hex << off_it->first << dec 
104                << endl;
105         }
106
107         os << endl;
108     }
109
110     if( gotSize > 0 ) {
111         os << "New GOT Region: Offset: 0x" << hex << (globalOffset + gotRegionOffset) << dec
112            << " Size: 0x" << hex << gotSize << dec 
113            << " Alignment: 0x" << hex << gotRegionAlign << dec
114            << endl;
115
116         // Print out GOT entries in order
117         map<Offset, Symbol *> gotByEntry;
118         map<Symbol *, Offset>::iterator sym_it;
119         for(sym_it = gotSymbols.begin(); sym_it != gotSymbols.end(); ++sym_it) {
120             gotByEntry.insert(make_pair(sym_it->second, sym_it->first));
121         }
122
123         map<Offset, Symbol *>::iterator off_it;
124         for(off_it = gotByEntry.begin(); off_it != gotByEntry.end(); ++off_it) {
125             os << "\tGOT Offset: 0x" << hex << off_it->first << dec
126                << " Symbol: " << off_it->second->getMangledName()
127                << " Offset: 0x" << hex << off_it->second->getOffset() << dec << endl;
128         }
129
130         os << endl;
131     }
132
133     if( newCtorRegions.size() > 0 ) {
134         os << "New .ctors region: Offset: 0x" << hex << (globalOffset + ctorRegionOffset) << dec
135            << " Size: 0x" << hex << ctorSize << dec
136            << " Alignment: 0x" << hex << ctorRegionAlign << dec
137            << endl;
138
139         if( originalCtorRegion != NULL ) {
140             printRegionFromInfo(os, originalCtorRegion, 0, 0);
141         }
142
143         vector<Region *>::iterator reg_it;
144         for(reg_it = newCtorRegions.begin(); reg_it != newCtorRegions.end(); ++reg_it) {
145             printRegion(os, *reg_it, globalOffset);
146         }
147
148         os << endl;
149     }
150
151     if( newDtorRegions.size() > 0 ) {
152          os << "New .dtors region: Offset: 0x" << hex << (globalOffset + dtorRegionOffset) << dec
153            << " Size: 0x" << hex << dtorSize << dec
154            << " Alignment: 0x" << hex << dtorRegionAlign << dec
155            << endl;
156
157         if( originalDtorRegion != NULL ) {
158             printRegionFromInfo(os, originalDtorRegion, 0, 0);
159         }
160
161         vector<Region *>::iterator reg_it;
162         for(reg_it = newDtorRegions.begin(); reg_it != newDtorRegions.end(); ++reg_it) {
163             printRegion(os, *reg_it, globalOffset);
164         }
165
166         os << endl;
167         
168     }
169
170     if( bssRegions.size() > 0 ) {
171         os << "New BSS Region: Offset: 0x" << hex << (globalOffset + bssRegionOffset) << dec
172            << " Size: 0x" << hex << bssSize << dec 
173            << " Alignment: 0x" << hex << bssRegionAlign << dec
174            << endl;
175         printRegions(os, bssRegions, globalOffset);
176         os << endl;
177     }
178
179 }
180
181 void LinkMap::printBySymtab(ostream &os, vector<Symtab *> &symtabs, Offset globalOffset) {
182     vector<Symtab *>::iterator symtab_it;
183     for(symtab_it = symtabs.begin(); symtab_it != symtabs.end(); ++symtab_it) {
184         os << "Object: " << (*symtab_it)->memberName() << endl;
185
186         // Print the location of all the Regions
187         vector<Region *> regions;
188         if( !(*symtab_it)->getAllRegions(regions) ) continue;
189
190         vector<Region *>::iterator reg_it;
191         for(reg_it = regions.begin(); reg_it != regions.end(); ++reg_it) {
192             printRegion(os, *reg_it, globalOffset);
193         }
194
195         os << endl;
196
197         // Print the location of all the Functions
198         vector<Function *> funcs;
199         if( !(*symtab_it)->getAllFunctions(funcs) ) continue;
200
201         vector<Function *>::iterator func_it;
202         for(func_it = funcs.begin(); func_it != funcs.end(); ++func_it) {
203             Symbol *symbol = (*func_it)->getFirstSymbol();
204             os << "\tFunction: " << symbol->getPrettyName()
205                << " Offset: 0x" << hex << symbol->getOffset() << dec
206                << " - 0x" << hex << (symbol->getOffset() + symbol->getSize() - 1) << dec
207                << " Size: 0x" << hex << symbol->getSize() << dec
208                << endl;
209         }
210
211         os << endl;
212     }
213 }
214
215 void LinkMap::printRegions(ostream &os, deque<Region *> &regions, Offset globalOffset) {
216     deque<Region *>::iterator reg_it;
217     for(reg_it = regions.begin(); reg_it != regions.end(); ++reg_it) {
218         printRegion(os, *reg_it, globalOffset);
219     }
220 }
221
222 void LinkMap::printRegion(ostream &os, Region *region, Offset globalOffset) {
223     map<Region *, AllocPair>::iterator result;
224     result = regionAllocs.find(region);
225     if( result != regionAllocs.end() ) {
226         AllocPair pair = result->second;
227         printRegionFromInfo(os, region, globalOffset + pair.second,
228                 pair.first);
229     }
230 }
231
232 void LinkMap::printRegionFromInfo(ostream &os, Region *region, Offset regionOffset, Offset padding)
233 {
234     os << "\tRegion " << region->getRegionName() 
235            << " Padding: 0x" << hex << padding << dec
236            << " Offset: 0x" << hex << regionOffset << dec
237            << " - 0x" << hex << (regionOffset + region->getMemSize() - 1) << dec
238            << " Size: 0x" << hex << region->getMemSize() << dec
239            << " Alignment: 0x" << hex << region->getMemAlignment() << dec
240            << endl;
241 }