summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Core/Debugger.h1
-rw-r--r--lldb/include/lldb/Host/Host.h5
-rw-r--r--lldb/include/lldb/Symbol/Type.h48
-rw-r--r--lldb/lldb.xcodeproj/project.pbxproj1
-rw-r--r--lldb/source/Core/Debugger.cpp3
-rw-r--r--lldb/source/Host/macosx/Host.mm40
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp19
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp46
-rw-r--r--lldb/source/Symbol/Function.cpp4
-rw-r--r--lldb/source/Symbol/Type.cpp190
-rw-r--r--lldb/tools/debugserver/debugserver.xcodeproj/project.pbxproj1
11 files changed, 227 insertions, 131 deletions
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index bbce71ac26c..d39f2428c70 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -333,7 +333,6 @@ protected:
std::stack<lldb::InputReaderSP> m_input_readers;
std::string m_input_reader_data;
- bool m_use_external_editor; // FIXME: Convert this to a set/show variable on the debugger.
private:
diff --git a/lldb/include/lldb/Host/Host.h b/lldb/include/lldb/Host/Host.h
index 20c83038aec..cbd29cc4c89 100644
--- a/lldb/include/lldb/Host/Host.h
+++ b/lldb/include/lldb/Host/Host.h
@@ -268,8 +268,11 @@ public:
static ArchSpec
GetArchSpecForExistingProcess (const char *process_name);
+ static lldb::pid_t
+ LaunchApplication (const FileSpec &file_spec);
+
static bool
- OpenFileInExternalEditor (FileSpec &file_spec, uint32_t line_no);
+ OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no);
};
diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h
index 80e156c6a06..0d62118574a 100644
--- a/lldb/include/lldb/Symbol/Type.h
+++ b/lldb/include/lldb/Symbol/Type.h
@@ -23,27 +23,29 @@ class Type : public UserID
public:
typedef enum
{
- eTypeInvalid,
- eIsTypeWithUID, ///< This type is the type whose UID is m_encoding_uid
- eIsConstTypeWithUID, ///< This type is the type whose UID is m_encoding_uid with the const qualifier added
- eIsRestrictTypeWithUID, ///< This type is the type whose UID is m_encoding_uid with the restrict qualifier added
- eIsVolatileTypeWithUID, ///< This type is the type whose UID is m_encoding_uid with the volatile qualifier added
- eTypedefToTypeWithUID, ///< This type is pointer to a type whose UID is m_encoding_uid
- ePointerToTypeWithUID, ///< This type is pointer to a type whose UID is m_encoding_uid
- eLValueReferenceToTypeWithUID, ///< This type is L value reference to a type whose UID is m_encoding_uid
- eRValueReferenceToTypeWithUID, ///< This type is R value reference to a type whose UID is m_encoding_uid
- eTypeUIDSynthetic
- } EncodingUIDType;
+ eEncodingInvalid,
+ eEncodingIsUID, ///< This type is the type whose UID is m_encoding_uid
+ eEncodingIsConstUID, ///< This type is the type whose UID is m_encoding_uid with the const qualifier added
+ eEncodingIsRestrictUID, ///< This type is the type whose UID is m_encoding_uid with the restrict qualifier added
+ eEncodingIsVolatileUID, ///< This type is the type whose UID is m_encoding_uid with the volatile qualifier added
+ eEncodingIsTypedefUID, ///< This type is pointer to a type whose UID is m_encoding_uid
+ eEncodingIsPointerUID, ///< This type is pointer to a type whose UID is m_encoding_uid
+ eEncodingIsLValueReferenceUID, ///< This type is L value reference to a type whose UID is m_encoding_uid
+ eEncodingIsRValueReferenceUID, ///< This type is R value reference to a type whose UID is m_encoding_uid
+ eEncodingIsSyntheticUID,
+ eEncodingIsTypePtr ///< m_encoding_data is a "lldb_private::Type *"
+ } EncodingDataType;
Type (lldb::user_id_t uid,
SymbolFile* symbol_file,
const ConstString &name,
- uint64_t byte_size,
+ uint32_t byte_size,
SymbolContextScope *context,
- lldb::user_id_t encoding_uid,
- EncodingUIDType encoding_type,
+ uintptr_t encoding_uid,
+ EncodingDataType encoding_type,
const Declaration& decl,
- lldb::clang_type_t clang_qual_type);
+ lldb::clang_type_t clang_qual_type,
+ bool is_forward_decl);
// This makes an invalid type. Used for functions that return a Type when they
// get an error.
@@ -91,7 +93,7 @@ public:
bool
IsValidType ()
{
- return m_encoding_uid_type != eTypeInvalid;
+ return m_encoding_data_type != eEncodingInvalid;
}
void
@@ -196,14 +198,22 @@ public:
protected:
ConstString m_name;
- uint64_t m_byte_size;
SymbolFile *m_symbol_file;
SymbolContextScope *m_context; // The symbol context in which this type is defined
- lldb::user_id_t m_encoding_uid;
- EncodingUIDType m_encoding_uid_type;
+ uint64_t m_byte_size;
+ EncodingDataType m_encoding_data_type;
+ uintptr_t m_encoding_data;
Declaration m_decl;
lldb::clang_type_t m_clang_qual_type;
+ bool m_is_forward_decl;
+ Type *
+ GetEncodingType ()
+ {
+ if (m_encoding_data_type == eEncodingIsTypePtr)
+ return (Type *)m_encoding_data;
+ return NULL;
+ }
bool ResolveClangType(bool forward_decl_is_ok = false);
};
diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj
index 9ad57b1b26f..1b2fa64627b 100644
--- a/lldb/lldb.xcodeproj/project.pbxproj
+++ b/lldb/lldb.xcodeproj/project.pbxproj
@@ -2431,6 +2431,7 @@
isa = PBXProject;
buildConfigurationList = 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "lldb" */;
compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
en,
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 5ad5227be7a..8be3da08ac3 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -155,8 +155,7 @@ Debugger::Debugger () :
m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
m_exe_ctx (),
m_input_readers (),
- m_input_reader_data (),
- m_use_external_editor(false)
+ m_input_reader_data ()
{
m_command_interpreter_ap->Initialize ();
}
diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm
index 05e88338365..e3379d07cca 100644
--- a/lldb/source/Host/macosx/Host.mm
+++ b/lldb/source/Host/macosx/Host.mm
@@ -12,11 +12,13 @@
#include "lldb/Core/Log.h"
#include "cfcpp/CFCBundle.h"
+#include "cfcpp/CFCMutableDictionary.h"
#include "cfcpp/CFCReleaser.h"
#include "cfcpp/CFCString.h"
#include <objc/objc-auto.h>
+#include <ApplicationServices/ApplicationServices.h>
#include <Carbon/Carbon.h>
#include <Foundation/Foundation.h>
@@ -112,8 +114,44 @@ Host::ResolveExecutableInBundle (FileSpec *file)
return false;
}
+lldb::pid_t
+Host::LaunchApplication (const FileSpec &app_file_spec)
+{
+ char app_path[PATH_MAX];
+ app_file_spec.GetPath(app_path, sizeof(app_path));
+
+ LSApplicationParameters app_params;
+ ::bzero (&app_params, sizeof (app_params));
+ app_params.flags = kLSLaunchDefaults |
+ kLSLaunchDontAddToRecents |
+ kLSLaunchDontSwitch |
+ kLSLaunchNewInstance;// | 0x00001000;
+
+ FSRef app_fsref;
+ CFCString app_cfstr (app_path, kCFStringEncodingUTF8);
+
+ OSStatus error = ::FSPathMakeRef ((const UInt8 *)app_path, &app_fsref, false);
+
+ // If we found the app, then store away the name so we don't have to re-look it up.
+ if (error != noErr)
+ return LLDB_INVALID_PROCESS_ID;
+
+ app_params.application = &app_fsref;
+
+ ProcessSerialNumber psn;
+
+ error = ::LSOpenApplication (&app_params, &psn);
+
+ if (error != noErr)
+ return LLDB_INVALID_PROCESS_ID;
+
+ ::pid_t pid = LLDB_INVALID_PROCESS_ID;
+ error = ::GetProcessPID(&psn, &pid);
+ return pid;
+}
+
bool
-Host::OpenFileInExternalEditor (FileSpec &file_spec, uint32_t line_no)
+Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no)
{
// We attach this to an 'odoc' event to specify a particular selection
typedef struct {
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index f0c33f68fab..d84fedd9b48 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -366,6 +366,7 @@ ProcessGDBRemote::WillLaunchOrAttach ()
return error;
}
+//#define LAUNCH_WITH_LAUNCH_SERVICES 1
//----------------------------------------------------------------------
// Process Control
//----------------------------------------------------------------------
@@ -381,10 +382,18 @@ ProcessGDBRemote::DoLaunch
const char *stderr_path
)
{
+ Error error;
+#if defined (LAUNCH_WITH_LAUNCH_SERVICES)
+ FileSpec app_file_spec (argv[0]);
+ pid_t pid = Host::LaunchApplication (app_file_spec);
+ if (pid != LLDB_INVALID_PROCESS_ID)
+ error = DoAttachToProcessWithID (pid);
+ else
+ error.SetErrorString("failed");
+#else
// ::LogSetBitMask (GDBR_LOG_DEFAULT);
// ::LogSetOptions (LLDB_LOG_OPTION_THREADSAFE | LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD);
// ::LogSetLogFile ("/dev/stdout");
- Error error;
ObjectFile * object_file = module->GetObjectFile();
if (object_file)
@@ -497,9 +506,9 @@ ProcessGDBRemote::DoLaunch
SetID(LLDB_INVALID_PROCESS_ID);
error.SetErrorStringWithFormat("Failed to get object file from '%s' for arch %s.\n", module->GetFileSpec().GetFilename().AsCString(), module->GetArchitecture().AsCString());
}
-
- // Return the process ID we have
+#endif
return error;
+
}
@@ -621,9 +630,13 @@ ProcessGDBRemote::DidLaunchOrAttach ()
void
ProcessGDBRemote::DidLaunch ()
{
+#if defined (LAUNCH_WITH_LAUNCH_SERVICES)
+ DidAttach ();
+#else
DidLaunchOrAttach ();
if (m_dynamic_loader_ap.get())
m_dynamic_loader_ap->DidLaunch();
+#endif
}
Error
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 6b735d271b4..0452ea36d32 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -2444,7 +2444,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
DWARFDebugInfoEntry::Attributes attributes;
const char *type_name_cstr = NULL;
ConstString type_name_dbstr;
- Type::EncodingUIDType encoding_uid_type = Type::eIsTypeWithUID;
+ Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID;
clang_type_t clang_type = NULL;
TypeList* type_list = m_obj_file->GetModule()->GetTypeList();
@@ -2508,37 +2508,37 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
case DW_TAG_pointer_type:
// The encoding_uid will be embedded into the
// Type object and will be looked up when the Type::GetClangType()
- encoding_uid_type = Type::ePointerToTypeWithUID;
+ encoding_data_type = Type::eEncodingIsPointerUID;
break;
case DW_TAG_reference_type:
// The encoding_uid will be embedded into the
// Type object and will be looked up when the Type::GetClangType()
- encoding_uid_type = Type::eLValueReferenceToTypeWithUID;
+ encoding_data_type = Type::eEncodingIsLValueReferenceUID;
break;
case DW_TAG_typedef:
// The encoding_uid will be embedded into the
// Type object and will be looked up when the Type::GetClangType()
- encoding_uid_type = Type::eTypedefToTypeWithUID;
+ encoding_data_type = Type::eEncodingIsTypedefUID;
break;
case DW_TAG_const_type:
// The encoding_uid will be embedded into the
// Type object and will be looked up when the Type::GetClangType()
- encoding_uid_type = Type::eIsConstTypeWithUID; //ClangASTContext::AddConstModifier (clang_type);
+ encoding_data_type = Type::eEncodingIsConstUID; //ClangASTContext::AddConstModifier (clang_type);
break;
case DW_TAG_restrict_type:
// The encoding_uid will be embedded into the
// Type object and will be looked up when the Type::GetClangType()
- encoding_uid_type = Type::eIsRestrictTypeWithUID; //ClangASTContext::AddRestrictModifier (clang_type);
+ encoding_data_type = Type::eEncodingIsRestrictUID; //ClangASTContext::AddRestrictModifier (clang_type);
break;
case DW_TAG_volatile_type:
// The encoding_uid will be embedded into the
// Type object and will be looked up when the Type::GetClangType()
- encoding_uid_type = Type::eIsVolatileTypeWithUID; //ClangASTContext::AddVolatileModifier (clang_type);
+ encoding_data_type = Type::eEncodingIsVolatileUID; //ClangASTContext::AddVolatileModifier (clang_type);
break;
}
@@ -2563,7 +2563,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
}
}
- type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, encoding_uid, encoding_uid_type, &decl, clang_type));
+ type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, encoding_uid, encoding_data_type, &decl, clang_type, clang_type == NULL));
m_die_to_type[die] = type_sp.get();
@@ -2679,21 +2679,27 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
// parameters in any class methods need it for the clang
// types for function prototypes.
m_die_to_decl_ctx[die] = ClangASTContext::GetDeclContextForType (clang_type);
- type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, &decl, clang_type));
+ type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, clang_type, true));
m_die_to_type[die] = type_sp.get();
- // Leave this as a forward declaration until we need
- // to know the details of the type. lldb_private::Type
- // will automatically call the SymbolFile virtual function
- // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)"
- // When the definition needs to be defined.
- if (clang_type_was_created)
+ if (die->HasChildren() == false)
{
+ // No children for this struct/union/class, lets finish it
+ type_list->GetClangASTContext().StartTagDeclarationDefinition (clang_type);
+ type_list->GetClangASTContext().CompleteTagDeclarationDefinition (clang_type);
+ }
+ else if (clang_type_was_created)
+ {
+ // Leave this as a forward declaration until we need
+ // to know the details of the type. lldb_private::Type
+ // will automatically call the SymbolFile virtual function
+ // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)"
+ // When the definition needs to be defined.
m_forward_decl_die_to_clang_type[die] = clang_type;
m_forward_decl_clang_type_to_die[clang_type] = die;
}
-
+
}
break;
@@ -2760,7 +2766,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
}
m_die_to_decl_ctx[die] = ClangASTContext::GetDeclContextForType (clang_type);
- type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, encoding_uid, Type::eIsTypeWithUID, &decl, clang_type));
+ type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, encoding_uid, Type::eEncodingIsUID, &decl, clang_type, true));
m_die_to_type[die] = type_sp.get();
@@ -2972,7 +2978,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
type_list->GetClangASTContext().SetFunctionParameters (function_decl, &function_param_decls.front(), function_param_decls.size());
}
}
- type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, 0, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, &decl, clang_type));
+ type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, 0, NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, clang_type, false));
m_die_to_type[die] = type_sp.get();
assert(type_sp.get());
@@ -3057,7 +3063,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
array_element_bit_stride = array_element_bit_stride * num_elements;
}
ConstString empty_name;
- type_sp.reset( new Type(die->GetOffset(), this, empty_name, array_element_bit_stride / 8, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, &decl, clang_type));
+ type_sp.reset( new Type(die->GetOffset(), this, empty_name, array_element_bit_stride / 8, NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, &decl, clang_type, false));
m_die_to_type[die] = type_sp.get();
}
}
@@ -3099,7 +3105,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
size_t byte_size = ClangASTType::GetClangTypeBitWidth (type_list->GetClangASTContext().getASTContext(), clang_type) / 8;
- type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, NULL, clang_type));
+ type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eEncodingIsUID, NULL, clang_type, false));
m_die_to_type[die] = type_sp.get();
}
diff --git a/lldb/source/Symbol/Function.cpp b/lldb/source/Symbol/Function.cpp
index 41a708c27d4..52b135673d1 100644
--- a/lldb/source/Symbol/Function.cpp
+++ b/lldb/source/Symbol/Function.cpp
@@ -414,7 +414,7 @@ Function::GetReturnType ()
// Null out everything below the CompUnit 'cause we don't actually know these.
size_t bit_size = ClangASTType::GetClangTypeBitWidth ((GetType()->GetClangASTContext().getASTContext()), fun_return_qualtype.getAsOpaquePtr());
- Type return_type (0, GetType()->GetSymbolFile(), fun_return_name, bit_size, sc.comp_unit, 0, Type::eTypeUIDSynthetic, Declaration(), fun_return_qualtype.getAsOpaquePtr());
+ Type return_type (0, GetType()->GetSymbolFile(), fun_return_name, bit_size, sc.comp_unit, 0, Type::eEncodingIsSyntheticUID, Declaration(), fun_return_qualtype.getAsOpaquePtr(), false);
return return_type;
}
@@ -455,7 +455,7 @@ Function::GetArgumentTypeAtIndex (size_t idx)
// Null out everything below the CompUnit 'cause we don't actually know these.
size_t bit_size = ClangASTType::GetClangTypeBitWidth ((GetType()->GetClangASTContext().getASTContext()), arg_qualtype.getAsOpaquePtr());
- Type arg_type (0, GetType()->GetSymbolFile(), arg_return_name, bit_size, sc.comp_unit, 0, Type::eTypeUIDSynthetic, Declaration(), arg_qualtype.getAsOpaquePtr());
+ Type arg_type (0, GetType()->GetSymbolFile(), arg_return_name, bit_size, sc.comp_unit, 0, Type::eEncodingIsSyntheticUID, Declaration(), arg_qualtype.getAsOpaquePtr(), false);
return arg_type;
}
diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp
index a4f0410e883..4605dff111b 100644
--- a/lldb/source/Symbol/Type.cpp
+++ b/lldb/source/Symbol/Type.cpp
@@ -33,22 +33,24 @@ lldb_private::Type::Type
lldb::user_id_t uid,
SymbolFile* symbol_file,
const ConstString &name,
- uint64_t byte_size,
+ uint32_t byte_size,
SymbolContextScope *context,
- lldb::user_id_t encoding_uid,
- EncodingUIDType encoding_uid_type,
+ uintptr_t encoding_data,
+ EncodingDataType encoding_data_type,
const Declaration& decl,
- clang_type_t clang_type
+ clang_type_t clang_type,
+ bool is_forward_decl
) :
UserID (uid),
m_name (name),
- m_byte_size (byte_size),
m_symbol_file (symbol_file),
m_context (context),
- m_encoding_uid (encoding_uid),
- m_encoding_uid_type (encoding_uid_type),
+ m_byte_size (byte_size),
+ m_encoding_data_type (encoding_data_type),
+ m_encoding_data (encoding_data),
m_decl (decl),
- m_clang_qual_type (clang_type)
+ m_clang_qual_type (clang_type),
+ m_is_forward_decl (is_forward_decl)
{
}
@@ -58,10 +60,11 @@ lldb_private::Type::Type () :
m_byte_size (0),
m_symbol_file (NULL),
m_context (),
- m_encoding_uid (0),
- m_encoding_uid_type (eTypeInvalid),
+ m_encoding_data (0),
+ m_encoding_data_type (eEncodingInvalid),
m_decl (),
- m_clang_qual_type (NULL)
+ m_clang_qual_type (NULL),
+ m_is_forward_decl (false)
{
}
@@ -76,7 +79,7 @@ lldb_private::Type::operator= (const Type& rhs)
m_byte_size = rhs.m_byte_size;
m_symbol_file = rhs.m_symbol_file;
m_context = rhs.m_context;
- m_encoding_uid = rhs.m_encoding_uid;
+ m_encoding_data = rhs.m_encoding_data;
m_decl = rhs.m_decl;
m_clang_qual_type = rhs.m_clang_qual_type;
}
@@ -105,19 +108,21 @@ lldb_private::Type::GetDescription (Stream *s, lldb::DescriptionLevel level, boo
ClangASTType::DumpTypeDescription (GetClangAST(), m_clang_qual_type, s);
*s << '"';
}
- else if (m_encoding_uid != LLDB_INVALID_UID)
+ else if (m_encoding_data != LLDB_INVALID_UID)
{
- s->Printf(", type_uid = 0x%8.8x", m_encoding_uid);
- switch (m_encoding_uid_type)
+ s->Printf(", type_uid = 0x%8.8x", m_encoding_data);
+ switch (m_encoding_data_type)
{
- case eIsTypeWithUID: s->PutCString(" (unresolved type)"); break;
- case eIsConstTypeWithUID: s->PutCString(" (unresolved const type)"); break;
- case eIsRestrictTypeWithUID: s->PutCString(" (unresolved restrict type)"); break;
- case eIsVolatileTypeWithUID: s->PutCString(" (unresolved volatile type)"); break;
- case eTypedefToTypeWithUID: s->PutCString(" (unresolved typedef)"); break;
- case ePointerToTypeWithUID: s->PutCString(" (unresolved pointer)"); break;
- case eLValueReferenceToTypeWithUID: s->PutCString(" (unresolved L value reference)"); break;
- case eRValueReferenceToTypeWithUID: s->PutCString(" (unresolved R value reference)"); break;
+ case eEncodingIsUID: s->PutCString(" (unresolved type)"); break;
+ case eEncodingIsConstUID: s->PutCString(" (unresolved const type)"); break;
+ case eEncodingIsRestrictUID: s->PutCString(" (unresolved restrict type)"); break;
+ case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break;
+ case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break;
+ case eEncodingIsPointerUID: s->PutCString(" (unresolved pointer)"); break;
+ case eEncodingIsLValueReferenceUID: s->PutCString(" (unresolved L value reference)"); break;
+ case eEncodingIsRValueReferenceUID: s->PutCString(" (unresolved R value reference)"); break;
+ case eEncodingIsSyntheticUID: s->PutCString(" (synthetic type)"); break;
+ case eEncodingIsTypePtr: s->PutCString(" (Type *)"); break;
}
}
}
@@ -151,19 +156,21 @@ lldb_private::Type::Dump (Stream *s, bool show_context)
ClangASTType::DumpTypeDescription (GetClangAST(), m_clang_qual_type, s);
}
- else if (m_encoding_uid != LLDB_INVALID_UID)
+ else if (m_encoding_data != LLDB_INVALID_UID)
{
- *s << ", type_uid = " << m_encoding_uid;
- switch (m_encoding_uid_type)
+ *s << ", type_data = " << (uint64_t)m_encoding_data;
+ switch (m_encoding_data_type)
{
- case eIsTypeWithUID: s->PutCString(" (unresolved type)"); break;
- case eIsConstTypeWithUID: s->PutCString(" (unresolved const type)"); break;
- case eIsRestrictTypeWithUID: s->PutCString(" (unresolved restrict type)"); break;
- case eIsVolatileTypeWithUID: s->PutCString(" (unresolved volatile type)"); break;
- case eTypedefToTypeWithUID: s->PutCString(" (unresolved typedef)"); break;
- case ePointerToTypeWithUID: s->PutCString(" (unresolved pointer)"); break;
- case eLValueReferenceToTypeWithUID: s->PutCString(" (unresolved L value reference)"); break;
- case eRValueReferenceToTypeWithUID: s->PutCString(" (unresolved R value reference)"); break;
+ case eEncodingIsUID: s->PutCString(" (unresolved type)"); break;
+ case eEncodingIsConstUID: s->PutCString(" (unresolved const type)"); break;
+ case eEncodingIsRestrictUID: s->PutCString(" (unresolved restrict type)"); break;
+ case eEncodingIsVolatileUID: s->PutCString(" (unresolved volatile type)"); break;
+ case eEncodingIsTypedefUID: s->PutCString(" (unresolved typedef)"); break;
+ case eEncodingIsPointerUID: s->PutCString(" (unresolved pointer)"); break;
+ case eEncodingIsLValueReferenceUID: s->PutCString(" (unresolved L value reference)"); break;
+ case eEncodingIsRValueReferenceUID: s->PutCString(" (unresolved R value reference)"); break;
+ case eEncodingIsSyntheticUID: s->PutCString(" (synthetic type)"); break;
+ case eEncodingIsTypePtr: s->PutCString(" (Type *)"); break;
}
}
@@ -241,16 +248,16 @@ lldb_private::Type::GetByteSize()
{
if (m_byte_size == 0)
{
- switch (m_encoding_uid_type)
+ switch (m_encoding_data_type)
{
- case eIsTypeWithUID:
- case eIsConstTypeWithUID:
- case eIsRestrictTypeWithUID:
- case eIsVolatileTypeWithUID:
- case eTypedefToTypeWithUID:
- if (m_encoding_uid != LLDB_INVALID_UID)
+ case eEncodingIsUID:
+ case eEncodingIsConstUID:
+ case eEncodingIsRestrictUID:
+ case eEncodingIsVolatileUID:
+ case eEncodingIsTypedefUID:
+ if (m_encoding_data != LLDB_INVALID_UID)
{
- Type *encoding_type = m_symbol_file->ResolveTypeUID (m_encoding_uid);
+ Type *encoding_type = m_symbol_file->ResolveTypeUID (m_encoding_data);
if (encoding_type)
m_byte_size = encoding_type->GetByteSize();
}
@@ -262,9 +269,9 @@ lldb_private::Type::GetByteSize()
break;
// If we are a pointer or reference, then this is just a pointer size;
- case ePointerToTypeWithUID:
- case eLValueReferenceToTypeWithUID:
- case eRValueReferenceToTypeWithUID:
+ case eEncodingIsPointerUID:
+ case eEncodingIsLValueReferenceUID:
+ case eEncodingIsRValueReferenceUID:
m_byte_size = GetTypeList()->GetClangASTContext().GetPointerBitSize() / 8;
break;
}
@@ -400,113 +407,132 @@ lldb_private::Type::GetDeclaration () const
bool
lldb_private::Type::ResolveClangType (bool forward_decl_is_ok)
{
+// static int g_depth = 0;
+// g_depth++;
+// printf ("%.*sType::ResolveClangType (forward = %i) uid = 0x%8.8x, name = %s\n", g_depth, "", forward_decl_is_ok, m_uid, m_name.AsCString());
+ Type *encoding_type = NULL;
if (m_clang_qual_type == NULL)
{
TypeList *type_list = GetTypeList();
- if (m_encoding_uid != LLDB_INVALID_UID)
+ if (m_encoding_data != LLDB_INVALID_UID)
{
- Type *encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_uid);
+ encoding_type = m_symbol_file->ResolveTypeUID(m_encoding_data);
if (encoding_type)
{
-
- switch (m_encoding_uid_type)
+ switch (m_encoding_data_type)
{
- case eIsTypeWithUID:
+ case eEncodingIsUID:
m_clang_qual_type = encoding_type->GetClangType();
break;
- case eIsConstTypeWithUID:
- m_clang_qual_type = ClangASTContext::AddConstModifier (encoding_type->GetClangType(forward_decl_is_ok));
+ case eEncodingIsConstUID:
+ m_clang_qual_type = ClangASTContext::AddConstModifier (encoding_type->GetClangType(true));
break;
- case eIsRestrictTypeWithUID:
- m_clang_qual_type = ClangASTContext::AddRestrictModifier (encoding_type->GetClangType(forward_decl_is_ok));
+ case eEncodingIsRestrictUID:
+ m_clang_qual_type = ClangASTContext::AddRestrictModifier (encoding_type->GetClangType(true));
break;
- case eIsVolatileTypeWithUID:
- m_clang_qual_type = ClangASTContext::AddVolatileModifier (encoding_type->GetClangType(forward_decl_is_ok));
+ case eEncodingIsVolatileUID:
+ m_clang_qual_type = ClangASTContext::AddVolatileModifier (encoding_type->GetClangType(true));
break;
- case eTypedefToTypeWithUID:
- m_clang_qual_type = type_list->CreateClangTypedefType (this, encoding_type, forward_decl_is_ok);
+ case eEncodingIsTypedefUID:
+ m_clang_qual_type = type_list->CreateClangTypedefType (this, encoding_type, true);
// Clear the name so it can get fully qualified in case the
// typedef is in a namespace.
m_name.Clear();
break;
- case ePointerToTypeWithUID:
- m_clang_qual_type = type_list->CreateClangPointerType (encoding_type, forward_decl_is_ok);
+ case eEncodingIsPointerUID:
+ m_clang_qual_type = type_list->CreateClangPointerType (encoding_type, true);
break;
- case eLValueReferenceToTypeWithUID:
- m_clang_qual_type = type_list->CreateClangLValueReferenceType (encoding_type, forward_decl_is_ok);
+ case eEncodingIsLValueReferenceUID:
+ m_clang_qual_type = type_list->CreateClangLValueReferenceType (encoding_type, true);
break;
- case eRValueReferenceToTypeWithUID:
- m_clang_qual_type = type_list->CreateClangRValueReferenceType (encoding_type, forward_decl_is_ok);
+ case eEncodingIsRValueReferenceUID:
+ m_clang_qual_type = type_list->CreateClangRValueReferenceType (encoding_type, true);
break;
default:
- assert(!"Unhandled encoding_uid_type.");
+ assert(!"Unhandled encoding_data_type.");
break;
}
+
+ if (encoding_type)
+ {
+ m_encoding_data_type = eEncodingIsTypePtr;
+ m_encoding_data = (uintptr_t)encoding_type;
+ }
}
- // Return here since we won't need to check if this is a forward
- // declaration below since we already obeyed this above.
- return m_clang_qual_type != NULL;
}
else
{
// We have no encoding type, return void?
clang_type_t void_clang_type = type_list->GetClangASTContext().GetBuiltInType_void();
- switch (m_encoding_uid_type)
+ switch (m_encoding_data_type)
{
- case eIsTypeWithUID:
+ case eEncodingIsUID:
m_clang_qual_type = void_clang_type;
break;
- case eIsConstTypeWithUID:
+ case eEncodingIsConstUID:
m_clang_qual_type = ClangASTContext::AddConstModifier (void_clang_type);
break;
- case eIsRestrictTypeWithUID:
+ case eEncodingIsRestrictUID:
m_clang_qual_type = ClangASTContext::AddRestrictModifier (void_clang_type);
break;
- case eIsVolatileTypeWithUID:
+ case eEncodingIsVolatileUID:
m_clang_qual_type = ClangASTContext::AddVolatileModifier (void_clang_type);
break;
- case eTypedefToTypeWithUID:
+ case eEncodingIsTypedefUID:
m_clang_qual_type = type_list->GetClangASTContext().CreateTypedefType (m_name.AsCString(), void_clang_type, NULL);
break;
- case ePointerToTypeWithUID:
+ case eEncodingIsPointerUID:
m_clang_qual_type = type_list->GetClangASTContext().CreatePointerType (void_clang_type);
break;
- case eLValueReferenceToTypeWithUID:
+ case eEncodingIsLValueReferenceUID:
m_clang_qual_type = type_list->GetClangASTContext().CreateLValueReferenceType (void_clang_type);
break;
- case eRValueReferenceToTypeWithUID:
+ case eEncodingIsRValueReferenceUID:
m_clang_qual_type = type_list->GetClangASTContext().CreateRValueReferenceType (void_clang_type);
break;
default:
- assert(!"Unhandled encoding_uid_type.");
+ assert(!"Unhandled encoding_data_type.");
break;
}
}
}
// Check if we have a forward reference to a class/struct/union/enum?
- if (!forward_decl_is_ok && !ClangASTType::IsDefined (m_clang_qual_type))
+ if (m_is_forward_decl && m_clang_qual_type && !forward_decl_is_ok)
{
- // We have a forward declaration, we need to resolve it to a complete
- // definition.
- m_symbol_file->ResolveClangOpaqueTypeDefinition (m_clang_qual_type);
+ m_is_forward_decl = false;
+ if (!ClangASTType::IsDefined (m_clang_qual_type))
+ {
+ // We have a forward declaration, we need to resolve it to a complete
+ // definition.
+ m_symbol_file->ResolveClangOpaqueTypeDefinition (m_clang_qual_type);
+ }
+ else
+ {
+ if (encoding_type == NULL)
+ encoding_type = GetEncodingType ();
+ if (encoding_type != NULL)
+ encoding_type->ResolveClangType (forward_decl_is_ok);
+ }
}
+// if (g_depth > 0)
+// --g_depth;
return m_clang_qual_type != NULL;
}
diff --git a/lldb/tools/debugserver/debugserver.xcodeproj/project.pbxproj b/lldb/tools/debugserver/debugserver.xcodeproj/project.pbxproj
index e3c8d0be14d..b49a1c76c23 100644
--- a/lldb/tools/debugserver/debugserver.xcodeproj/project.pbxproj
+++ b/lldb/tools/debugserver/debugserver.xcodeproj/project.pbxproj
@@ -369,6 +369,7 @@
isa = PBXProject;
buildConfigurationList = 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "debugserver" */;
compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
OpenPOWER on IntegriCloud