ObjectFile.cpp revision 3383c1741c6b0ea4648a019f89333ec73e632c5b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ObjectFile.cpp ------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
11e40b6424d9e49306392bec4b44060da36414c382Greg Clayton#include "lldb/lldb-private-log.h"
12db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton#include "lldb/Core/DataBuffer.h"
13b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h"
14e40b6424d9e49306392bec4b44060da36414c382Greg Clayton#include "lldb/Core/Log.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
22b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFileSP
28db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::FindPlugin (Module* module, const FileSpec* file, addr_t file_offset, addr_t file_size, DataBufferSP &file_data_sp)
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "ObjectFile::FindPlugin (module = %s/%s, file = %p, file_offset = 0x%z8.8x, file_size = 0x%z8.8x)",
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        module->GetFileSpec().GetDirectory().AsCString(),
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        module->GetFileSpec().GetFilename().AsCString(),
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        file, file_offset, file_size);
35e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    ObjectFileSP object_file_sp;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (module != NULL)
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (file)
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton            // Memory map the entire file contents
42db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton            if (!file_data_sp)
43db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton            {
44db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                assert (file_offset == 0);
45db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                file_data_sp = file->MemoryMapFileContents(file_offset, file_size);
46db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton            }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton            if (!file_data_sp || file_data_sp->GetByteSize() == 0)
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Check for archive file with format "/path/to/archive.a(object.o)"
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                char path_with_object[PATH_MAX*2];
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                module->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object));
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (g_object_regex.Execute (path_with_object, 2))
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    FileSpec archive_file;
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string path;
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string object;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) &&
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        g_object_regex.GetMatchAtIndex (path_with_object, 2, object))
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
63537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                        archive_file.SetFile (path.c_str(), false);
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        file_size = archive_file.GetByteSize();
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (file_size > 0)
66db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        {
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            module->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str()));
68db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                            file_data_sp = archive_file.MemoryMapFileContents(file_offset, file_size);
69db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton            if (file_data_sp && file_data_sp->GetByteSize() > 0)
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
76db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                uint32_t idx;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                // Check if this is a normal object file by iterating through
79db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                // all object file plugin instances.
80db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                ObjectFileCreateInstance create_object_file_callback;
81db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx)
82db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                {
83db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                    object_file_sp.reset (create_object_file_callback(module, file_data_sp, file, file_offset, file_size));
84db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                    if (object_file_sp.get())
85db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        return object_file_sp;
86db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                // Check if this is a object container by iterating through
89db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                // all object container plugin instances and then trying to get
90db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                // an object file from the container.
91db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                ObjectContainerCreateInstance create_object_container_callback;
92db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx)
93db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                {
94db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                    std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module, file_data_sp, file, file_offset, file_size));
95db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton
96db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                    if (object_container_ap.get())
97db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        object_file_sp = object_container_ap->GetObjectFile(file);
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                    if (object_file_sp.get())
100db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        return object_file_sp;
101db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                }
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
105e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // We didn't find it, so clear our shared pointer in case it
106e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // contains anything and return an empty shared pointer
107e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    object_file_sp.reset();
108e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return object_file_sp;
109e40b6424d9e49306392bec4b44060da36414c382Greg Clayton}
110e40b6424d9e49306392bec4b44060da36414c382Greg Clayton
111b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFileSP
112b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::FindPlugin (Module* module,
113b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        const ProcessSP &process_sp,
114b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        lldb::addr_t header_addr,
115b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        DataBufferSP &file_data_sp)
116b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
117b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    Timer scoped_timer (__PRETTY_FUNCTION__,
118b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        "ObjectFile::FindPlugin (module = %s/%s, process = %p, header_addr = 0x%llx)",
119b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        module->GetFileSpec().GetDirectory().AsCString(),
120b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        module->GetFileSpec().GetFilename().AsCString(),
121b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        process_sp.get(), header_addr);
122b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ObjectFileSP object_file_sp;
123b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
124b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (module != NULL)
125b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
126b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        uint32_t idx;
127b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
128b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        // Check if this is a normal object file by iterating through
129b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        // all object file plugin instances.
130b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        ObjectFileCreateMemoryInstance create_callback;
131b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        for (idx = 0; (create_callback = PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(idx)) != NULL; ++idx)
132b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
133b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            object_file_sp.reset (create_callback(module, file_data_sp, process_sp, header_addr));
134b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            if (object_file_sp.get())
135b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                return object_file_sp;
136b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
137b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
138b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
139b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    // We didn't find it, so clear our shared pointer in case it
140b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    // contains anything and return an empty shared pointer
141b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    object_file_sp.reset();
142b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return object_file_sp;
143b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
144b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
145e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::ObjectFile (Module* module,
146e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                        const FileSpec *file_spec_ptr,
147db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        addr_t file_offset,
148db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        addr_t file_size,
149db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton                        DataBufferSP& file_data_sp) :
150e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    ModuleChild (module),
151e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_file (),  // This file could be different from the original module's file
152e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_type (eTypeInvalid),
153e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_strata (eStrataInvalid),
154db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    m_offset (file_offset),
155db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    m_length (file_size),
156db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    m_data (),
157b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_unwind_table (*this),
158b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_process_wp(),
15946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_memory_addr (LLDB_INVALID_ADDRESS)
160e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{
161e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    if (file_spec_ptr)
162e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        m_file = *file_spec_ptr;
163db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    if (file_data_sp)
164db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton        m_data.SetData (file_data_sp, file_offset, file_size);
165e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
166e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    if (log)
167e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    {
168e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        if (m_file)
169e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
170e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n",
171e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
172e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
173e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
174e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetDirectory().AsCString(),
175e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetFilename().AsCString(),
176e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
177e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
178e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
179e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        else
180e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
181e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n",
182e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
183e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
184e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
185e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
186e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
187e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
188e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    }
189e40b6424d9e49306392bec4b44060da36414c382Greg Clayton}
190e40b6424d9e49306392bec4b44060da36414c382Greg Clayton
191b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
192b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ObjectFile (Module* module,
193b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        const ProcessSP &process_sp,
194b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        lldb::addr_t header_addr,
195b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        DataBufferSP& header_data_sp) :
196b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ModuleChild (module),
197b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_file (),
198b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_type (eTypeInvalid),
199b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_strata (eStrataInvalid),
200b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_offset (header_addr),
201b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_length (0),
202b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_data (),
203b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_unwind_table (*this),
204b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_process_wp (process_sp),
20546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_memory_addr (header_addr)
206b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
207b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (header_data_sp)
208b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        m_data.SetData (header_data_sp, 0, header_data_sp->GetByteSize());
209b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
210b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (log)
211b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
212b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, process = %p, header_addr = 0x%llx\n",
213b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                     this,
214b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                     m_module->GetFileSpec().GetDirectory().AsCString(),
215b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                     m_module->GetFileSpec().GetFilename().AsCString(),
216b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                     process_sp.get(),
217b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                     m_offset);
218b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
219b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
220b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
221b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
222e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::~ObjectFile()
223e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{
224e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
225e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    if (log)
226e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    {
227e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        if (m_file)
228e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
229e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n",
230e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
231e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
232e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
233e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetDirectory().AsCString(),
234e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetFilename().AsCString(),
235e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
236e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
237e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
238e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        else
239e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
240e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n",
241e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
242e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
243e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
244e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
245e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
246e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
247e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    }
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2497508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
2507508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
2517508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFile::SetModulesArchitecture (const ArchSpec &new_arch)
2527508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
2537508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return m_module->SetArchitecture (new_arch);
2547508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
2557508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
256b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressClass
257e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::GetAddressClass (addr_t file_addr)
258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Symtab *symtab = GetSymtab();
260b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (symtab)
261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (symbol)
264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const AddressRange *range_ptr = symbol->GetAddressRangePtr();
266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (range_ptr)
267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                const Section *section = range_ptr->GetBaseAddress().GetSection();
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (section)
270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
271b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    const SectionType section_type = section->GetType();
272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    switch (section_type)
273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeInvalid:               return eAddressClassUnknown;
275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeCode:                  return eAddressClassCode;
276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeContainer:             return eAddressClassUnknown;
27724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData:
27824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCString:
27924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCStringPointers:
28024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataSymbolAddress:
28124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData4:
28224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData8:
28324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData16:
28424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataPointers:
28524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeZeroFill:
28624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCMessageRefs:
28724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCCFStrings:
28824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassData;
28924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDebug:
29024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAbbrev:
29124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAranges:
29224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugFrame:
29324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugInfo:
29424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLine:
29524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLoc:
29624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugMacInfo:
29724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubNames:
29824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubTypes:
29924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugRanges:
30024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugStr:
30124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNames:
30224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleTypes:
30324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNamespaces:
30424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleObjC:
30524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassDebug;
306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeEHFrame:               return eAddressClassRuntime;
307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeOther:                 return eAddressClassUnknown;
308b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
311b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
312b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const SymbolType symbol_type = symbol->GetType();
313b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            switch (symbol_type)
314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAny:            return eAddressClassUnknown;
316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAbsolute:       return eAddressClassUnknown;
317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCode:           return eAddressClassCode;
318b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeTrampoline:     return eAddressClassCode;
319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeData:           return eAddressClassData;
320b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeRuntime:        return eAddressClassRuntime;
321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeException:      return eAddressClassRuntime;
322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeSourceFile:     return eAddressClassDebug;
323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeHeaderFile:     return eAddressClassDebug;
324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeObjectFile:     return eAddressClassDebug;
325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCommonBlock:    return eAddressClassDebug;
326b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeBlock:          return eAddressClassDebug;
327b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLocal:          return eAddressClassData;
328b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeParam:          return eAddressClassData;
329b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariable:       return eAddressClassData;
330b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariableType:   return eAddressClassDebug;
331b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineEntry:      return eAddressClassDebug;
332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineHeader:     return eAddressClassDebug;
333b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeBegin:     return eAddressClassDebug;
334b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeEnd:       return eAddressClassDebug;
335b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAdditional:     return eAddressClassUnknown;
336b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCompiler:       return eAddressClassDebug;
337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeInstrumentation:return eAddressClassDebug;
338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeUndefined:      return eAddressClassUnknown;
3393f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCClass:      return eAddressClassRuntime;
3403f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCMetaClass:  return eAddressClassRuntime;
3413f69eacbb218a37390822c89d3675bd740590382Greg Clayton            case eSymbolTypeObjCIVar:       return eAddressClassRuntime;
342b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
345b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return eAddressClassUnknown;
346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
347b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
348b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonDataBufferSP
349b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadMemory (const ProcessSP &process_sp, lldb::addr_t addr, size_t byte_size)
350b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
351b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    DataBufferSP data_sp;
352b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (process_sp)
353b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
354b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (byte_size, 0));
355b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        Error error;
356b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        const size_t bytes_read = process_sp->ReadMemory (addr,
357b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                                          data_ap->GetBytes(),
358b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                                          data_ap->GetByteSize(),
359b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                                          error);
360b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (bytes_read == byte_size)
361b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            data_sp.reset (data_ap.release());
362b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
363b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return data_sp;
364b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
365b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
366db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Claytonsize_t
367db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::GetData (off_t offset, size_t length, DataExtractor &data) const
368db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton{
369db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    // The entire file has already been mmap'ed into m_data, so just copy from there
370db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    // as the back mmap buffer will be shared with shared pointers.
371db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    return data.SetData (m_data, offset, length);
372db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton}
373db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton
374db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Claytonsize_t
375db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg ClaytonObjectFile::CopyData (off_t offset, size_t length, void *dst) const
376db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton{
377db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    // The entire file has already been mmap'ed into m_data, so just copy from there
378db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton    return m_data.CopyByteOrderedData (offset, length, dst, length, lldb::endian::InlHostByteOrder());
379db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton}
380b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
381b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
382b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t
383b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadSectionData (const Section *section, off_t section_offset, void *dst, size_t dst_len) const
384b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (IsInMemory())
386b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
387b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        ProcessSP process_sp (m_process_wp.lock());
388b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (process_sp)
389b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
390b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            Error error;
391b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            return process_sp->ReadMemory (section->GetLoadBaseAddress (&process_sp->GetTarget()) + section_offset, dst, dst_len, error);
392b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
393b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
394b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    else
395b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
3963383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton        const uint64_t section_file_size = section->GetFileSize();
3973383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton        if (section_offset < section_file_size)
3983383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton        {
3993383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton            const uint64_t section_bytes_left = section_file_size - section_offset;
4003383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton            uint64_t section_dst_len = dst_len;
4013383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton            if (section_dst_len > section_bytes_left)
4023383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton                section_dst_len = section_bytes_left;
4033383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton            return CopyData (section->GetFileOffset() + section_offset, section_dst_len, dst);
4043383c1741c6b0ea4648a019f89333ec73e632c5bGreg Clayton        }
405b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
406b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return 0;
407b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
408b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
409b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton//----------------------------------------------------------------------
410b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton// Get the section data the file on disk
411b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton//----------------------------------------------------------------------
412b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t
413b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::ReadSectionData (const Section *section, DataExtractor& section_data) const
414b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (IsInMemory())
416b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
417b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        ProcessSP process_sp (m_process_wp.lock());
418b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (process_sp)
419b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
420b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            DataBufferSP data_sp (ReadMemory (process_sp, section->GetLoadBaseAddress (&process_sp->GetTarget()), section->GetByteSize()));
421b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            if (data_sp)
422b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
423b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                section_data.SetData (data_sp, 0, data_sp->GetByteSize());
424b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                section_data.SetByteOrder (process_sp->GetByteOrder());
425b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                section_data.SetAddressByteSize (process_sp->GetAddressByteSize());
426b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                return section_data.GetByteSize();
427b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
428b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
429b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
430b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    else
431b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
432b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        // The object file now contains a full mmap'ed copy of the object file data, so just use this
433b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        return MemoryMapSectionData (section, section_data);
434b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
435b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    section_data.Clear();
436b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return 0;
437b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
438b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
439b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonsize_t
440b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section_data) const
441b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (IsInMemory())
443b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
444b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        return ReadSectionData (section, section_data);
445b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
446b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    else
447b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
448b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        // The object file now contains a full mmap'ed copy of the object file data, so just use this
449b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        return GetData(section->GetFileOffset(), section->GetByteSize(), section_data);
450b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
451b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    section_data.Clear();
452b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return 0;
453b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
454b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
455