Fixes for StackwalkerAPI on BlueGene
[dyninst.git] / common / h / addrtranslate.h
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 #ifndef addrtranslate_h_
33 #define addrtranslate_h_
34
35 #include <string>
36 #include <vector>
37 #include <utility>
38
39 #include "common/h/Dictionary.h"
40 #include "common/h/Types.h"
41 #include "dynutil/h/dyntypes.h"
42 #include "dynutil/h/SymReader.h"
43 #include "dynutil/h/ProcReader.h"
44
45 using namespace std;
46
47 namespace Dyninst {
48
49 class LoadedLib {
50    friend class AddressTranslate;
51    friend class AddressTranslateSysV;
52  protected:
53    string name;
54    Address load_addr;
55    Address data_load_addr;
56    bool should_clean;
57    vector< pair<Address, unsigned long> > mapped_regions;
58    SymReader *symreader;
59    SymbolReaderFactory *symreader_factory;
60    void *up_ptr;
61
62  public:
63    COMMON_EXPORT LoadedLib(string name, Address load_addr);
64    COMMON_EXPORT virtual ~LoadedLib();
65    COMMON_EXPORT void add_mapped_region(Address addr, unsigned long size);
66    
67    COMMON_EXPORT string getName() const;
68    COMMON_EXPORT void setDataLoadAddr(Address a);
69    COMMON_EXPORT vector< pair<Address, unsigned long> > *getMappedRegions();
70
71    COMMON_EXPORT virtual Address offToAddress(Offset off);
72    COMMON_EXPORT virtual Offset addrToOffset(Address addr);
73
74    COMMON_EXPORT virtual Address getCodeLoadAddr() const;
75    COMMON_EXPORT virtual Address getDataLoadAddr() const;
76    COMMON_EXPORT virtual void getOutputs(string &filename, Address &code, Address &data);
77
78    COMMON_EXPORT void* getUpPtr();
79    COMMON_EXPORT void setUpPtr(void *v);
80
81    COMMON_EXPORT void setShouldClean(bool b);
82    COMMON_EXPORT bool shouldClean();
83
84    COMMON_EXPORT void setFactory(SymbolReaderFactory *factory);
85 };
86
87 struct LoadedLibCmp
88 {
89    COMMON_EXPORT bool operator()(const LoadedLib *a, const LoadedLib *b) const
90    {
91       if (a->getCodeLoadAddr() != b->getCodeLoadAddr()) 
92          return a->getCodeLoadAddr() < b->getCodeLoadAddr();
93       return (a->getName() < b->getName());
94    }
95 };
96
97 class AddressTranslate {
98  protected:
99    PID pid;
100    PROC_HANDLE phandle;
101    bool creation_error;
102
103    AddressTranslate(PID pid, PROC_HANDLE phand = INVALID_HANDLE_VALUE, std::string exename = std::string(""));
104    vector<LoadedLib *> libs;
105    std::string exec_name;
106    LoadedLib *exec;
107    SymbolReaderFactory *symfactory;
108    bool read_abort;
109  public:
110
111    COMMON_EXPORT static AddressTranslate *createAddressTranslator(PID pid_,
112                                          ProcessReader *reader_ = NULL,
113                                          SymbolReaderFactory *symfactory_ = NULL,
114                                          PROC_HANDLE phand = INVALID_HANDLE_VALUE,
115                                          std::string exename = std::string(""));
116    COMMON_EXPORT static AddressTranslate *createAddressTranslator(ProcessReader *reader_ = NULL,
117                                          SymbolReaderFactory *symfactory_ = NULL,
118                                          std::string exename = std::string(""));
119    
120    COMMON_EXPORT virtual bool refresh() = 0;
121    COMMON_EXPORT virtual ~AddressTranslate();
122   
123    COMMON_EXPORT PID getPid();
124    COMMON_EXPORT bool getLibAtAddress(Address addr, LoadedLib* &lib);
125    COMMON_EXPORT bool getLibs(vector<LoadedLib *> &libs_);
126    COMMON_EXPORT bool getArchLibs(vector<LoadedLib *> &olibs);
127    COMMON_EXPORT LoadedLib *getLoadedLib(std::string name);
128    COMMON_EXPORT LoadedLib *getLoadedLib(SymReader *sym);
129    COMMON_EXPORT LoadedLib *getExecutable();
130
131    COMMON_EXPORT virtual Address getLibraryTrapAddrSysV();
132    
133    void setReadAbort(bool b);
134 };
135
136 }
137
138 extern int translate_printf(const char *format, ...);
139
140
141 #endif