Update copyright to LGPL on all files
[dyninst.git] / symtabAPI / h / Region.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 __REGION__H__ 
33 #define __REGION__H__
34 #include "symutil.h"
35 #include "Serialization.h"
36 #include "Annotatable.h"
37
38 namespace Dyninst{
39 namespace SymtabAPI{
40
41 class Symbol;
42 class relocationEntry;
43
44
45
46 class Region : public Serializable, public AnnotatableSparse {
47    friend class Object;
48    friend class Symtab;
49    friend class SymtabTranslatorBase;
50    friend class SymtabTranslatorBin;
51
52    public:  
53
54    enum perm_t
55    {
56       RP_R, 
57       RP_RW, 
58       RP_RX, 
59       RP_RWX
60    };
61
62    static const char *permissions2Str(perm_t);
63
64    enum RegionType 
65    {
66       RT_TEXT,
67       RT_DATA,
68       RT_TEXTDATA,
69       RT_SYMTAB,
70       RT_STRTAB,
71       RT_BSS,
72       RT_SYMVERSIONS,
73       RT_SYMVERDEF,
74       RT_SYMVERNEEDED,
75       RT_REL,
76       RT_RELA,
77       RT_DYNAMIC,
78       RT_HASH,
79       RT_GNU_HASH,
80       RT_OTHER
81    };
82
83    static const char *regionType2Str(RegionType);
84
85    SYMTAB_EXPORT Region();
86    SYMTAB_EXPORT static bool createRegion( Offset diskOff, perm_t perms, RegionType regType,
87          unsigned long diskSize = 0, Offset memOff = 0, unsigned long memSize = 0,
88          std::string name = "", char *rawDataPtr = NULL);
89    SYMTAB_EXPORT Region(const Region &reg);
90    SYMTAB_EXPORT Region& operator=(const Region &reg);
91    SYMTAB_EXPORT std::ostream& operator<< (std::ostream &os);
92    SYMTAB_EXPORT bool operator== (const Region &reg);
93
94    SYMTAB_EXPORT ~Region();
95
96    SYMTAB_EXPORT unsigned getRegionNumber() const;
97    SYMTAB_EXPORT bool setRegionNumber(unsigned regnumber);
98    SYMTAB_EXPORT std::string getRegionName() const;
99
100    //  getRegionAddr returns diskOffset on unixes, memory offset on windows
101    SYMTAB_EXPORT Offset getRegionAddr() const;
102    SYMTAB_EXPORT unsigned long getRegionSize() const;
103
104    SYMTAB_EXPORT Offset getDiskOffset() const;
105    SYMTAB_EXPORT unsigned long getDiskSize() const;
106    SYMTAB_EXPORT Offset getMemOffset() const;
107    SYMTAB_EXPORT unsigned long getMemSize() const;
108    SYMTAB_EXPORT void *getPtrToRawData() const;
109    SYMTAB_EXPORT bool setPtrToRawData(void *, unsigned long); 
110
111    SYMTAB_EXPORT bool isBSS() const;
112    SYMTAB_EXPORT bool isText() const;
113    SYMTAB_EXPORT bool isData() const;
114    SYMTAB_EXPORT bool isOffsetInRegion(const Offset &offset) const;
115    SYMTAB_EXPORT bool isLoadable() const;
116    SYMTAB_EXPORT bool setLoadable(bool isLoadable);
117    SYMTAB_EXPORT bool isDirty() const;
118    SYMTAB_EXPORT std::vector<relocationEntry> &getRelocations();
119    SYMTAB_EXPORT bool patchData(Offset off, void *buf, unsigned size);
120
121    SYMTAB_EXPORT perm_t getRegionPermissions() const;
122    SYMTAB_EXPORT bool setRegionPermissions(perm_t newPerms);
123    SYMTAB_EXPORT RegionType getRegionType() const;
124
125    SYMTAB_EXPORT bool addRelocationEntry(Offset relocationAddr, Symbol *dynref, unsigned long relType, Region::RegionType rtype = Region::RT_REL);
126
127    SYMTAB_EXPORT Serializable * serialize_impl(SerializerBase *sb, 
128                    const char *tag = "Region") THROW_SPEC (SerializerError);
129
130    protected:                     
131    SYMTAB_EXPORT Region(unsigned regnum, std::string name, Offset diskOff,
132          unsigned long diskSize, Offset memOff, unsigned long memSize,
133          char *rawDataPtr, perm_t perms, RegionType regType, bool isLoadable = false);
134    private:
135    unsigned regNum_;
136    std::string name_;
137    Offset diskOff_;
138    unsigned long diskSize_;
139    Offset memOff_;
140    unsigned long memSize_;
141    void *rawDataPtr_;
142    perm_t permissions_;
143    RegionType rType_;
144    bool isDirty_;
145    std::vector<relocationEntry> rels_;
146    char *buffer_;  //To hold dirty data
147    bool isLoadable_;
148 };
149
150 }//namespace SymtabAPI
151
152 }//namespace Dyninst
153 #endif