]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Host/common/Symbols.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Host / common / Symbols.cpp
1 //===-- Symbols.cpp ---------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "lldb/Host/Symbols.h"
11 #include "lldb/Core/ArchSpec.h"
12 #include "lldb/Core/DataBuffer.h"
13 #include "lldb/Core/DataExtractor.h"
14 #include "lldb/Core/Module.h"
15 #include "lldb/Core/ModuleSpec.h"
16 #include "lldb/Core/StreamString.h"
17 #include "lldb/Core/Timer.h"
18 #include "lldb/Core/UUID.h"
19 #include "lldb/Symbol/ObjectFile.h"
20 #include "lldb/Target/Target.h"
21
22 using namespace lldb;
23 using namespace lldb_private;
24
25 #if defined (__linux__) || defined (__FreeBSD__)
26
27 FileSpec
28 Symbols::LocateExecutableObjectFile (const ModuleSpec &module_spec)
29 {
30     // FIXME
31     return FileSpec();
32 }
33
34 FileSpec
35 Symbols::LocateExecutableSymbolFile (const ModuleSpec &module_spec)
36 {
37     const char *symbol_filename = module_spec.GetSymbolFileSpec().GetFilename().AsCString();
38     if (!symbol_filename || !symbol_filename[0])
39         return FileSpec();
40
41     FileSpecList debug_file_search_paths (Target::GetDefaultDebugFileSearchPaths());
42
43     // Add module directory.
44     const ConstString &file_dir = module_spec.GetFileSpec().GetDirectory();
45     debug_file_search_paths.AppendIfUnique (FileSpec(file_dir.AsCString("."), true));
46
47     // Add current working directory.
48     debug_file_search_paths.AppendIfUnique (FileSpec(".", true));
49
50     // Add /usr/lib/debug directory.
51     debug_file_search_paths.AppendIfUnique (FileSpec("/usr/lib/debug", true));
52
53     std::string uuid_str;
54     const UUID &module_uuid = module_spec.GetUUID();
55     if (module_uuid.IsValid())
56     {
57         // Some debug files are stored in the .build-id directory like this:
58         //   /usr/lib/debug/.build-id/ff/e7fe727889ad82bb153de2ad065b2189693315.debug
59         uuid_str = module_uuid.GetAsString("");
60         uuid_str.insert (2, 1, '/');
61         uuid_str = uuid_str + ".debug";
62     }
63
64     // Get full path to our module. Needed to check debug files like this:
65     //   /usr/lib/debug/usr/lib/libboost_date_time.so.1.46.1
66     std::string module_filename = module_spec.GetFileSpec().GetPath();
67
68     size_t num_directories = debug_file_search_paths.GetSize();
69     for (size_t idx = 0; idx < num_directories; ++idx)
70     {
71         FileSpec dirspec = debug_file_search_paths.GetFileSpecAtIndex (idx);
72         dirspec.ResolvePath();
73         if (!dirspec.Exists() || !dirspec.IsDirectory())
74             continue;
75
76         std::vector<std::string> files;
77         std::string dirname = dirspec.GetPath();
78
79         files.push_back (dirname + "/" + symbol_filename);
80         files.push_back (dirname + "/.debug/" + symbol_filename);
81         files.push_back (dirname + "/.build-id/" + uuid_str);
82         files.push_back (dirname + module_filename);
83
84         const uint32_t num_files = files.size();
85         for (size_t idx_file = 0; idx_file < num_files; ++idx_file)
86         {
87             const std::string &filename = files[idx_file];
88             FileSpec file_spec (filename.c_str(), true);
89
90             if (file_spec == module_spec.GetFileSpec())
91                 continue;
92
93             if (file_spec.Exists())
94             {
95                 lldb_private::ModuleSpecList specs;
96                 const size_t num_specs = ObjectFile::GetModuleSpecifications (file_spec, 0, 0, specs);
97                 assert (num_specs <= 1 && "Symbol Vendor supports only a single architecture");
98                 if (num_specs == 1)
99                 {
100                     ModuleSpec mspec;
101                     if (specs.GetModuleSpecAtIndex (0, mspec))
102                     {
103                         if (mspec.GetUUID() == module_uuid)
104                             return file_spec;
105                     }
106                 }
107             }
108         }
109     }
110
111     return FileSpec();
112 }
113
114 FileSpec
115 Symbols::FindSymbolFileInBundle (const FileSpec& symfile_bundle,
116                                  const lldb_private::UUID *uuid,
117                                  const ArchSpec *arch)
118 {
119     // FIXME
120     return FileSpec();
121 }
122
123 bool
124 Symbols::DownloadObjectAndSymbolFile (ModuleSpec &module_spec, bool force_lookup)
125 {
126     // Fill in the module_spec.GetFileSpec() for the object file and/or the
127     // module_spec.GetSymbolFileSpec() for the debug symbols file.
128     return false;
129 }
130
131 #elif !defined (__APPLE__)
132
133 FileSpec
134 Symbols::LocateExecutableObjectFile (const ModuleSpec &module_spec)
135 {
136     // FIXME
137     return FileSpec();
138 }
139
140 FileSpec
141 Symbols::LocateExecutableSymbolFile (const ModuleSpec &module_spec)
142 {
143     // FIXME
144     return FileSpec();
145 }
146
147 FileSpec
148 Symbols::FindSymbolFileInBundle (const FileSpec& symfile_bundle,
149                                  const lldb_private::UUID *uuid,
150                                  const ArchSpec *arch)
151 {
152     return FileSpec();
153 }
154
155 bool
156 Symbols::DownloadObjectAndSymbolFile (ModuleSpec &module_spec, bool force_lookup)
157 {
158     // Fill in the module_spec.GetFileSpec() for the object file and/or the
159     // module_spec.GetSymbolFileSpec() for the debug symbols file.
160     return false;
161 }
162
163 #endif