Update copyright to LGPL on all files
[dyninst.git] / symtabAPI / src / addrtranslate.C
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #include "addrtranslate.h"
33
34 using namespace Dyninst;
35 using namespace SymtabAPI;
36 using namespace std;
37
38 AddressTranslate::AddressTranslate(PID pid_, PROC_HANDLE phand) :
39    pid(pid_),
40    phandle(phand),
41    creation_error(false),
42    exec(NULL)
43 {
44 }
45
46 bool AddressTranslate::getLibAtAddress(Address addr, LoadedLib* &lib)
47 {
48    for (unsigned i=0; i<libs.size(); i++)
49    {
50       LoadedLib *l = libs[i];
51       if (!l)
52          continue;
53       vector<pair<Address, unsigned long> > *addresses = l->getMappedRegions();
54       if (!addresses)
55          continue;
56       for (unsigned j = 0; j<addresses->size(); j++) {
57          if (addr >= (*addresses)[j].first && 
58              addr < (*addresses)[j].first + (*addresses)[j].second)
59          {
60             lib = l;
61             return true;
62          }
63       }
64    }
65    return false;
66 }
67
68 bool AddressTranslate::getLibs(vector<LoadedLib *> &libs_)
69 {
70    libs_.clear();
71    for (unsigned i=0; i<libs.size(); i++)
72       libs_.push_back(libs[i]);
73    return true;
74 }
75
76 PID AddressTranslate::getPid()
77 {
78    return pid;
79 }
80
81 LoadedLib *AddressTranslate::getLoadedLib(std::string name)
82 {
83    for (unsigned i=0; i<libs.size(); i++)
84    {
85       if (libs[i]->getName() == name)
86       {
87          return libs[i];
88       }
89    }
90    return NULL;
91 }
92
93 LoadedLib *AddressTranslate::getLoadedLib(Symtab *sym)
94 {
95    for (unsigned i=0; i<libs.size(); i++)
96    {
97       if (libs[i]->symtable == sym)
98       {
99          return libs[i];
100       }
101    }
102    return getLoadedLib(sym->file());
103 }
104
105 AddressTranslate::~AddressTranslate()
106 {
107 }
108
109 LoadedLib *AddressTranslate::getExecutable()
110 {
111    return exec;
112 }
113
114 string LoadedLib::getName() const {
115    return name;
116 }
117
118 void LoadedLib::add_mapped_region(Address addr, unsigned long size)
119 {
120    mapped_regions.push_back(pair<Address, unsigned long>(addr, size));   
121 }
122
123 LoadedLib::LoadedLib(string n, Address la) :
124    name(n),
125    load_addr(la),
126    data_load_addr(0),
127    symtable(NULL)
128 {
129 }
130
131 LoadedLib::~LoadedLib()
132 {
133 }
134
135 void LoadedLib::setDataLoadAddr(Address a)
136 {
137    data_load_addr = a;
138 }
139
140 Address LoadedLib::symToAddress(Symbol *sym)
141 {
142    return sym->getAddr() + getCodeLoadAddr();
143 }
144
145 Address LoadedLib::offToAddress(Offset off)
146 {
147    return off + getCodeLoadAddr();
148 }
149
150 Offset LoadedLib::addrToOffset(Address addr)
151 {
152    return addr - getCodeLoadAddr();
153 }
154
155 Address LoadedLib::getCodeLoadAddr()
156 {
157    return load_addr;
158 }
159
160 Address LoadedLib::getDataLoadAddr()
161 {
162    return data_load_addr;
163 }
164
165 void LoadedLib::getOutputs(string &filename, Address &code, Address &data)
166 {
167    filename = name;
168    code = load_addr;
169    data = 0;
170 }
171
172 //#if !defined(os_linux) && !defined(os_solaris)
173 //This definition is for all the non-System V systems
174 Address AddressTranslate::getLibraryTrapAddrSysV()
175 {
176    return 0x0;
177 }
178 //#endif