@@ -63,7 +63,7 @@ char* rplSymbolStorage_storeLibname(const char* libName)
6363 return libEntry->libName ;
6464}
6565
66- RPLStoredSymbol* rplSymbolStorage_store (const char * libName, const char * symbolName, MPTR address)
66+ RPLStoredSymbol* rplSymbolStorage_store (const char * libName, const char * symbolName, MPTR address, uint32 type )
6767{
6868 std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
6969 char * libNameStorage = rplSymbolStorage_storeLibname (libName);
@@ -72,15 +72,22 @@ RPLStoredSymbol* rplSymbolStorage_store(const char* libName, const char* symbolN
7272 storedSymbol->address = address;
7373 storedSymbol->libName = libNameStorage;
7474 storedSymbol->symbolName = symbolNameStorage;
75- storedSymbol->flags = 0 ;
75+ storedSymbol->flags = type;
76+ storedSymbol->previous = nullptr ;
77+ auto it = rplSymbolStorage.map_symbolByAddress .find (address);
78+ if (it != rplSymbolStorage.map_symbolByAddress .end ())
79+ storedSymbol->previous = it->second ;
7680 rplSymbolStorage.map_symbolByAddress [address] = storedSymbol;
7781 return storedSymbol;
7882}
7983
8084RPLStoredSymbol* rplSymbolStorage_getByAddress (MPTR address)
8185{
8286 std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
83- return rplSymbolStorage.map_symbolByAddress [address];
87+ auto it = rplSymbolStorage.map_symbolByAddress .find (address);
88+ if (it == rplSymbolStorage.map_symbolByAddress .end ())
89+ return nullptr ;
90+ return it->second ;
8491}
8592
8693RPLStoredSymbol* rplSymbolStorage_getByClosestAddress (MPTR address)
@@ -89,7 +96,8 @@ RPLStoredSymbol* rplSymbolStorage_getByClosestAddress(MPTR address)
8996 std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
9097 for (uint32 i=0 ; i<4096 ; i++)
9198 {
92- RPLStoredSymbol* symbol = rplSymbolStorage.map_symbolByAddress [address];
99+ auto it = rplSymbolStorage.map_symbolByAddress .find (address);
100+ RPLStoredSymbol* symbol = (it == rplSymbolStorage.map_symbolByAddress .end ()) ? nullptr : it->second ;
93101 if (symbol)
94102 return symbol;
95103 address -= 4 ;
@@ -100,18 +108,63 @@ RPLStoredSymbol* rplSymbolStorage_getByClosestAddress(MPTR address)
100108void rplSymbolStorage_remove (RPLStoredSymbol* storedSymbol)
101109{
102110 std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
103- if (rplSymbolStorage.map_symbolByAddress [storedSymbol->address ] == storedSymbol)
104- rplSymbolStorage.map_symbolByAddress [storedSymbol->address ] = nullptr ;
111+ auto it = rplSymbolStorage.map_symbolByAddress .find (storedSymbol->address );
112+ if (it != rplSymbolStorage.map_symbolByAddress .end ())
113+ {
114+ if (it->second == storedSymbol)
115+ {
116+ if (storedSymbol->previous )
117+ it->second = storedSymbol->previous ;
118+ else
119+ rplSymbolStorage.map_symbolByAddress .erase (it);
120+ }
121+ else
122+ {
123+ RPLStoredSymbol* parentSymbol = it->second ;
124+ while (parentSymbol && parentSymbol->previous != storedSymbol)
125+ parentSymbol = parentSymbol->previous ;
126+ if (parentSymbol)
127+ parentSymbol->previous = storedSymbol->previous ;
128+ }
129+ }
105130 delete storedSymbol;
106131}
107132
108- void rplSymbolStorage_removeRange (MPTR address, sint32 length)
133+
134+ void rplSymbolStorage_removeRange (MPTR address, sint32 length, uint32 type)
109135{
136+ std::unique_lock<std::mutex> lck (rplSymbolStorage.m_symbolStorageMutex );
110137 while (length > 0 )
111138 {
112- RPLStoredSymbol* symbol = rplSymbolStorage_getByAddress (address);
113- if (symbol)
114- rplSymbolStorage_remove (symbol);
139+ auto it = rplSymbolStorage.map_symbolByAddress .find (address);
140+ if (it != rplSymbolStorage.map_symbolByAddress .end ())
141+ {
142+ RPLStoredSymbol* current = it->second ;
143+ RPLStoredSymbol* newHead = current;
144+ RPLStoredSymbol* previousKept = nullptr ;
145+ while (current)
146+ {
147+ RPLStoredSymbol* next = current->previous ;
148+ if ((current->flags & type) == type)
149+ {
150+ if (previousKept)
151+ previousKept->previous = next;
152+ else
153+ newHead = next;
154+ delete current;
155+ }
156+ else
157+ {
158+ previousKept = current;
159+ }
160+ current = next;
161+ }
162+
163+ if (newHead)
164+ it->second = newHead;
165+ else
166+ rplSymbolStorage.map_symbolByAddress .erase (it);
167+ }
115168 address += 4 ;
116169 length -= 4 ;
117170 }
@@ -145,7 +198,15 @@ void rplSymbolStorage_unloadAll()
145198{
146199 // free symbols
147200 for (auto & it : rplSymbolStorage.map_symbolByAddress )
148- delete it.second ;
201+ {
202+ RPLStoredSymbol* symbol = it.second ;
203+ while (symbol)
204+ {
205+ RPLStoredSymbol* previous = symbol->previous ;
206+ delete symbol;
207+ symbol = previous;
208+ }
209+ }
149210 rplSymbolStorage.map_symbolByAddress .clear ();
150211 // free libs
151212 rplSymbolLib_t* lib = rplSymbolStorage.libs ;
0 commit comments