Lines 227-288
void TypeSystemMap::ForEach(std::function<bool(TypeSystem *)> const &callback) {
Link Here
|
227 |
llvm::Expected<TypeSystem &> |
227 |
llvm::Expected<TypeSystem &> |
228 |
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, |
228 |
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, |
229 |
Module *module, bool can_create) { |
229 |
Module *module, bool can_create) { |
230 |
llvm::Error error = llvm::Error::success(); |
|
|
231 |
assert(!error); // Check the success value when assertions are enabled |
232 |
std::lock_guard<std::mutex> guard(m_mutex); |
230 |
std::lock_guard<std::mutex> guard(m_mutex); |
233 |
if (m_clear_in_progress) { |
231 |
if (m_clear_in_progress) |
234 |
error = llvm::make_error<llvm::StringError>( |
232 |
return llvm::make_error<llvm::StringError>( |
235 |
"Unable to get TypeSystem because TypeSystemMap is being cleared", |
233 |
"Unable to get TypeSystem because TypeSystemMap is being cleared", |
236 |
llvm::inconvertibleErrorCode()); |
234 |
llvm::inconvertibleErrorCode()); |
237 |
} else { |
|
|
238 |
collection::iterator pos = m_map.find(language); |
239 |
if (pos != m_map.end()) { |
240 |
auto *type_system = pos->second.get(); |
241 |
if (type_system) { |
242 |
llvm::consumeError(std::move(error)); |
243 |
return *type_system; |
244 |
} |
245 |
error = llvm::make_error<llvm::StringError>( |
246 |
"TypeSystem for language " + |
247 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
248 |
" doesn't exist", |
249 |
llvm::inconvertibleErrorCode()); |
250 |
return std::move(error); |
251 |
} |
252 |
|
235 |
|
253 |
for (const auto &pair : m_map) { |
236 |
collection::iterator pos = m_map.find(language); |
254 |
if (pair.second && pair.second->SupportsLanguage(language)) { |
237 |
if (pos != m_map.end()) { |
255 |
// Add a new mapping for "language" to point to an already existing |
238 |
auto *type_system = pos->second.get(); |
256 |
// TypeSystem that supports this language |
239 |
if (type_system) |
257 |
m_map[language] = pair.second; |
240 |
return *type_system; |
258 |
if (pair.second.get()) { |
241 |
return llvm::make_error<llvm::StringError>( |
259 |
llvm::consumeError(std::move(error)); |
242 |
"TypeSystem for language " + |
260 |
return *pair.second.get(); |
243 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
261 |
} |
244 |
" doesn't exist", |
262 |
error = llvm::make_error<llvm::StringError>( |
245 |
llvm::inconvertibleErrorCode()); |
263 |
"TypeSystem for language " + |
246 |
} |
264 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
|
|
265 |
" doesn't exist", |
266 |
llvm::inconvertibleErrorCode()); |
267 |
return std::move(error); |
268 |
} |
269 |
} |
270 |
|
247 |
|
271 |
if (!can_create) { |
248 |
for (const auto &pair : m_map) { |
272 |
error = llvm::make_error<llvm::StringError>( |
249 |
if (pair.second && pair.second->SupportsLanguage(language)) { |
273 |
"Unable to find type system for language " + |
250 |
// Add a new mapping for "language" to point to an already existing |
274 |
llvm::StringRef(Language::GetNameForLanguageType(language)), |
251 |
// TypeSystem that supports this language |
275 |
llvm::inconvertibleErrorCode()); |
252 |
m_map[language] = pair.second; |
276 |
} else { |
253 |
if (pair.second.get()) |
277 |
// Cache even if we get a shared pointer that contains a null type system |
254 |
return *pair.second.get(); |
278 |
// back |
255 |
return llvm::make_error<llvm::StringError>( |
279 |
auto type_system_sp = TypeSystem::CreateInstance(language, module); |
|
|
280 |
m_map[language] = type_system_sp; |
281 |
if (type_system_sp.get()) { |
282 |
llvm::consumeError(std::move(error)); |
283 |
return *type_system_sp.get(); |
284 |
} |
285 |
error = llvm::make_error<llvm::StringError>( |
286 |
"TypeSystem for language " + |
256 |
"TypeSystem for language " + |
287 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
257 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
288 |
" doesn't exist", |
258 |
" doesn't exist", |
Lines 290-357
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
Link Here
|
290 |
} |
260 |
} |
291 |
} |
261 |
} |
292 |
|
262 |
|
293 |
return std::move(error); |
263 |
if (!can_create) |
|
|
264 |
return llvm::make_error<llvm::StringError>( |
265 |
"Unable to find type system for language " + |
266 |
llvm::StringRef(Language::GetNameForLanguageType(language)), |
267 |
llvm::inconvertibleErrorCode()); |
268 |
|
269 |
// Cache even if we get a shared pointer that contains a null type system |
270 |
// back |
271 |
auto type_system_sp = TypeSystem::CreateInstance(language, module); |
272 |
m_map[language] = type_system_sp; |
273 |
if (type_system_sp.get()) |
274 |
return *type_system_sp.get(); |
275 |
return llvm::make_error<llvm::StringError>( |
276 |
"TypeSystem for language " + |
277 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
278 |
" doesn't exist", |
279 |
llvm::inconvertibleErrorCode()); |
294 |
} |
280 |
} |
295 |
|
281 |
|
296 |
llvm::Expected<TypeSystem &> |
282 |
llvm::Expected<TypeSystem &> |
297 |
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, |
283 |
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, |
298 |
Target *target, bool can_create) { |
284 |
Target *target, bool can_create) { |
299 |
llvm::Error error = llvm::Error::success(); |
|
|
300 |
assert(!error); // Check the success value when assertions are enabled |
301 |
std::lock_guard<std::mutex> guard(m_mutex); |
285 |
std::lock_guard<std::mutex> guard(m_mutex); |
302 |
if (m_clear_in_progress) { |
286 |
if (m_clear_in_progress) |
303 |
error = llvm::make_error<llvm::StringError>( |
287 |
return llvm::make_error<llvm::StringError>( |
304 |
"Unable to get TypeSystem because TypeSystemMap is being cleared", |
288 |
"Unable to get TypeSystem because TypeSystemMap is being cleared", |
305 |
llvm::inconvertibleErrorCode()); |
289 |
llvm::inconvertibleErrorCode()); |
306 |
} else { |
|
|
307 |
collection::iterator pos = m_map.find(language); |
308 |
if (pos != m_map.end()) { |
309 |
auto *type_system = pos->second.get(); |
310 |
if (type_system) { |
311 |
llvm::consumeError(std::move(error)); |
312 |
return *type_system; |
313 |
} |
314 |
error = llvm::make_error<llvm::StringError>( |
315 |
"TypeSystem for language " + |
316 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
317 |
" doesn't exist", |
318 |
llvm::inconvertibleErrorCode()); |
319 |
return std::move(error); |
320 |
} |
321 |
|
290 |
|
322 |
for (const auto &pair : m_map) { |
291 |
collection::iterator pos = m_map.find(language); |
323 |
if (pair.second && pair.second->SupportsLanguage(language)) { |
292 |
if (pos != m_map.end()) { |
324 |
// Add a new mapping for "language" to point to an already existing |
293 |
auto *type_system = pos->second.get(); |
325 |
// TypeSystem that supports this language |
294 |
if (type_system) |
326 |
m_map[language] = pair.second; |
295 |
return *type_system; |
327 |
if (pair.second.get()) { |
296 |
return llvm::make_error<llvm::StringError>( |
328 |
llvm::consumeError(std::move(error)); |
297 |
"TypeSystem for language " + |
329 |
return *pair.second.get(); |
298 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
330 |
} |
299 |
" doesn't exist", |
331 |
error = llvm::make_error<llvm::StringError>( |
300 |
llvm::inconvertibleErrorCode()); |
332 |
"TypeSystem for language " + |
301 |
} |
333 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
|
|
334 |
" doesn't exist", |
335 |
llvm::inconvertibleErrorCode()); |
336 |
return std::move(error); |
337 |
} |
338 |
} |
339 |
|
302 |
|
340 |
if (!can_create) { |
303 |
for (const auto &pair : m_map) { |
341 |
error = llvm::make_error<llvm::StringError>( |
304 |
if (pair.second && pair.second->SupportsLanguage(language)) { |
342 |
"Unable to find type system for language " + |
305 |
// Add a new mapping for "language" to point to an already existing |
343 |
llvm::StringRef(Language::GetNameForLanguageType(language)), |
306 |
// TypeSystem that supports this language |
344 |
llvm::inconvertibleErrorCode()); |
307 |
m_map[language] = pair.second; |
345 |
} else { |
308 |
if (pair.second.get()) |
346 |
// Cache even if we get a shared pointer that contains a null type system |
309 |
return *pair.second.get(); |
347 |
// back |
310 |
return llvm::make_error<llvm::StringError>( |
348 |
auto type_system_sp = TypeSystem::CreateInstance(language, target); |
|
|
349 |
m_map[language] = type_system_sp; |
350 |
if (type_system_sp.get()) { |
351 |
llvm::consumeError(std::move(error)); |
352 |
return *type_system_sp.get(); |
353 |
} |
354 |
error = llvm::make_error<llvm::StringError>( |
355 |
"TypeSystem for language " + |
311 |
"TypeSystem for language " + |
356 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
312 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
357 |
" doesn't exist", |
313 |
" doesn't exist", |
Lines 359-363
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
Link Here
|
359 |
} |
315 |
} |
360 |
} |
316 |
} |
361 |
|
317 |
|
362 |
return std::move(error); |
318 |
if (!can_create) |
|
|
319 |
return llvm::make_error<llvm::StringError>( |
320 |
"Unable to find type system for language " + |
321 |
llvm::StringRef(Language::GetNameForLanguageType(language)), |
322 |
llvm::inconvertibleErrorCode()); |
323 |
|
324 |
// Cache even if we get a shared pointer that contains a null type system |
325 |
// back |
326 |
auto type_system_sp = TypeSystem::CreateInstance(language, target); |
327 |
m_map[language] = type_system_sp; |
328 |
if (type_system_sp.get()) |
329 |
return *type_system_sp.get(); |
330 |
return llvm::make_error<llvm::StringError>( |
331 |
"TypeSystem for language " + |
332 |
llvm::StringRef(Language::GetNameForLanguageType(language)) + |
333 |
" doesn't exist", |
334 |
llvm::inconvertibleErrorCode()); |
363 |
} |
335 |
} |