ObjectFile.cpp revision 24a6bd9835ed1655984397b0cdf35127e47681e9
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"
12e40b6424d9e49306392bec4b44060da36414c382Greg Clayton#include "lldb/Core/Log.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFileSP
25e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::FindPlugin (Module* module, const FileSpec* file, addr_t file_offset, addr_t file_size)
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "ObjectFile::FindPlugin (module = %s/%s, file = %p, file_offset = 0x%z8.8x, file_size = 0x%z8.8x)",
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        module->GetFileSpec().GetDirectory().AsCString(),
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        module->GetFileSpec().GetFilename().AsCString(),
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        file, file_offset, file_size);
32e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    ObjectFileSP object_file_sp;
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (module != NULL)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (file)
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (file_size == 0)
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                file_size = file->GetByteSize();
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (file_size == 0)
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Check for archive file with format "/path/to/archive.a(object.o)"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                char path_with_object[PATH_MAX*2];
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                module->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object));
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (g_object_regex.Execute (path_with_object, 2))
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    FileSpec archive_file;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string path;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string object;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) &&
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        g_object_regex.GetMatchAtIndex (path_with_object, 2, object))
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
56537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                        archive_file.SetFile (path.c_str(), false);
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        file_size = archive_file.GetByteSize();
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (file_size > 0)
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            module->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str()));
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6489e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen            // No need to delegate further if (file_offset, file_size) exceeds the total file size.
6589e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen            // This is the base case.
66b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//            if (file_offset + file_size > file->GetByteSize())
67b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//                return NULL;
6889e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DataBufferSP file_header_data_sp(file->ReadFileContents(file_offset, 512));
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t idx;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Check if this is a normal object file by iterating through
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // all object file plugin instances.
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFileCreateInstance create_object_file_callback;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx)
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
77e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                object_file_sp.reset (create_object_file_callback(module, file_header_data_sp, file, file_offset, file_size));
78e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                if (object_file_sp.get())
79e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                    return object_file_sp;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Check if this is a object container by iterating through
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // all object container plugin instances and then trying to get
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // an object file from the container.
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectContainerCreateInstance create_object_container_callback;
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx)
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module, file_header_data_sp, file, file_offset, file_size));
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (object_container_ap.get())
91e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                    object_file_sp = object_container_ap->GetObjectFile(file);
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                if (object_file_sp.get())
94e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                    return object_file_sp;
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
98e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // We didn't find it, so clear our shared pointer in case it
99e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // contains anything and return an empty shared pointer
100e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    object_file_sp.reset();
101e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return object_file_sp;
102e40b6424d9e49306392bec4b44060da36414c382Greg Clayton}
103e40b6424d9e49306392bec4b44060da36414c382Greg Clayton
104e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::ObjectFile (Module* module,
105e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                        const FileSpec *file_spec_ptr,
106e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                        addr_t offset,
107e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                        addr_t length,
108e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                        DataBufferSP& headerDataSP) :
109e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    ModuleChild (module),
110e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_file (),  // This file could be different from the original module's file
111e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_type (eTypeInvalid),
112e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_strata (eStrataInvalid),
113e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_offset (offset),
114e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_length (length),
115e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_data (headerDataSP, endian::InlHostByteOrder(), 4),
116e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_unwind_table (*this)
117e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{
118e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    if (file_spec_ptr)
119e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        m_file = *file_spec_ptr;
120e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
121e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    if (log)
122e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    {
123e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        if (m_file)
124e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
125e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n",
126e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
127e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
128e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
129e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetDirectory().AsCString(),
130e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetFilename().AsCString(),
131e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
132e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
133e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
134e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        else
135e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
136e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n",
137e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
138e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
139e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
140e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
141e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
142e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
143e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    }
144e40b6424d9e49306392bec4b44060da36414c382Greg Clayton}
145e40b6424d9e49306392bec4b44060da36414c382Greg Clayton
146e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::~ObjectFile()
147e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{
148e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
149e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    if (log)
150e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    {
151e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        if (m_file)
152e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
153e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = %s/%s, offset = 0x%8.8llx, size = %llu\n",
154e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
155e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
156e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
157e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetDirectory().AsCString(),
158e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_file.GetFilename().AsCString(),
159e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
160e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
161e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
162e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        else
163e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        {
164e40b6424d9e49306392bec4b44060da36414c382Greg Clayton            log->Printf ("%p ObjectFile::~ObjectFile () module = %s/%s, file = <NULL>, offset = 0x%8.8llx, size = %llu\n",
165e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         this,
166e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetDirectory().AsCString(),
167e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_module->GetFileSpec().GetFilename().AsCString(),
168e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_offset,
169e40b6424d9e49306392bec4b44060da36414c382Greg Clayton                         m_length);
170e40b6424d9e49306392bec4b44060da36414c382Greg Clayton        }
171e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    }
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
1747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
1757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFile::SetModulesArchitecture (const ArchSpec &new_arch)
1767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
1777508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return m_module->SetArchitecture (new_arch);
1787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
1797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
180b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressClass
181e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::GetAddressClass (addr_t file_addr)
182b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
183b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Symtab *symtab = GetSymtab();
184b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (symtab)
185b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
186b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (symbol)
188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const AddressRange *range_ptr = symbol->GetAddressRangePtr();
190b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (range_ptr)
191b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
192b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                const Section *section = range_ptr->GetBaseAddress().GetSection();
193b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (section)
194b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
195b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    const SectionType section_type = section->GetType();
196b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    switch (section_type)
197b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
198b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeInvalid:               return eAddressClassUnknown;
199b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeCode:                  return eAddressClassCode;
200b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeContainer:             return eAddressClassUnknown;
20124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData:
20224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCString:
20324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataCStringPointers:
20424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataSymbolAddress:
20524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData4:
20624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData8:
20724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeData16:
20824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataPointers:
20924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeZeroFill:
21024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCMessageRefs:
21124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDataObjCCFStrings:
21224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassData;
21324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDebug:
21424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAbbrev:
21524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugAranges:
21624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugFrame:
21724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugInfo:
21824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLine:
21924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugLoc:
22024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugMacInfo:
22124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubNames:
22224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugPubTypes:
22324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugRanges:
22424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFDebugStr:
22524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNames:
22624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleTypes:
22724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleNamespaces:
22824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                    case eSectionTypeDWARFAppleObjC:
22924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                        return eAddressClassDebug;
230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeEHFrame:               return eAddressClassRuntime;
231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeOther:                 return eAddressClassUnknown;
232b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
233b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
235b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
236b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const SymbolType symbol_type = symbol->GetType();
237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            switch (symbol_type)
238b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAny:            return eAddressClassUnknown;
240b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAbsolute:       return eAddressClassUnknown;
241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeExtern:         return eAddressClassUnknown;
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCode:           return eAddressClassCode;
243b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeTrampoline:     return eAddressClassCode;
244b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeData:           return eAddressClassData;
245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeRuntime:        return eAddressClassRuntime;
246b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeException:      return eAddressClassRuntime;
247b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeSourceFile:     return eAddressClassDebug;
248b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeHeaderFile:     return eAddressClassDebug;
249b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeObjectFile:     return eAddressClassDebug;
250b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCommonBlock:    return eAddressClassDebug;
251b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeBlock:          return eAddressClassDebug;
252b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLocal:          return eAddressClassData;
253b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeParam:          return eAddressClassData;
254b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariable:       return eAddressClassData;
255b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariableType:   return eAddressClassDebug;
256b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineEntry:      return eAddressClassDebug;
257b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineHeader:     return eAddressClassDebug;
258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeBegin:     return eAddressClassDebug;
259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeEnd:       return eAddressClassDebug;
260b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAdditional:     return eAddressClassUnknown;
261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCompiler:       return eAddressClassDebug;
262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeInstrumentation:return eAddressClassDebug;
263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeUndefined:      return eAddressClassUnknown;
264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return eAddressClassUnknown;
268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
270e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFileSP
271e40b6424d9e49306392bec4b44060da36414c382Greg ClaytonObjectFile::GetSP ()
272e40b6424d9e49306392bec4b44060da36414c382Greg Clayton{
273e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // This object contains an instrusive ref count base class so we can
274e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    // easily make a shared pointer to this object
275e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return ObjectFileSP (this);
276e40b6424d9e49306392bec4b44060da36414c382Greg Clayton}
277e40b6424d9e49306392bec4b44060da36414c382Greg Clayton
278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
279