Update copyright to LGPL on all files
[dyninst.git] / symtabAPI / src / Archive.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
33 #include "symtabAPI/h/Symtab.h"
34 #include "symtabAPI/h/Archive.h"
35 #include "symtabAPI/src/Object.h"
36
37 using namespace Dyninst;
38 using namespace Dyninst::SymtabAPI;
39
40 extern char errorLine[];
41
42 static SymtabError serr;
43 static std::string errMsg;
44
45 std::vector<Archive *> Archive::allArchives;
46
47 bool Archive::openArchive(Archive *&img, std::string filename)
48 {
49         bool ok = false;
50         for (unsigned i=0;i<allArchives.size();i++)
51         {
52       if (allArchives[i]->mf->pathname() == filename)
53       {
54                 img = allArchives[i];
55          return true;
56       }
57         }
58
59         img = new Archive(filename ,ok);
60         if (ok) // No errors
61                 allArchives.push_back(img);     
62         else {
63       //fprintf(stderr, "%s[%d]:  error opening archive for %s\n", 
64       //      FILE__, __LINE__, filename.c_str());
65       if (img)
66          delete img;
67                 img = NULL;
68    }
69         return ok;
70 }
71
72 #if 0 
73 bool Archive::openArchive(Archive *&img, char *mem_image, size_t size)
74 {
75         bool err;
76         img = new Archive(mem_image, size, err);
77         if(err == false)
78                 img = NULL;
79         return err;
80 }
81 #endif
82
83 bool Archive::getMember(Symtab *&img, std::string member_name)
84 {
85    if (membersByName.find(member_name) == membersByName.end())
86    {
87       serr = No_Such_Member;
88       errMsg = "Member Does not exist";
89       return false;
90    }    
91
92    img = membersByName[member_name];
93    if (img == NULL) {
94       bool err;
95       if (mf->getFD() == -1) {
96           img = new Symtab((char *)mf->base_addr(),mf->size(), 
97                 member_name, memberToOffsetMapping[member_name], err, basePtr);
98       }
99       else {
100          if (!mf) {
101             fprintf(stderr, "%s[%d]:  ERROR: mf has not been set\n", FILE__, __LINE__);
102             return false;
103          }
104          std::string pname = mf->pathname();
105          if (pname.length()) {
106             img = new Symtab(std::string(pname),member_name, memberToOffsetMapping[member_name], 
107                   err, basePtr);
108          }
109          else {
110             fprintf(stderr, "%s[%d]:  WARNING:  got mapped file with non existant path name\n", FILE__, __LINE__);
111             img = new Symtab(std::string(""),member_name, memberToOffsetMapping[member_name], 
112                   err, basePtr);
113          }
114       }
115       membersByName[member_name] = img;
116    }
117    return true;
118 }
119
120 bool Archive::getAllMembers(std::vector <Symtab *> &members)
121 {
122    dyn_hash_map <std::string, Symtab *>::iterator iter = membersByName.begin();
123    for (; iter!=membersByName.end();iter++) {
124       if (iter->second == NULL) {
125          bool err;
126          string member_name = iter->first;
127          if (mf->getFD() == -1)
128              iter->second = new Symtab((char *)mf->base_addr(), mf->size(), member_name, 
129                    memberToOffsetMapping[iter->first], err, basePtr);
130          else
131              iter->second = new Symtab(mf->pathname(), member_name, memberToOffsetMapping[iter->first], 
132                    err, basePtr);
133       }
134       members.push_back(iter->second);
135    }
136    return true; 
137 }
138
139 bool Archive::isMemberInArchive(std::string member_name)
140 {
141    if(membersByName.find(member_name) != membersByName.end())
142       return true;
143    return false;
144 }
145
146 bool Archive::findMemberWithDefinition(Symtab *&obj, std::string name){
147     vector<Symtab *>members;
148     getAllMembers(members);
149
150     for(unsigned i=0; i<members.size();i++){
151         vector<Symbol *>syms;
152         if(members[i]->findSymbolByType(syms, name, Symbol::ST_UNKNOWN, true)){
153             obj = members[i];
154             return true;
155         }
156     }
157     return false;
158 }