WIP: static rewriting on BlueGene.
[dyninst.git] / symtabAPI / src / LinkMap.h
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 #if !defined(_Link_Map_h_)
32 #define _Link_Map_h_
33
34 #include "Symtab.h"
35 #include "Region.h"
36 #include "Symbol.h"
37 #include "Function.h"
38
39 #include <deque>
40 #include <map>
41 #include <vector>
42 using namespace std;
43
44 namespace Dyninst{
45 namespace SymtabAPI{
46
47 /*
48  * A data structure that holds all the information necessary to perform a
49  * static link once all the relocatable files have been copied into a new data
50  * block
51  */
52 class LinkMap {
53     public:
54         LinkMap();
55         ~LinkMap();
56
57         // A pair representing an allocation for a Region
58         // The first Offset is the amount of padding before the Region
59         // The second Offset is the offset of the location in the allocatedData
60         typedef pair<Offset, Offset> AllocPair;
61
62         // prints the LinkMap (really for debugging purposes)
63         // uses globalOffset as the location of allocatedData in the target
64         void print(Offset globalOffset);
65         void printAll(ostream &os, Offset globalOffset);
66         void printBySymtab(ostream &os, vector<Symtab *> &symtabs, Offset globalOffset);
67         void printRegions(ostream &os, deque<Region *> &regions, Offset globalOffset);
68         void printRegion(ostream &os, Region *region, Offset globalOffset);
69         void printRegionFromInfo(ostream &os, Region *region, Offset regionOffset, Offset padding);
70         
71         friend ostream & operator<<(ostream &os, LinkMap &lm);
72
73         // Data Members
74         // all other members describe this block of data
75         char *allocatedData; 
76         Offset allocatedSize;
77
78         // map of Regions placed in allocatedData
79         map<Region *, AllocPair> regionAllocs;
80
81         // Keep track of the dynamically allocated COMMON symbol Region
82         Region *commonStorage;
83
84         // new Region info
85         // Offset -> offset in allocatedData
86         // Size -> size of Region
87         // Regions -> existing Regions which make up this Region
88
89         // new bss Region info
90         Offset bssRegionOffset;
91         Offset bssSize;
92         Offset bssRegionAlign;
93         deque<Region *> bssRegions;
94
95         // new data Region info
96         Offset dataRegionOffset;
97         Offset dataSize;
98         Offset dataRegionAlign;
99         deque<Region *> dataRegions;
100         
101         // Stub code region
102         Offset stubRegionOffset;
103         Offset stubSize;
104         std::map<Symbol *, Offset> stubMap;
105
106         // new code Region info
107         Offset codeRegionOffset;
108         Offset codeSize;
109         Offset codeRegionAlign;
110         deque<Region *> codeRegions;
111         
112         // new TLS Region info
113         Offset tlsRegionOffset;
114         Offset tlsSize;
115         Offset tlsRegionAlign;
116         deque<Region *> tlsRegions;
117         vector<Symbol *> tlsSymbols;
118
119         // new GOT Region info
120         Offset gotRegionOffset;
121         Offset gotSize;
122         Offset gotRegionAlign;
123              vector<pair<Symbol *, Offset> >gotSymbolTable;
124         map <Symbol *, Offset> gotSymbols;
125         deque<Region *> gotRegions;
126
127         Symtab *ctorDtorHandler;
128
129         // new constructor Region info
130         Offset ctorRegionOffset;
131         Offset ctorSize;
132         Offset ctorRegionAlign;
133         Region *originalCtorRegion;
134         vector<Region *> newCtorRegions;
135
136         // new destructor Region info
137         Offset dtorRegionOffset;
138         Offset dtorSize;
139         Offset dtorRegionAlign;
140         Region *originalDtorRegion;
141         vector<Region *> newDtorRegions;
142
143         // Keep track of changes made to symbols and relocations
144         vector< pair<Symbol *, Offset> > origSymbols;
145         vector< pair<relocationEntry *, Symbol *> > origRels;
146 };
147
148 } // SymtabAPI
149 } // Dyninst
150
151 #endif