180814287SRaphael Isemann //===-- CompileUnit.cpp ---------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner
930fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
1030fdc8d8SChris Lattner #include "lldb/Core/Module.h"
111f746071SGreg Clayton #include "lldb/Symbol/LineTable.h"
12465eae36SPavel Labath #include "lldb/Symbol/SymbolFile.h"
1330fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
140e0984eeSJim Ingham #include "lldb/Target/Language.h"
1591e94a70Sshafik #include "lldb/Utility/Timer.h"
1630fdc8d8SChris Lattner
1730fdc8d8SChris Lattner using namespace lldb;
1830fdc8d8SChris Lattner using namespace lldb_private;
1930fdc8d8SChris Lattner
CompileUnit(const lldb::ModuleSP & module_sp,void * user_data,const char * pathname,const lldb::user_id_t cu_sym_id,lldb::LanguageType language,lldb_private::LazyBool is_optimized)20b9c1b51eSKate Stone CompileUnit::CompileUnit(const lldb::ModuleSP &module_sp, void *user_data,
21b9c1b51eSKate Stone const char *pathname, const lldb::user_id_t cu_sym_id,
22b9c1b51eSKate Stone lldb::LanguageType language,
23ad2b63cbSGreg Clayton lldb_private::LazyBool is_optimized)
2438870af8SPavel Labath : CompileUnit(module_sp, user_data, FileSpec(pathname), cu_sym_id, language,
2538870af8SPavel Labath is_optimized) {}
2630fdc8d8SChris Lattner
CompileUnit(const lldb::ModuleSP & module_sp,void * user_data,const FileSpec & fspec,const lldb::user_id_t cu_sym_id,lldb::LanguageType language,lldb_private::LazyBool is_optimized)27b9c1b51eSKate Stone CompileUnit::CompileUnit(const lldb::ModuleSP &module_sp, void *user_data,
28b9c1b51eSKate Stone const FileSpec &fspec, const lldb::user_id_t cu_sym_id,
29b9c1b51eSKate Stone lldb::LanguageType language,
30ad2b63cbSGreg Clayton lldb_private::LazyBool is_optimized)
3138870af8SPavel Labath : ModuleChild(module_sp), UserID(cu_sym_id), m_user_data(user_data),
3238870af8SPavel Labath m_language(language), m_flags(0), m_file_spec(fspec),
33b9c1b51eSKate Stone m_is_optimized(is_optimized) {
341f746071SGreg Clayton if (language != eLanguageTypeUnknown)
351f746071SGreg Clayton m_flags.Set(flagsParsedLanguage);
36e72dfb32SGreg Clayton assert(module_sp);
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner
CalculateSymbolContext(SymbolContext * sc)39b9c1b51eSKate Stone void CompileUnit::CalculateSymbolContext(SymbolContext *sc) {
4030fdc8d8SChris Lattner sc->comp_unit = this;
4130fdc8d8SChris Lattner GetModule()->CalculateSymbolContext(sc);
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner
CalculateSymbolContextModule()44b9c1b51eSKate Stone ModuleSP CompileUnit::CalculateSymbolContextModule() { return GetModule(); }
457e9b1fd0SGreg Clayton
CalculateSymbolContextCompileUnit()46b9c1b51eSKate Stone CompileUnit *CompileUnit::CalculateSymbolContextCompileUnit() { return this; }
477e9b1fd0SGreg Clayton
DumpSymbolContext(Stream * s)48b9c1b51eSKate Stone void CompileUnit::DumpSymbolContext(Stream *s) {
4930fdc8d8SChris Lattner GetModule()->DumpSymbolContext(s);
50d01b2953SDaniel Malea s->Printf(", CompileUnit{0x%8.8" PRIx64 "}", GetID());
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner
GetDescription(Stream * s,lldb::DescriptionLevel level) const53b9c1b51eSKate Stone void CompileUnit::GetDescription(Stream *s,
54b9c1b51eSKate Stone lldb::DescriptionLevel level) const {
55fb09f365SEric Leese const char *language = GetCachedLanguage();
56b9c1b51eSKate Stone *s << "id = " << (const UserID &)*this << ", file = \""
5738870af8SPavel Labath << this->GetPrimaryFile() << "\", language = \"" << language << '"';
580c5cd90dSGreg Clayton }
590c5cd90dSGreg Clayton
ForeachFunction(llvm::function_ref<bool (const FunctionSP &)> lambda) const60a7f19e5fSRaphael Isemann void CompileUnit::ForeachFunction(
61a7f19e5fSRaphael Isemann llvm::function_ref<bool(const FunctionSP &)> lambda) const {
62a7f19e5fSRaphael Isemann std::vector<lldb::FunctionSP> sorted_functions;
63a7f19e5fSRaphael Isemann sorted_functions.reserve(m_functions_by_uid.size());
64a7f19e5fSRaphael Isemann for (auto &p : m_functions_by_uid)
65a7f19e5fSRaphael Isemann sorted_functions.push_back(p.second);
66*cd9a5cfdSDmitri Gribenko llvm::sort(sorted_functions,
67a7f19e5fSRaphael Isemann [](const lldb::FunctionSP &a, const lldb::FunctionSP &b) {
68a7f19e5fSRaphael Isemann return a->GetID() < b->GetID();
69a7f19e5fSRaphael Isemann });
70a7f19e5fSRaphael Isemann
71a7f19e5fSRaphael Isemann for (auto &f : sorted_functions)
72a7f19e5fSRaphael Isemann if (lambda(f))
73a7f19e5fSRaphael Isemann return;
74a7f19e5fSRaphael Isemann }
75a7f19e5fSRaphael Isemann
FindFunction(llvm::function_ref<bool (const FunctionSP &)> matching_lambda)7691e94a70Sshafik lldb::FunctionSP CompileUnit::FindFunction(
7791e94a70Sshafik llvm::function_ref<bool(const FunctionSP &)> matching_lambda) {
785c1c8443SJonas Devlieghere LLDB_SCOPED_TIMER();
7991e94a70Sshafik
8091e94a70Sshafik lldb::ModuleSP module = CalculateSymbolContextModule();
8191e94a70Sshafik
8291e94a70Sshafik if (!module)
8391e94a70Sshafik return {};
8491e94a70Sshafik
8591e94a70Sshafik SymbolFile *symbol_file = module->GetSymbolFile();
8691e94a70Sshafik
8791e94a70Sshafik if (!symbol_file)
8891e94a70Sshafik return {};
8991e94a70Sshafik
9091e94a70Sshafik // m_functions_by_uid is filled in lazily but we need all the entries.
9191e94a70Sshafik symbol_file->ParseFunctions(*this);
9291e94a70Sshafik
9391e94a70Sshafik for (auto &p : m_functions_by_uid) {
9491e94a70Sshafik if (matching_lambda(p.second))
9591e94a70Sshafik return p.second;
9691e94a70Sshafik }
9791e94a70Sshafik return {};
9891e94a70Sshafik }
9991e94a70Sshafik
GetCachedLanguage() const100fb09f365SEric Leese const char *CompileUnit::GetCachedLanguage() const {
101fb09f365SEric Leese if (m_flags.IsClear(flagsParsedLanguage))
102fb09f365SEric Leese return "<not loaded>";
103fb09f365SEric Leese return Language::GetNameForLanguageType(m_language);
104fb09f365SEric Leese }
105fb09f365SEric Leese
10605097246SAdrian Prantl // Dump the current contents of this object. No functions that cause on demand
10705097246SAdrian Prantl // parsing of functions, globals, statics are called, so this is a good
10805097246SAdrian Prantl // function to call to get an idea of the current contents of the CompileUnit
10905097246SAdrian Prantl // object.
Dump(Stream * s,bool show_context) const110b9c1b51eSKate Stone void CompileUnit::Dump(Stream *s, bool show_context) const {
111fb09f365SEric Leese const char *language = GetCachedLanguage();
112db3d58b9SEnrico Granata
113324a1036SSaleem Abdulrasool s->Printf("%p: ", static_cast<const void *>(this));
11430fdc8d8SChris Lattner s->Indent();
115b9c1b51eSKate Stone *s << "CompileUnit" << static_cast<const UserID &>(*this) << ", language = \""
11638870af8SPavel Labath << language << "\", file = '" << GetPrimaryFile() << "'\n";
11730fdc8d8SChris Lattner
11830fdc8d8SChris Lattner // m_types.Dump(s);
11930fdc8d8SChris Lattner
120b9c1b51eSKate Stone if (m_variables.get()) {
12130fdc8d8SChris Lattner s->IndentMore();
12230fdc8d8SChris Lattner m_variables->Dump(s, show_context);
12330fdc8d8SChris Lattner s->IndentLess();
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner
126a7f19e5fSRaphael Isemann if (!m_functions_by_uid.empty()) {
12730fdc8d8SChris Lattner s->IndentMore();
128a7f19e5fSRaphael Isemann ForeachFunction([&s, show_context](const FunctionSP &f) {
129a7f19e5fSRaphael Isemann f->Dump(s, show_context);
130a7f19e5fSRaphael Isemann return false;
131a7f19e5fSRaphael Isemann });
13230fdc8d8SChris Lattner
13330fdc8d8SChris Lattner s->IndentLess();
13430fdc8d8SChris Lattner s->EOL();
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner }
13730fdc8d8SChris Lattner
13830fdc8d8SChris Lattner // Add a function to this compile unit
AddFunction(FunctionSP & funcSP)139b9c1b51eSKate Stone void CompileUnit::AddFunction(FunctionSP &funcSP) {
140a7f19e5fSRaphael Isemann m_functions_by_uid[funcSP->GetID()] = funcSP;
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner
FindFunctionByUID(lldb::user_id_t func_uid)143b9c1b51eSKate Stone FunctionSP CompileUnit::FindFunctionByUID(lldb::user_id_t func_uid) {
144a7f19e5fSRaphael Isemann auto it = m_functions_by_uid.find(func_uid);
145a7f19e5fSRaphael Isemann if (it == m_functions_by_uid.end())
146a7f19e5fSRaphael Isemann return FunctionSP();
147a7f19e5fSRaphael Isemann return it->second;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner
GetLanguage()150b9c1b51eSKate Stone lldb::LanguageType CompileUnit::GetLanguage() {
151b9c1b51eSKate Stone if (m_language == eLanguageTypeUnknown) {
152b9c1b51eSKate Stone if (m_flags.IsClear(flagsParsedLanguage)) {
1531f746071SGreg Clayton m_flags.Set(flagsParsedLanguage);
154465eae36SPavel Labath if (SymbolFile *symfile = GetModule()->GetSymbolFile())
155465eae36SPavel Labath m_language = symfile->ParseLanguage(*this);
1561f746071SGreg Clayton }
1571f746071SGreg Clayton }
1581f746071SGreg Clayton return m_language;
1591f746071SGreg Clayton }
1601f746071SGreg Clayton
GetLineTable()161b9c1b51eSKate Stone LineTable *CompileUnit::GetLineTable() {
162d5b44036SJonas Devlieghere if (m_line_table_up == nullptr) {
163b9c1b51eSKate Stone if (m_flags.IsClear(flagsParsedLineTable)) {
16430fdc8d8SChris Lattner m_flags.Set(flagsParsedLineTable);
165465eae36SPavel Labath if (SymbolFile *symfile = GetModule()->GetSymbolFile())
166465eae36SPavel Labath symfile->ParseLineTable(*this);
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner }
169d5b44036SJonas Devlieghere return m_line_table_up.get();
17030fdc8d8SChris Lattner }
17130fdc8d8SChris Lattner
SetLineTable(LineTable * line_table)172b9c1b51eSKate Stone void CompileUnit::SetLineTable(LineTable *line_table) {
173d4612ad0SEd Maste if (line_table == nullptr)
17430fdc8d8SChris Lattner m_flags.Clear(flagsParsedLineTable);
17530fdc8d8SChris Lattner else
17630fdc8d8SChris Lattner m_flags.Set(flagsParsedLineTable);
177d5b44036SJonas Devlieghere m_line_table_up.reset(line_table);
17830fdc8d8SChris Lattner }
17930fdc8d8SChris Lattner
SetSupportFiles(const FileSpecList & support_files)18023533935SJonas Devlieghere void CompileUnit::SetSupportFiles(const FileSpecList &support_files) {
18123533935SJonas Devlieghere m_support_files = support_files;
18223533935SJonas Devlieghere }
18323533935SJonas Devlieghere
SetSupportFiles(FileSpecList && support_files)184437e37ddSEric Leese void CompileUnit::SetSupportFiles(FileSpecList &&support_files) {
185437e37ddSEric Leese m_support_files = std::move(support_files);
186437e37ddSEric Leese }
187437e37ddSEric Leese
GetDebugMacros()188b9c1b51eSKate Stone DebugMacros *CompileUnit::GetDebugMacros() {
189b9c1b51eSKate Stone if (m_debug_macros_sp.get() == nullptr) {
190b9c1b51eSKate Stone if (m_flags.IsClear(flagsParsedDebugMacros)) {
191d8335e9aSSiva Chandra m_flags.Set(flagsParsedDebugMacros);
192465eae36SPavel Labath if (SymbolFile *symfile = GetModule()->GetSymbolFile())
193465eae36SPavel Labath symfile->ParseDebugMacros(*this);
194d8335e9aSSiva Chandra }
195d8335e9aSSiva Chandra }
196d8335e9aSSiva Chandra
197d8335e9aSSiva Chandra return m_debug_macros_sp.get();
198d8335e9aSSiva Chandra }
199d8335e9aSSiva Chandra
SetDebugMacros(const DebugMacrosSP & debug_macros_sp)200b9c1b51eSKate Stone void CompileUnit::SetDebugMacros(const DebugMacrosSP &debug_macros_sp) {
201d8335e9aSSiva Chandra if (debug_macros_sp.get() == nullptr)
202d8335e9aSSiva Chandra m_flags.Clear(flagsParsedDebugMacros);
203d8335e9aSSiva Chandra else
204d8335e9aSSiva Chandra m_flags.Set(flagsParsedDebugMacros);
205d8335e9aSSiva Chandra m_debug_macros_sp = debug_macros_sp;
206d8335e9aSSiva Chandra }
207d8335e9aSSiva Chandra
GetVariableList(bool can_create)208b9c1b51eSKate Stone VariableListSP CompileUnit::GetVariableList(bool can_create) {
209b9c1b51eSKate Stone if (m_variables.get() == nullptr && can_create) {
21030fdc8d8SChris Lattner SymbolContext sc;
21130fdc8d8SChris Lattner CalculateSymbolContext(&sc);
21230fdc8d8SChris Lattner assert(sc.module_sp);
213465eae36SPavel Labath sc.module_sp->GetSymbolFile()->ParseVariablesForContext(sc);
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner
21630fdc8d8SChris Lattner return m_variables;
21730fdc8d8SChris Lattner }
21830fdc8d8SChris Lattner
FindFileIndexes(const FileSpecList & files,const FileSpec & file)21957f8a998SPavel Labath std::vector<uint32_t> FindFileIndexes(const FileSpecList &files, const FileSpec &file) {
22057f8a998SPavel Labath std::vector<uint32_t> result;
22157f8a998SPavel Labath uint32_t idx = -1;
22257f8a998SPavel Labath while ((idx = files.FindFileIndex(idx + 1, file, /*full=*/true)) !=
22357f8a998SPavel Labath UINT32_MAX)
22457f8a998SPavel Labath result.push_back(idx);
22557f8a998SPavel Labath return result;
22657f8a998SPavel Labath }
22757f8a998SPavel Labath
FindLineEntry(uint32_t start_idx,uint32_t line,const FileSpec * file_spec_ptr,bool exact,LineEntry * line_entry_ptr)228b9c1b51eSKate Stone uint32_t CompileUnit::FindLineEntry(uint32_t start_idx, uint32_t line,
229b9c1b51eSKate Stone const FileSpec *file_spec_ptr, bool exact,
230b9c1b51eSKate Stone LineEntry *line_entry_ptr) {
23157f8a998SPavel Labath if (!file_spec_ptr)
23257f8a998SPavel Labath file_spec_ptr = &GetPrimaryFile();
23357f8a998SPavel Labath std::vector<uint32_t> file_indexes = FindFileIndexes(GetSupportFiles(), *file_spec_ptr);
23457f8a998SPavel Labath if (file_indexes.empty())
23530fdc8d8SChris Lattner return UINT32_MAX;
23657f8a998SPavel Labath
2373e2ed744SMed Ismail Bennani // TODO: Handle SourceLocationSpec column information
2383e2ed744SMed Ismail Bennani SourceLocationSpec location_spec(*file_spec_ptr, line, /*column=*/llvm::None,
2393e2ed744SMed Ismail Bennani /*check_inlines=*/false, exact);
2403e2ed744SMed Ismail Bennani
24130fdc8d8SChris Lattner LineTable *line_table = GetLineTable();
24230fdc8d8SChris Lattner if (line_table)
24357f8a998SPavel Labath return line_table->FindLineEntryIndexByFileIndex(
2443e2ed744SMed Ismail Bennani start_idx, file_indexes, location_spec, line_entry_ptr);
24530fdc8d8SChris Lattner return UINT32_MAX;
24630fdc8d8SChris Lattner }
24730fdc8d8SChris Lattner
ResolveSymbolContext(const SourceLocationSpec & src_location_spec,SymbolContextItem resolve_scope,SymbolContextList & sc_list)2483e2ed744SMed Ismail Bennani void CompileUnit::ResolveSymbolContext(
2493e2ed744SMed Ismail Bennani const SourceLocationSpec &src_location_spec,
2503e2ed744SMed Ismail Bennani SymbolContextItem resolve_scope, SymbolContextList &sc_list) {
2513e2ed744SMed Ismail Bennani const FileSpec file_spec = src_location_spec.GetFileSpec();
252aa88161bSKazu Hirata const uint32_t line = src_location_spec.GetLine().value_or(0);
2533e2ed744SMed Ismail Bennani const bool check_inlines = src_location_spec.GetCheckInlines();
2543e2ed744SMed Ismail Bennani
255fd269157SGreg Clayton // First find all of the file indexes that match our "file_spec". If
25605097246SAdrian Prantl // "file_spec" has an empty directory, then only compare the basenames when
25705097246SAdrian Prantl // finding file indexes
258fd269157SGreg Clayton std::vector<uint32_t> file_indexes;
259b9c1b51eSKate Stone bool file_spec_matches_cu_file_spec =
260532290e6SPavel Labath FileSpec::Match(file_spec, this->GetPrimaryFile());
261fd269157SGreg Clayton
262fd269157SGreg Clayton // If we are not looking for inlined functions and our file spec doesn't
263fd269157SGreg Clayton // match then we are done...
264a6682a41SJonas Devlieghere if (!file_spec_matches_cu_file_spec && !check_inlines)
265c671639aSKonrad Kleine return;
266fd269157SGreg Clayton
26730fdc8d8SChris Lattner SymbolContext sc(GetModule());
26830fdc8d8SChris Lattner sc.comp_unit = this;
26930fdc8d8SChris Lattner
270c671639aSKonrad Kleine if (line == 0) {
271c671639aSKonrad Kleine if (file_spec_matches_cu_file_spec && !check_inlines) {
272c671639aSKonrad Kleine // only append the context if we aren't looking for inline call sites by
273c671639aSKonrad Kleine // file and line and if the file spec matches that of the compile unit
274c671639aSKonrad Kleine sc_list.Append(sc);
275c671639aSKonrad Kleine }
276c671639aSKonrad Kleine return;
277c671639aSKonrad Kleine }
278c671639aSKonrad Kleine
27968dafe40SKim-Anh Tran uint32_t file_idx =
28068dafe40SKim-Anh Tran GetSupportFiles().FindFileIndex(0, file_spec, true);
28168dafe40SKim-Anh Tran while (file_idx != UINT32_MAX) {
28268dafe40SKim-Anh Tran file_indexes.push_back(file_idx);
28368dafe40SKim-Anh Tran file_idx = GetSupportFiles().FindFileIndex(file_idx + 1, file_spec, true);
28468dafe40SKim-Anh Tran }
28568dafe40SKim-Anh Tran
28668dafe40SKim-Anh Tran const size_t num_file_indexes = file_indexes.size();
28768dafe40SKim-Anh Tran if (num_file_indexes == 0)
28868dafe40SKim-Anh Tran return;
28968dafe40SKim-Anh Tran
2907b81192dSJeffrey Tan // Found a matching source file in this compile unit load its debug info.
2917b81192dSJeffrey Tan GetModule()->GetSymbolFile()->SetLoadDebugInfoEnabled();
2927b81192dSJeffrey Tan
29330fdc8d8SChris Lattner LineTable *line_table = sc.comp_unit->GetLineTable();
29430fdc8d8SChris Lattner
29568dafe40SKim-Anh Tran if (line_table == nullptr) {
29668dafe40SKim-Anh Tran if (file_spec_matches_cu_file_spec && !check_inlines) {
29768dafe40SKim-Anh Tran sc_list.Append(sc);
29868dafe40SKim-Anh Tran }
299c671639aSKonrad Kleine return;
30068dafe40SKim-Anh Tran }
301c671639aSKonrad Kleine
302fd269157SGreg Clayton uint32_t line_idx;
303c671639aSKonrad Kleine LineEntry line_entry;
30430fdc8d8SChris Lattner
305b9c1b51eSKate Stone if (num_file_indexes == 1) {
30605097246SAdrian Prantl // We only have a single support file that matches, so use the line
30705097246SAdrian Prantl // table function that searches for a line entries that match a single
30805097246SAdrian Prantl // support file index
309b9c1b51eSKate Stone line_idx = line_table->FindLineEntryIndexByFileIndex(
3103e2ed744SMed Ismail Bennani 0, file_indexes.front(), src_location_spec, &line_entry);
311c671639aSKonrad Kleine } else {
312c671639aSKonrad Kleine // We found multiple support files that match "file_spec" so use the
313c671639aSKonrad Kleine // line table function that searches for a line entries that match a
314c671639aSKonrad Kleine // multiple support file indexes.
3153e2ed744SMed Ismail Bennani line_idx = line_table->FindLineEntryIndexByFileIndex(
3163e2ed744SMed Ismail Bennani 0, file_indexes, src_location_spec, &line_entry);
317c671639aSKonrad Kleine }
318fd269157SGreg Clayton
31905097246SAdrian Prantl // If "exact == true", then "found_line" will be the same as "line". If
32005097246SAdrian Prantl // "exact == false", the "found_line" will be the closest line entry
32105097246SAdrian Prantl // with a line number greater than "line" and we will use this for our
32205097246SAdrian Prantl // subsequent line exact matches below.
3233e2ed744SMed Ismail Bennani const bool inlines = false;
3243e2ed744SMed Ismail Bennani const bool exact = true;
3253973d8b2SKim-Anh Tran const llvm::Optional<uint16_t> column =
3260916d96dSKazu Hirata src_location_spec.GetColumn()
3273973d8b2SKim-Anh Tran ? llvm::Optional<uint16_t>(line_entry.column)
3283973d8b2SKim-Anh Tran : llvm::None;
3293973d8b2SKim-Anh Tran
3303973d8b2SKim-Anh Tran SourceLocationSpec found_entry(line_entry.file, line_entry.line, column,
3313973d8b2SKim-Anh Tran inlines, exact);
33230fdc8d8SChris Lattner
333b9c1b51eSKate Stone while (line_idx != UINT32_MAX) {
33405097246SAdrian Prantl // If they only asked for the line entry, then we're done, we can
33505097246SAdrian Prantl // just copy that over. But if they wanted more than just the line
33605097246SAdrian Prantl // number, fill it in.
337b9c1b51eSKate Stone if (resolve_scope == eSymbolContextLineEntry) {
33862ac08e4SJim Ingham sc.line_entry = line_entry;
339b9c1b51eSKate Stone } else {
340c671639aSKonrad Kleine line_entry.range.GetBaseAddress().CalculateSymbolContext(&sc,
341c671639aSKonrad Kleine resolve_scope);
34262ac08e4SJim Ingham }
34362ac08e4SJim Ingham
34430fdc8d8SChris Lattner sc_list.Append(sc);
345c671639aSKonrad Kleine if (num_file_indexes == 1)
346b9c1b51eSKate Stone line_idx = line_table->FindLineEntryIndexByFileIndex(
3473e2ed744SMed Ismail Bennani line_idx + 1, file_indexes.front(), found_entry, &line_entry);
348c671639aSKonrad Kleine else
349b9c1b51eSKate Stone line_idx = line_table->FindLineEntryIndexByFileIndex(
3503e2ed744SMed Ismail Bennani line_idx + 1, file_indexes, found_entry, &line_entry);
35130fdc8d8SChris Lattner }
35230fdc8d8SChris Lattner }
35330fdc8d8SChris Lattner
GetIsOptimized()354b9c1b51eSKate Stone bool CompileUnit::GetIsOptimized() {
355b9c1b51eSKate Stone if (m_is_optimized == eLazyBoolCalculate) {
356ad2b63cbSGreg Clayton m_is_optimized = eLazyBoolNo;
357465eae36SPavel Labath if (SymbolFile *symfile = GetModule()->GetSymbolFile()) {
358465eae36SPavel Labath if (symfile->ParseIsOptimized(*this))
359ad2b63cbSGreg Clayton m_is_optimized = eLazyBoolYes;
360ad2b63cbSGreg Clayton }
361ad2b63cbSGreg Clayton }
3626ab659a9SJason Molenda return m_is_optimized;
3636ab659a9SJason Molenda }
3646ab659a9SJason Molenda
SetVariableList(VariableListSP & variables)365b9c1b51eSKate Stone void CompileUnit::SetVariableList(VariableListSP &variables) {
36630fdc8d8SChris Lattner m_variables = variables;
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner
GetImportedModules()3690f30a3b6SAdrian Prantl const std::vector<SourceModule> &CompileUnit::GetImportedModules() {
370f0c5aeb6SSean Callanan if (m_imported_modules.empty() &&
371b9c1b51eSKate Stone m_flags.IsClear(flagsParsedImportedModules)) {
372f0c5aeb6SSean Callanan m_flags.Set(flagsParsedImportedModules);
373465eae36SPavel Labath if (SymbolFile *symfile = GetModule()->GetSymbolFile()) {
374f0c5aeb6SSean Callanan SymbolContext sc;
375f0c5aeb6SSean Callanan CalculateSymbolContext(&sc);
376465eae36SPavel Labath symfile->ParseImportedModules(sc, m_imported_modules);
377f0c5aeb6SSean Callanan }
378f0c5aeb6SSean Callanan }
379f0c5aeb6SSean Callanan return m_imported_modules;
380f0c5aeb6SSean Callanan }
381f0c5aeb6SSean Callanan
ForEachExternalModule(llvm::DenseSet<SymbolFile * > & visited_symbol_files,llvm::function_ref<bool (Module &)> lambda)3820e45e60cSAdrian Prantl bool CompileUnit::ForEachExternalModule(
3830e45e60cSAdrian Prantl llvm::DenseSet<SymbolFile *> &visited_symbol_files,
3840e45e60cSAdrian Prantl llvm::function_ref<bool(Module &)> lambda) {
3859379d19fSRaphael Isemann if (SymbolFile *symfile = GetModule()->GetSymbolFile())
3860e45e60cSAdrian Prantl return symfile->ForEachExternalModule(*this, visited_symbol_files, lambda);
3870e45e60cSAdrian Prantl return false;
3889379d19fSRaphael Isemann }
3899379d19fSRaphael Isemann
GetSupportFiles()390833dba01SPavel Labath const FileSpecList &CompileUnit::GetSupportFiles() {
391b9c1b51eSKate Stone if (m_support_files.GetSize() == 0) {
392b9c1b51eSKate Stone if (m_flags.IsClear(flagsParsedSupportFiles)) {
39330fdc8d8SChris Lattner m_flags.Set(flagsParsedSupportFiles);
394465eae36SPavel Labath if (SymbolFile *symfile = GetModule()->GetSymbolFile())
395465eae36SPavel Labath symfile->ParseSupportFiles(*this, m_support_files);
39630fdc8d8SChris Lattner }
39730fdc8d8SChris Lattner }
39830fdc8d8SChris Lattner return m_support_files;
39930fdc8d8SChris Lattner }
40030fdc8d8SChris Lattner
GetUserData() const401b9c1b51eSKate Stone void *CompileUnit::GetUserData() const { return m_user_data; }
402