ObjectFile.cpp revision b1888f24fa181489840b9acf193e224d125d0776
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"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolFile.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile*
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile::FindPlugin (Module* module, const FileSpec* file, lldb::addr_t file_offset, lldb::addr_t file_size)
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__,
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        "ObjectFile::FindPlugin (module = %s/%s, file = %p, file_offset = 0x%z8.8x, file_size = 0x%z8.8x)",
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        module->GetFileSpec().GetDirectory().AsCString(),
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        module->GetFileSpec().GetFilename().AsCString(),
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        file, file_offset, file_size);
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<ObjectFile> object_file_ap;
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (module != NULL)
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (file)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (file_size == 0)
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                file_size = file->GetByteSize();
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (file_size == 0)
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Check for archive file with format "/path/to/archive.a(object.o)"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                char path_with_object[PATH_MAX*2];
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                module->GetFileSpec().GetPath(path_with_object, sizeof(path_with_object));
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (g_object_regex.Execute (path_with_object, 2))
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    FileSpec archive_file;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string path;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::string object;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (g_object_regex.GetMatchAtIndex (path_with_object, 1, path) &&
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        g_object_regex.GetMatchAtIndex (path_with_object, 2, object))
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
54537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                        archive_file.SetFile (path.c_str(), false);
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        file_size = archive_file.GetByteSize();
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (file_size > 0)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            module->SetFileSpecAndObjectName (archive_file, ConstString(object.c_str()));
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6289e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen            // No need to delegate further if (file_offset, file_size) exceeds the total file size.
6389e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen            // This is the base case.
6489e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen            if (file_offset + file_size > file->GetByteSize())
6589e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen                return NULL;
6689e4bae3cbb26e566dbbff1e717c95385d126c48Johnny Chen
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DataBufferSP file_header_data_sp(file->ReadFileContents(file_offset, 512));
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t idx;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Check if this is a normal object file by iterating through
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // all object file plugin instances.
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFileCreateInstance create_object_file_callback;
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (idx = 0; (create_object_file_callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) != NULL; ++idx)
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                object_file_ap.reset (create_object_file_callback(module, file_header_data_sp, file, file_offset, file_size));
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (object_file_ap.get())
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return object_file_ap.release();
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Check if this is a object container by iterating through
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // all object container plugin instances and then trying to get
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // an object file from the container.
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectContainerCreateInstance create_object_container_callback;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (idx = 0; (create_object_container_callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(idx)) != NULL; ++idx)
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                std::auto_ptr<ObjectContainer> object_container_ap(create_object_container_callback(module, file_header_data_sp, file, file_offset, file_size));
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (object_container_ap.get())
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    object_file_ap.reset (object_container_ap->GetObjectFile(file));
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (object_file_ap.get())
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return object_file_ap.release();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
987508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
997508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
1007508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFile::SetModulesArchitecture (const ArchSpec &new_arch)
1017508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
1027508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    return m_module->SetArchitecture (new_arch);
1037508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
1047508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
105b1888f24fa181489840b9acf193e224d125d0776Greg Claytonlldb::AddressClass
106b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonObjectFile::GetAddressClass (lldb::addr_t file_addr)
107b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
108b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    Symtab *symtab = GetSymtab();
109b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (symtab)
110b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
111b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
112b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (symbol)
113b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
114b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const AddressRange *range_ptr = symbol->GetAddressRangePtr();
115b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (range_ptr)
116b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
117b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                const Section *section = range_ptr->GetBaseAddress().GetSection();
118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                if (section)
119b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
120b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    const lldb::SectionType section_type = section->GetType();
121b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    switch (section_type)
122b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
123b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeInvalid:               return eAddressClassUnknown;
124b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeCode:                  return eAddressClassCode;
125b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeContainer:             return eAddressClassUnknown;
126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeData:                  return eAddressClassData;
127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDataCString:           return eAddressClassDataConst;
128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDataCStringPointers:   return eAddressClassData;
129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDataSymbolAddress:     return eAddressClassData;
130b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeData4:                 return eAddressClassData;
131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeData8:                 return eAddressClassData;
132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeData16:                return eAddressClassData;
133b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDataPointers:          return eAddressClassData;
134b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeZeroFill:              return eAddressClassData;
135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDataObjCMessageRefs:   return eAddressClassDataConst;
136b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDataObjCCFStrings:     return eAddressClassDataConst;
137b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDebug:                 return eAddressClassDebug;
138b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugAbbrev:      return eAddressClassDebug;
139b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugAranges:     return eAddressClassDebug;
140b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugFrame:       return eAddressClassDebug;
141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugInfo:        return eAddressClassDebug;
142b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugLine:        return eAddressClassDebug;
143b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugLoc:         return eAddressClassDebug;
144b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugMacInfo:     return eAddressClassDebug;
145b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugPubNames:    return eAddressClassDebug;
146b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugPubTypes:    return eAddressClassDebug;
147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugRanges:      return eAddressClassDebug;
148b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeDWARFDebugStr:         return eAddressClassDebug;
149b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeEHFrame:               return eAddressClassRuntime;
150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    case eSectionTypeOther:                 return eAddressClassUnknown;
151b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
152b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
154b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            const lldb::SymbolType symbol_type = symbol->GetType();
156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            switch (symbol_type)
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
158b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAny:            return eAddressClassUnknown;
159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAbsolute:       return eAddressClassUnknown;
160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeExtern:         return eAddressClassUnknown;
161b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCode:           return eAddressClassCode;
162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeTrampoline:     return eAddressClassCode;
163b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeData:           return eAddressClassData;
164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeRuntime:        return eAddressClassRuntime;
165b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeException:      return eAddressClassRuntime;
166b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeSourceFile:     return eAddressClassDebug;
167b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeHeaderFile:     return eAddressClassDebug;
168b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeObjectFile:     return eAddressClassDebug;
169b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCommonBlock:    return eAddressClassDebug;
170b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeBlock:          return eAddressClassDebug;
171b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLocal:          return eAddressClassData;
172b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeParam:          return eAddressClassData;
173b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariable:       return eAddressClassData;
174b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeVariableType:   return eAddressClassDebug;
175b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineEntry:      return eAddressClassDebug;
176b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeLineHeader:     return eAddressClassDebug;
177b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeBegin:     return eAddressClassDebug;
178b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeScopeEnd:       return eAddressClassDebug;
179b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeAdditional:     return eAddressClassUnknown;
180b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeCompiler:       return eAddressClassDebug;
181b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeInstrumentation:return eAddressClassDebug;
182b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            case eSymbolTypeUndefined:      return eAddressClassUnknown;
183b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
184b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
185b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
186b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return eAddressClassUnknown;
187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
190