windows build fixes and some more work on symtab serialization
[dyninst.git] / symtabAPI / h / Region.h
1 /*
2  * Copyright (c) 1996-2007 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_OTHER
80    };
81
82    static const char *regionType2Str(RegionType);
83
84    SYMTAB_EXPORT Region();
85    SYMTAB_EXPORT static bool createRegion( Offset diskOff, perm_t perms, RegionType regType,
86          unsigned long diskSize = 0, Offset memOff = 0, unsigned long memSize = 0,
87          std::string name = "", char *rawDataPtr = NULL);
88    SYMTAB_EXPORT Region(const Region &reg);
89    SYMTAB_EXPORT Region& operator=(const Region &reg);
90    SYMTAB_EXPORT std::ostream& operator<< (std::ostream &os);
91    SYMTAB_EXPORT bool operator== (const Region &reg);
92
93    SYMTAB_EXPORT ~Region();
94
95    SYMTAB_EXPORT unsigned getRegionNumber() const;
96    SYMTAB_EXPORT bool setRegionNumber(unsigned regnumber);
97    SYMTAB_EXPORT std::string getRegionName() const;
98
99    //  getRegionAddr returns diskOffset on unixes, memory offset on windows
100    SYMTAB_EXPORT Offset getRegionAddr() const;
101    SYMTAB_EXPORT unsigned long getRegionSize() const;
102
103    SYMTAB_EXPORT Offset getDiskOffset() const;
104    SYMTAB_EXPORT unsigned long getDiskSize() const;
105    SYMTAB_EXPORT Offset getMemOffset() const;
106    SYMTAB_EXPORT unsigned long getMemSize() const;
107    SYMTAB_EXPORT void *getPtrToRawData() const;
108    SYMTAB_EXPORT bool setPtrToRawData(void *, unsigned long); 
109
110    SYMTAB_EXPORT bool isBSS() const;
111    SYMTAB_EXPORT bool isText() const;
112    SYMTAB_EXPORT bool isData() const;
113    SYMTAB_EXPORT bool isOffsetInRegion(const Offset &offset) const;
114    SYMTAB_EXPORT bool isLoadable() const;
115    SYMTAB_EXPORT bool setLoadable(bool isLoadable);
116    SYMTAB_EXPORT bool isDirty() const;
117    SYMTAB_EXPORT std::vector<relocationEntry> &getRelocations();
118    SYMTAB_EXPORT bool patchData(Offset off, void *buf, unsigned size);
119
120    SYMTAB_EXPORT perm_t getRegionPermissions() const;
121    SYMTAB_EXPORT bool setRegionPermissions(perm_t newPerms);
122    SYMTAB_EXPORT RegionType getRegionType() const;
123
124    SYMTAB_EXPORT bool addRelocationEntry(Offset relocationAddr, Symbol *dynref, unsigned long relType, Region::RegionType rtype = Region::RT_REL);
125
126    SYMTAB_EXPORT 
127            void serialize(SerializerBase *sb, const char *tag = "Region") THROW_SPEC (SerializerError);
128    protected:                     
129    SYMTAB_EXPORT Region(unsigned regnum, std::string name, Offset diskOff,
130          unsigned long diskSize, Offset memOff, unsigned long memSize,
131          char *rawDataPtr, perm_t perms, RegionType regType, bool isLoadable = false);
132    private:
133    unsigned regNum_;
134    std::string name_;
135    Offset diskOff_;
136    unsigned long diskSize_;
137    Offset memOff_;
138    unsigned long memSize_;
139    void *rawDataPtr_;
140    perm_t permissions_;
141    RegionType rType_;
142    bool isDirty_;
143    std::vector<relocationEntry> rels_;
144    char *buffer_;  //To hold dirty data
145    bool isLoadable_;
146 };
147
148 }//namespace SymtabAPI
149
150 }//namespace Dyninst
151 #endif