diff options
40 files changed, 858 insertions, 2237 deletions
diff --git a/lldb/include/lldb/Core/ArchSpec.h b/lldb/include/lldb/Core/ArchSpec.h index 93f79dd563f..a479f47973e 100644 --- a/lldb/include/lldb/Core/ArchSpec.h +++ b/lldb/include/lldb/Core/ArchSpec.h @@ -13,37 +13,86 @@ #if defined(__cplusplus) #include "lldb/lldb-private.h" +#include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" namespace lldb_private { +struct CoreDefinition; + //---------------------------------------------------------------------- /// @class ArchSpec ArchSpec.h "lldb/Core/ArchSpec.h" /// @brief An architecture specification class. /// -/// A class designed to be created from a cpu type and subtype, or a -/// string representation. Keeping all of the conversions of strings -/// to architecture enumeration values confined to this class allows -/// new architecture support to be added easily. +/// A class designed to be created from a cpu type and subtype, a +/// string representation, or an llvm::Triple. Keeping all of the +/// conversions of strings to architecture enumeration values confined +/// to this class allows new architecture support to be added easily. //---------------------------------------------------------------------- class ArchSpec { public: - // Generic CPU types that each m_type needs to know how to convert - // their m_cpu and m_sub to. - enum CPU + enum Core { - eCPU_Unknown, - eCPU_arm, - eCPU_i386, - eCPU_x86_64, - eCPU_ppc, - eCPU_ppc64, - eCPU_sparc + eCore_alpha_generic, + + eCore_arm_generic, + eCore_arm_armv4, + eCore_arm_armv4t, + eCore_arm_armv5, + eCore_arm_armv5t, + eCore_arm_armv6, + eCore_arm_armv7, + eCore_arm_xscale, + + eCore_ppc_generic, + eCore_ppc_ppc601, + eCore_ppc_ppc602, + eCore_ppc_ppc603, + eCore_ppc_ppc603e, + eCore_ppc_ppc603ev, + eCore_ppc_ppc604, + eCore_ppc_ppc604e, + eCore_ppc_ppc620, + eCore_ppc_ppc750, + eCore_ppc_ppc7400, + eCore_ppc_ppc7450, + eCore_ppc_ppc970, + + eCore_ppc64_generic, + eCore_ppc64_ppc970_64, + + eCore_sparc_generic, + + eCore_sparc9_generic, + + eCore_x86_32_i386, + eCore_x86_32_i486, + eCore_x86_32_i486sx, + + eCore_x86_64_x86_64, + kNumCores, + + kCore_invalid, + // The following constants are used for wildcard matching only + kCore_any, + + kCore_arm_any, + kCore_arm_first = eCore_arm_generic, + kCore_arm_last = eCore_arm_xscale, + + kCore_ppc_any, + kCore_ppc_first = eCore_ppc_generic, + kCore_ppc_last = eCore_ppc_ppc970, + + kCore_ppc64_any, + kCore_ppc64_first = eCore_ppc64_generic, + kCore_ppc64_last = eCore_ppc64_ppc970_64, + + kCore_x86_32_any, + kCore_x86_32_first = eCore_x86_32_i386, + kCore_x86_32_last = eCore_x86_32_i486sx }; - - static void - Initialize(); //------------------------------------------------------------------ /// Default constructor. @@ -54,30 +103,22 @@ public: ArchSpec (); //------------------------------------------------------------------ - /// Constructor with cpu type and subtype. + /// Constructor over triple. /// - /// Constructor that initializes the object with supplied cpu and - /// subtypes. + /// Constructs an ArchSpec with properties consistent with the given + /// Triple. //------------------------------------------------------------------ - ArchSpec (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub); - + ArchSpec (const llvm::Triple &triple); + ArchSpec (const char *triple_cstr); //------------------------------------------------------------------ - /// Construct with architecture name. - /// - /// Constructor that initializes the object with supplied - /// architecture name. There are also predefined values in - /// Defines.h: - /// @li \c LLDB_ARCH_DEFAULT - /// The arch the current system defaults to when a program is - /// launched without any extra attributes or settings. + /// Constructor over architecture name. /// - /// @li \c LLDB_ARCH_DEFAULT_32BIT - /// The 32 bit arch the current system defaults to (if any) - /// - /// @li \c LLDB_ARCH_DEFAULT_32BIT - /// The 64 bit arch the current system defaults to (if any) + /// Constructs an ArchSpec with properties consistent with the given + /// object type and architecture name. //------------------------------------------------------------------ - ArchSpec (const char *arch_name); + ArchSpec (lldb::ArchitectureType arch_type, + uint32_t cpu_type, + uint32_t cpu_subtype); //------------------------------------------------------------------ /// Destructor. @@ -92,40 +133,19 @@ public: /// /// @param[in] rhs another ArchSpec object to copy. /// - /// @return a const reference to this object + /// @return A const reference to this object. //------------------------------------------------------------------ const ArchSpec& operator= (const ArchSpec& rhs); //------------------------------------------------------------------ - /// Get a string representation of the contained architecture. - /// - /// Gets a C string representation of the current architecture. - /// If the returned string is a valid architecture name, the string - /// came from a constant string values that do not need to be freed. - /// If the returned string uses the "N.M" format, the string comes - /// from a static buffer that should be copied. + /// Returns a static string representing the current architecture. /// - /// @return a NULL terminated C string that does not need to be - /// freed. + /// @return A static string correcponding to the current + /// architecture. //------------------------------------------------------------------ const char * - AsCString () const; - - //------------------------------------------------------------------ - /// Returns a string representation of the supplied architecture. - /// - /// Class function to get a C string representation given a CPU type - /// and subtype. - /// - /// @param[in] cpu The cpu type of the architecture. - /// @param[in] subtype The cpu subtype of the architecture. - /// - /// @return a NULL terminated C string that does not need to be - /// freed. - //------------------------------------------------------------------ - static const char * - AsCString (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t subtype); + GetArchitectureName () const; //------------------------------------------------------------------ /// Clears the object state. @@ -144,107 +164,33 @@ public: uint32_t GetAddressByteSize () const; - void - SetAddressByteSize (uint32_t byte_size) - { - m_addr_byte_size = byte_size; - } - - CPU - GetGenericCPUType () const; - - //------------------------------------------------------------------ - /// CPU subtype get accessor. - /// - /// @return The current value of the CPU subtype. - //------------------------------------------------------------------ - uint32_t - GetCPUSubtype () const; - - //------------------------------------------------------------------ - /// CPU type get accessor. - /// - /// @return The current value of the CPU type. - //------------------------------------------------------------------ - uint32_t - GetCPUType () const; - - //------------------------------------------------------------------ - /// Feature flags get accessor. - /// - /// @return The current value of the CPU feature flags. - //------------------------------------------------------------------ - uint32_t - GetFeatureFlags () const; - - //------------------------------------------------------------------ - /// Get register names of the current architecture. - /// - /// Get register names of the current architecture given - /// a register number, and a flavor for that register number. - /// There are many different register numbering schemes used - /// on a host: - /// @li \c eRegisterKindGCC - gcc compiler register numbering - /// @li \c eRegisterKindDWARF - DWARF register numbering - /// - /// @param[in] reg_num The register number to decode. - /// @param[in] flavor The flavor of the \a reg_num. - /// - /// @return the name of the register as a NULL terminated C string, - /// or /c NULL if the \a reg_num is invalid for \a flavor. - /// String values that are returned do not need to be freed. - //------------------------------------------------------------------ - const char * - GetRegisterName (uint32_t reg_num, uint32_t flavor) const; - //------------------------------------------------------------------ - /// Get register names for a specified architecture. + /// Returns a machine family for the current architecture. /// - /// Get register names of the specified architecture given - /// a register number, and a flavor for that register number. - /// There are many different register numbering schemes used - /// on a host: - /// - /// @li compiler register numbers (@see eRegisterKindGCC) - /// @li DWARF register numbers (@see eRegisterKindDWARF) - /// - /// @param[in] cpu The cpu type of the architecture specific - /// register - /// @param[in] subtype The cpu subtype of the architecture specific - /// register - /// @param[in] reg_num The register number to decode. - /// @param[in] flavor The flavor of the \a reg_num. - /// - /// @return the name of the register as a NULL terminated C string, - /// or /c NULL if the \a reg_num is invalid for \a flavor. - /// String values that are returned do not need to be freed. + /// @return An LLVM arch type. //------------------------------------------------------------------ - static const char * - GetRegisterName (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t subtype, uint32_t reg_num, uint32_t flavor); + llvm::Triple::ArchType + GetMachine () const; //------------------------------------------------------------------ - /// Test if the contained architecture is valid. + /// Tests if this ArchSpec is valid. /// - /// @return true if the current architecture is valid, false + /// @return True if the current architecture is valid, false /// otherwise. //------------------------------------------------------------------ bool - IsValid () const; + IsValid () const + { + return m_core >= eCore_alpha_generic && m_core < kNumCores; + } - //------------------------------------------------------------------ - /// Get the memory cost of this object. - /// - /// @return - /// The number of bytes that this object occupies in memory. - //------------------------------------------------------------------ - size_t - MemorySize() const; //------------------------------------------------------------------ - /// Change the CPU type and subtype given an architecture name. + /// Sets this ArchSpec according to the given architecture name. + /// + /// The architecture name can be one of the generic system default + /// values: /// - /// The architecture name supplied can also by one of the generic - /// system default values: /// @li \c LLDB_ARCH_DEFAULT - The arch the current system defaults /// to when a program is launched without any extra /// attributes or settings. @@ -253,25 +199,43 @@ public: /// @li \c LLDB_ARCH_DEFAULT_64BIT - The default host architecture /// for 64 bit (if any). /// + /// Alternatively, if the object type of this ArchSpec has been + /// configured, a concrete architecture can be specified to set + /// the CPU type ("x86_64" for example). + /// + /// Finally, an encoded object and archetecture format is accepted. + /// The format contains an object type (like "macho" or "elf"), + /// followed by a platform dependent encoding of CPU type and + /// subtype. For example: + /// + /// "macho" : Specifies an object type of MachO. + /// "macho-16-6" : MachO specific encoding for ARMv6. + /// "elf-43 : ELF specific encoding for Sparc V9. + /// /// @param[in] arch_name The name of an architecture. /// - /// @return true if \a arch_name was successfully transformed into - /// a valid cpu type and subtype. + /// @return True if @p arch_name was successfully translated, false + /// otherwise. //------------------------------------------------------------------ - bool - SetArch (const char *arch_name); - - bool - SetArchFromTargetTriple (const char *arch_name); +// bool +// SetArchitecture (const llvm::StringRef& arch_name); +// +// bool +// SetArchitecture (const char *arch_name); + //------------------------------------------------------------------ - /// Change the CPU type and subtype given new values of the cpu - /// type and subtype. + /// Change the architecture object type and CPU type. + /// + /// @param[in] arch_type The object type of this ArchSpec. + /// + /// @param[in] cpu The required CPU type. /// - /// @param[in] cpu The new CPU type - /// @param[in] subtype The new CPU subtype + /// @return True if the object and CPU type were sucessfully set. //------------------------------------------------------------------ - void - SetMachOArch (uint32_t cpu, uint32_t sub); + bool + SetArchitecture (lldb::ArchitectureType arch_type, + uint32_t cpu, + uint32_t sub); //------------------------------------------------------------------ /// Returns the byte order for the architecture specification. @@ -280,78 +244,88 @@ public: /// the architecture specification //------------------------------------------------------------------ lldb::ByteOrder - GetByteOrder () const - { - return m_byte_order; - } + GetByteOrder () const; + //------------------------------------------------------------------ + /// Sets this ArchSpec's byte order. + /// + /// In the common case there is no need to call this method as the + /// byte order can almost always be determined by the architecture. + /// However, many CPU's are bi-endian (ARM, Alpha, PowerPC, etc) + /// and the default/assumed byte order may be incorrect. + //------------------------------------------------------------------ void - SetByteOrder (lldb::ByteOrder b) + SetByteOrder (lldb::ByteOrder byteorder); + + Core + GetCore () const { - m_byte_order = b; + return m_core; } + uint32_t + GetMachOCPUType () const; + + uint32_t + GetMachOCPUSubType () const; + + //------------------------------------------------------------------ + /// Architecture tripple accessor. + /// + /// @return A triple describing this ArchSpec. + //------------------------------------------------------------------ llvm::Triple & GetTriple () { return m_triple; } - + + //------------------------------------------------------------------ + /// Architecture tripple accessor. + /// + /// @return A triple describing this ArchSpec. + //------------------------------------------------------------------ const llvm::Triple & GetTriple () const { return m_triple; } - - void - SetTriple (const llvm::Triple &triple) - { - m_triple = triple; - } - void - SetElfArch (uint32_t cpu, uint32_t sub) - { - m_type = lldb::eArchTypeELF; - m_cpu = cpu; - m_sub = sub; - } + //------------------------------------------------------------------ + /// Architecture tripple setter. + /// + /// Configures this ArchSpec according to the given triple. At a + /// minimum, the given triple must describe a valid operating + /// system. If archetecture or environment components are present + /// they too will be used to further resolve the CPU type and + /// subtype, endian characteristics, etc. + /// + /// @return A triple describing this ArchSpec. + //------------------------------------------------------------------ + bool + SetTriple (const llvm::Triple &triple); + bool + SetTriple (const char *triple_cstr); + //------------------------------------------------------------------ /// Returns the default endianness of the architecture. /// /// @return The endian enumeration for the default endianness of - /// the architecture. + /// the architecture. //------------------------------------------------------------------ lldb::ByteOrder GetDefaultEndian () const; - - lldb::ArchitectureType - GetType() const - { - return m_type; - } - protected: - //------------------------------------------------------------------ - // Member variables - //------------------------------------------------------------------ - lldb::ArchitectureType m_type; - // m_type => eArchTypeMachO eArchTypeELF - uint32_t m_cpu; // cpu type ELF header e_machine - uint32_t m_sub; // cpu subtype nothing llvm::Triple m_triple; + Core m_core; lldb::ByteOrder m_byte_order; - uint32_t m_addr_byte_size; - -private: - - void - MachOArchUpdated (size_t macho_idx = ~(size_t)0); - + + // Called when m_def or m_entry are changed. Fills in all remaining + // members with default values. void - ELFArchUpdated (size_t idx = ~(size_t)0); + CoreUpdated (bool update_triple); }; diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h index 400777cf9d4..1591f66b429 100644 --- a/lldb/include/lldb/Target/Target.h +++ b/lldb/include/lldb/Target/Target.h @@ -153,7 +153,7 @@ public: GetDefaultArchitecture (); static void - SetDefaultArchitecture (ArchSpec new_arch); + SetDefaultArchitecture (const ArchSpec &arch); void UpdateInstanceName (); @@ -534,6 +534,11 @@ public: static SettingEntry global_settings_table[]; static SettingEntry instance_settings_table[]; + ArchSpec & + GetArchitecture () + { + return m_default_architecture; + } protected: lldb::InstanceSettingsSP diff --git a/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme b/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme index 62ebd01993b..455e6093aa7 100644 --- a/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme +++ b/lldb/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme @@ -72,11 +72,11 @@ </EnvironmentVariables> </TestAction> <LaunchAction - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" displayScaleIsEnabled = "NO" displayScale = "1.00" - launchStyle = "1" + launchStyle = "0" useCustomWorkingDirectory = "NO" buildConfiguration = "Debug"> <BuildableProductRunnable> @@ -88,6 +88,20 @@ ReferencedContainer = "container:lldb.xcodeproj"> </BuildableReference> </BuildableProductRunnable> + <CommandLineArguments> + <CommandLineArgument + argument = "/Volumes/work/gclayton/Documents/src/attach/a.out" + isEnabled = "YES"> + </CommandLineArgument> + <CommandLineArgument + argument = "/Volumes/work/gclayton/Documents/src/lldb/test/abbreviation_tests/a.out" + isEnabled = "NO"> + </CommandLineArgument> + <CommandLineArgument + argument = "/Volumes/work/gclayton/Documents/src/lldb/test/alias_tests/a.out" + isEnabled = "NO"> + </CommandLineArgument> + </CommandLineArguments> <EnvironmentVariables> <EnvironmentVariable key = "LLDB_LAUNCH_FLAG_DISABLE_ASLR" diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 430700d1896..2adf7963357 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -341,7 +341,7 @@ SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) if (default_arch.IsValid()) { - ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString()); + ::snprintf (arch_name, arch_name_len, "%s", default_arch.GetArchitectureName()); return true; } } @@ -423,7 +423,7 @@ SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, { ArchSpec arch; FileSpec file_spec (filename, true); - arch.SetArchFromTargetTriple(target_triple); + arch.SetTriple (target_triple); TargetSP target_sp; Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp)); target.reset (target_sp); @@ -440,7 +440,7 @@ SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, } SBTarget -SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname) +SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *arch_cstr) { LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); @@ -448,31 +448,28 @@ SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archn if (m_opaque_sp) { FileSpec file (filename, true); - ArchSpec arch = lldb_private::Target::GetDefaultArchitecture (); + ArchSpec arch; TargetSP target_sp; Error error; - if (archname != NULL) - { - ArchSpec arch2 (archname); - error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp); - } + if (arch_cstr) + arch.SetTriple (arch_cstr); else - { - if (!arch.IsValid()) - arch = LLDB_ARCH_DEFAULT; + arch = lldb_private::Target::GetDefaultArchitecture (); - error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); + if (!arch.IsValid()) + arch.SetTriple (LLDB_ARCH_DEFAULT); - if (error.Fail()) - { - if (arch == LLDB_ARCH_DEFAULT_32BIT) - arch = LLDB_ARCH_DEFAULT_64BIT; - else - arch = LLDB_ARCH_DEFAULT_32BIT; + error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); - error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); - } + if (error.Fail()) + { + if (strcmp (LLDB_ARCH_DEFAULT, LLDB_ARCH_DEFAULT_32BIT) == 0) + arch.SetTriple (LLDB_ARCH_DEFAULT_64BIT); + else + arch.SetTriple (LLDB_ARCH_DEFAULT_32BIT); + + error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); } if (error.Success()) @@ -485,7 +482,7 @@ SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archn if (log) { log->Printf ("SBDebugger(%p)::CreateTargetWithFileAndArch (filename=\"%s\", arch=%s) => SBTarget(%p)", - m_opaque_sp.get(), filename, archname, target.get()); + m_opaque_sp.get(), filename, arch_cstr, target.get()); } return target; @@ -503,16 +500,16 @@ SBDebugger::CreateTarget (const char *filename) Error error; if (!arch.IsValid()) - arch = LLDB_ARCH_DEFAULT; + arch.SetTriple (LLDB_ARCH_DEFAULT); error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); if (error.Fail()) { - if (arch == LLDB_ARCH_DEFAULT_32BIT) - arch = LLDB_ARCH_DEFAULT_64BIT; + if (strcmp (LLDB_ARCH_DEFAULT, LLDB_ARCH_DEFAULT_32BIT) == 0) + arch.SetTriple (LLDB_ARCH_DEFAULT_64BIT); else - arch = LLDB_ARCH_DEFAULT_32BIT; + arch.SetTriple (LLDB_ARCH_DEFAULT_32BIT); error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp); } @@ -563,9 +560,7 @@ SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_na if (m_opaque_sp && filename && filename[0]) { // No need to lock, the target list is thread safe - ArchSpec arch; - if (arch_name) - arch.SetArch(arch_name); + ArchSpec arch (arch_name); TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL)); sb_target.reset(target_sp); } diff --git a/lldb/source/Commands/CommandObjectDisassemble.cpp b/lldb/source/Commands/CommandObjectDisassemble.cpp index 63d893708a2..f949030479b 100644 --- a/lldb/source/Commands/CommandObjectDisassemble.cpp +++ b/lldb/source/Commands/CommandObjectDisassemble.cpp @@ -185,7 +185,7 @@ CommandObjectDisassemble::Execute if (disassembler == NULL) { - result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture.\n", arch.AsCString()); + result.AppendErrorWithFormat ("Unable to find Disassembler plug-in for %s architecture.\n", arch.GetArchitectureName()); result.SetStatus (eReturnStatusFailed); return false; } diff --git a/lldb/source/Commands/CommandObjectFile.cpp b/lldb/source/Commands/CommandObjectFile.cpp index 45dc2a968e6..50f33940a38 100644 --- a/lldb/source/Commands/CommandObjectFile.cpp +++ b/lldb/source/Commands/CommandObjectFile.cpp @@ -145,7 +145,7 @@ CommandObjectFile::Execute if (target_sp) { debugger.GetTargetList().SetSelectedTarget(target_sp.get()); - result.AppendMessageWithFormat ("Current executable set to '%s' (%s).\n", file_path, target_sp->GetArchitecture().AsCString()); + result.AppendMessageWithFormat ("Current executable set to '%s' (%s).\n", file_path, target_sp->GetArchitecture().GetArchitectureName()); result.SetStatus (eReturnStatusSuccessFinishNoResult); } else diff --git a/lldb/source/Commands/CommandObjectImage.cpp b/lldb/source/Commands/CommandObjectImage.cpp index 771562a8f2c..0092b39a816 100644 --- a/lldb/source/Commands/CommandObjectImage.cpp +++ b/lldb/source/Commands/CommandObjectImage.cpp @@ -42,9 +42,9 @@ DumpModuleArchitecture (Stream &strm, Module *module, uint32_t width) if (module) { if (width) - strm.Printf("%-*s", width, module->GetArchitecture().AsCString()); + strm.Printf("%-*s", width, module->GetArchitecture().GetArchitectureName()); else - strm.PutCString(module->GetArchitecture().AsCString()); + strm.PutCString(module->GetArchitecture().GetArchitectureName()); } } @@ -183,7 +183,7 @@ DumpModuleSections (CommandInterpreter &interpreter, Stream &strm, Module *modul { strm.PutCString ("Sections for '"); strm << module->GetFileSpec(); - strm.Printf ("' (%s):\n", module->GetArchitecture().AsCString()); + strm.Printf ("' (%s):\n", module->GetArchitecture().GetArchitectureName()); strm.IndentMore(); section_list->Dump(&strm, interpreter.GetDebugger().GetExecutionContext().target, true, UINT32_MAX); strm.IndentLess(); diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index 22fd6c2406b..7e18e124d67 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -310,7 +310,7 @@ public: if (error.Success()) { - const char *archname = exe_module->GetArchitecture().AsCString(); + const char *archname = exe_module->GetArchitecture().GetArchitectureName(); result.AppendMessageWithFormat ("Process %i launched: '%s' (%s)\n", process->GetID(), filename, archname); result.SetDidChangeProcessState (true); @@ -328,7 +328,7 @@ public: if (synchronous_execution) { state = process->WaitForProcessToStop (NULL); - if (!StateIsStoppedState(state)); + if (!StateIsStoppedState(state)) { result.AppendErrorWithFormat ("Process isn't stopped: %s", StateAsCString(state)); } @@ -777,12 +777,12 @@ public: if (!old_arch_spec.IsValid()) { - result.AppendMessageWithFormat ("Architecture set to: %s.\n", target->GetArchitecture().AsCString()); + result.AppendMessageWithFormat ("Architecture set to: %s.\n", target->GetArchitecture().GetArchitectureName()); } else if (old_arch_spec != target->GetArchitecture()) { result.AppendWarningWithFormat("Architecture changed from %s to %s.\n", - old_arch_spec.AsCString(), target->GetArchitecture().AsCString()); + old_arch_spec.GetArchitectureName(), target->GetArchitecture().GetArchitectureName()); } } return result.Succeeded(); diff --git a/lldb/source/Core/ArchSpec.cpp b/lldb/source/Core/ArchSpec.cpp index a17c0aaf4fb..a5493b3954d 100644 --- a/lldb/source/Core/ArchSpec.cpp +++ b/lldb/source/Core/ArchSpec.cpp @@ -21,1937 +21,597 @@ using namespace lldb; using namespace lldb_private; -#define ARCH_SPEC_SEPARATOR_CHAR '-' +#define ARCH_SPEC_SEPARATOR_CHAR '-' +namespace lldb_private { -//---------------------------------------------------------------------- -// A structure that describes all of the information we want to know -// about each architecture. -//---------------------------------------------------------------------- -struct ArchDefinition -{ - ByteOrder byte_order; - uint32_t addr_byte_size; - uint32_t cpu; - uint32_t sub; - const char *name; -}; + struct CoreDefinition + { + ByteOrder default_byte_order; + uint32_t addr_byte_size; + llvm::Triple::ArchType machine; + ArchSpec::Core core; + const char *name; + }; +} -static const char *g_arch_type_strings[] = +// This core information can be looked using the ArchSpec::Core as the index +static const CoreDefinition g_core_definitions[ArchSpec::kNumCores] = { - "invalid", - "mach-o", - "elf" + { eByteOrderLittle, 4, llvm::Triple::alpha , ArchSpec::eCore_alpha_generic , "alpha" }, + + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_generic , "arm" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv4 , "armv4" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv4t , "armv4t" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5 , "armv5" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5t , "armv5t" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv6 , "armv6" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7 , "armv7" }, + { eByteOrderLittle, 4, llvm::Triple::arm , ArchSpec::eCore_arm_xscale , "xscale" }, + + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_generic , "ppc" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc601 , "ppc601" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc602 , "ppc602" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603 , "ppc603" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603e , "ppc603e" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603ev , "ppc603ev" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc604 , "ppc604" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc604e , "ppc604e" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc620 , "ppc620" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc750 , "ppc750" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc7400 , "ppc7400" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc7450 , "ppc7450" }, + { eByteOrderLittle, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc970 , "ppc970" }, + + { eByteOrderLittle, 8, llvm::Triple::ppc64 , ArchSpec::eCore_ppc64_generic , "ppc64" }, + { eByteOrderLittle, 8, llvm::Triple::ppc64 , ArchSpec::eCore_ppc64_ppc970_64 , "ppc970-64" }, + + { eByteOrderLittle, 4, llvm::Triple::sparc , ArchSpec::eCore_sparc_generic , "sparc" }, + { eByteOrderLittle, 8, llvm::Triple::sparcv9, ArchSpec::eCore_sparc9_generic , "sparcv9" }, + + { eByteOrderLittle, 4, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i386 , "i386" }, + { eByteOrderLittle, 4, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486 , "i486" }, + { eByteOrderLittle, 4, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486sx , "i486sx" }, + + { eByteOrderLittle, 8, llvm::Triple::x86_64 , ArchSpec::eCore_x86_64_x86_64 , "x86_64" } }; -#define CPU_ANY (UINT32_MAX) +struct ArchDefinitionEntry +{ + ArchSpec::Core core; + uint32_t cpu; + uint32_t sub; +}; -//---------------------------------------------------------------------- -// A table that gets searched linearly for matches. This table is used -// to convert cpu type and subtypes to architecture names, and to -// convert architecture names to cpu types and subtypes. The ordering -// is important and allows the precedence to be set when the table is -// built. -//---------------------------------------------------------------------- -static ArchDefinition g_mach_arch_defs[] = +struct ArchDefinition { - { eByteOrderInvalid, 0, CPU_ANY, CPU_ANY , "all" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, CPU_ANY , "arm" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 0 , "arm" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 5 , "armv4" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 6 , "armv6" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 7 , "armv5" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 8 , "xscale" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 9 , "armv7" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, CPU_ANY , "ppc" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 0 , "ppc" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 1 , "ppc601" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 2 , "ppc602" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 3 , "ppc603" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 4 , "ppc603e" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 5 , "ppc603ev" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 6 , "ppc604" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 7 , "ppc604e" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 8 , "ppc620" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 9 , "ppc750" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 10 , "ppc7400" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 11 , "ppc7450" }, - { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 100 , "ppc970" }, - { eByteOrderBig, 8, llvm::MachO::CPUTypePowerPC64, 0 , "ppc64" }, - { eByteOrderBig, 8, llvm::MachO::CPUTypePowerPC64, 100 , "ppc970-64" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, 3 , "i386" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, 4 , "i486" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, 0x84 , "i486sx" }, - { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, CPU_ANY , "i386" }, - { eByteOrderLittle, 8, llvm::MachO::CPUTypeX86_64, 3 , "x86_64" }, - { eByteOrderLittle, 8, llvm::MachO::CPUTypeX86_64, CPU_ANY , "x86_64" }, + ArchitectureType type; + size_t num_entries; + const ArchDefinitionEntry *entries; + uint32_t cpu_mask; + uint32_t sub_mask; + const char *name; }; -//---------------------------------------------------------------------- -// Figure out how many architecture definitions we have -//---------------------------------------------------------------------- -const size_t k_num_mach_arch_defs = sizeof(g_mach_arch_defs)/sizeof(ArchDefinition); +#define CPU_ANY (UINT32_MAX) +//===----------------------------------------------------------------------===// +// A table that gets searched linearly for matches. This table is used to +// convert cpu type and subtypes to architecture names, and to convert +// architecture names to cpu types and subtypes. The ordering is important and +// allows the precedence to be set when the table is built. +static const ArchDefinitionEntry g_macho_arch_entries[] = +{ + { ArchSpec::eCore_arm_generic , llvm::MachO::CPUTypeARM , CPU_ANY }, + { ArchSpec::eCore_arm_generic , llvm::MachO::CPUTypeARM , 0 }, + { ArchSpec::eCore_arm_armv4 , llvm::MachO::CPUTypeARM , 5 }, + { ArchSpec::eCore_arm_armv6 , llvm::MachO::CPUTypeARM , 6 }, + { ArchSpec::eCore_arm_armv5 , llvm::MachO::CPUTypeARM , 7 }, + { ArchSpec::eCore_arm_xscale , llvm::MachO::CPUTypeARM , 8 }, + { ArchSpec::eCore_arm_armv7 , llvm::MachO::CPUTypeARM , 9 }, + { ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , CPU_ANY }, + { ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , 0 }, + { ArchSpec::eCore_ppc_ppc601 , llvm::MachO::CPUTypePowerPC , 1 }, + { ArchSpec::eCore_ppc_ppc602 , llvm::MachO::CPUTypePowerPC , 2 }, + { ArchSpec::eCore_ppc_ppc603 , llvm::MachO::CPUTypePowerPC , 3 }, + { ArchSpec::eCore_ppc_ppc603e , llvm::MachO::CPUTypePowerPC , 4 }, + { ArchSpec::eCore_ppc_ppc603ev , llvm::MachO::CPUTypePowerPC , 5 }, + { ArchSpec::eCore_ppc_ppc604 , llvm::MachO::CPUTypePowerPC , 6 }, + { ArchSpec::eCore_ppc_ppc604e , llvm::MachO::CPUTypePowerPC , 7 }, + { ArchSpec::eCore_ppc_ppc620 , llvm::MachO::CPUTypePowerPC , 8 }, + { ArchSpec::eCore_ppc_ppc750 , llvm::MachO::CPUTypePowerPC , 9 }, + { ArchSpec::eCore_ppc_ppc7400 , llvm::MachO::CPUTypePowerPC , 10 }, + { ArchSpec::eCore_ppc_ppc7450 , llvm::MachO::CPUTypePowerPC , 11 }, + { ArchSpec::eCore_ppc_ppc970 , llvm::MachO::CPUTypePowerPC , 100 }, + { ArchSpec::eCore_ppc64_generic , llvm::MachO::CPUTypePowerPC64 , 0 }, + { ArchSpec::eCore_ppc64_ppc970_64 , llvm::MachO::CPUTypePowerPC64 , 100 }, + { ArchSpec::eCore_x86_32_i386 , llvm::MachO::CPUTypeI386 , 3 }, + { ArchSpec::eCore_x86_32_i486 , llvm::MachO::CPUTypeI386 , 4 }, + { ArchSpec::eCore_x86_32_i486sx , llvm::MachO::CPUTypeI386 , 0x84 }, + { ArchSpec::eCore_x86_32_i386 , llvm::MachO::CPUTypeI386 , CPU_ANY }, + { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , 3 }, + { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , CPU_ANY } +}; +static const ArchDefinition g_macho_arch_def = { + eArchTypeMachO, + sizeof(g_macho_arch_entries)/sizeof(g_macho_arch_entries[0]), + g_macho_arch_entries, + UINT32_MAX, // CPU type mask + 0x00FFFFFFu, // CPU subtype mask + "mach-o" +}; -//---------------------------------------------------------------------- -// A table that gets searched linearly for matches. This table is used -// to convert cpu type and subtypes to architecture names, and to -// convert architecture names to cpu types and subtypes. The ordering -// is important and allows the precedence to be set when the table is -// built. -//---------------------------------------------------------------------- -static ArchDefinition g_elf_arch_defs[] = -{ - { eByteOrderInvalid, 0, llvm::ELF::EM_M32 , 0, "m32" }, // AT&T WE 32100 - { eByteOrderBig, 4, llvm::ELF::EM_SPARC , 0, "sparc" }, // Sparc - { eByteOrderLittle, 4, llvm::ELF::EM_386 , 0, "i386" }, // Intel 80386 - { eByteOrderBig, 4, llvm::ELF::EM_68K , 0, "68k" }, // Motorola 68000 - { eByteOrderBig, 4, llvm::ELF::EM_88K , 0, "88k" }, // Motorola 88000 - { eByteOrderLittle, 4, llvm::ELF::EM_486 , 0, "i486" }, // Intel 486 (deprecated) - { eByteOrderLittle, 4, llvm::ELF::EM_860 , 0, "860" }, // Intel 80860 - { eByteOrderBig, 4, llvm::ELF::EM_MIPS , 0, "rs3000" }, // MIPS RS3000 - { eByteOrderBig, 4, llvm::ELF::EM_PPC , 0, "ppc" }, // PowerPC - { eByteOrderBig, 8, 21 , 0, "ppc64" }, // PowerPC64 - { eByteOrderLittle, 4, llvm::ELF::EM_ARM , 0, "arm" }, // ARM - { eByteOrderLittle, 4, llvm::ELF::EM_ALPHA , 0, "alpha" }, // DEC Alpha - { eByteOrderLittle, 4, llvm::ELF::EM_SPARCV9, 0, "sparc9" }, // SPARC V9 - { eByteOrderLittle, 8, llvm::ELF::EM_X86_64 , 0, "x86_64" }, // AMD64 +//===----------------------------------------------------------------------===// +// A table that gets searched linearly for matches. This table is used to +// convert cpu type and subtypes to architecture names, and to convert +// architecture names to cpu types and subtypes. The ordering is important and +// allows the precedence to be set when the table is built. +static const ArchDefinitionEntry g_elf_arch_entries[] = +{ + { ArchSpec::eCore_sparc_generic , llvm::ELF::EM_SPARC , LLDB_INVALID_CPUTYPE }, // Sparc + { ArchSpec::eCore_x86_32_i386 , llvm::ELF::EM_386 , LLDB_INVALID_CPUTYPE }, // Intel 80386 + { ArchSpec::eCore_x86_32_i486 , llvm::ELF::EM_486 , LLDB_INVALID_CPUTYPE }, // Intel 486 (deprecated) + { ArchSpec::eCore_ppc_generic , llvm::ELF::EM_PPC , LLDB_INVALID_CPUTYPE }, // PowerPC + { ArchSpec::eCore_ppc64_generic , llvm::ELF::EM_PPC64 , LLDB_INVALID_CPUTYPE }, // PowerPC64 + { ArchSpec::eCore_arm_generic , llvm::ELF::EM_ARM , LLDB_INVALID_CPUTYPE }, // ARM + { ArchSpec::eCore_alpha_generic , llvm::ELF::EM_ALPHA , LLDB_INVALID_CPUTYPE }, // DEC Alpha + { ArchSpec::eCore_sparc9_generic , llvm::ELF::EM_SPARCV9, LLDB_INVALID_CPUTYPE }, // SPARC V9 + { ArchSpec::eCore_x86_64_x86_64 , llvm::ELF::EM_X86_64 , LLDB_INVALID_CPUTYPE }, // AMD64 }; -//---------------------------------------------------------------------- -// Figure out how many architecture definitions we have -//---------------------------------------------------------------------- -const size_t k_num_elf_arch_defs = sizeof(g_elf_arch_defs)/sizeof(ArchDefinition); +static const ArchDefinition g_elf_arch_def = { + eArchTypeELF, + sizeof(g_elf_arch_entries)/sizeof(g_elf_arch_entries[0]), + g_elf_arch_entries, + UINT32_MAX, // CPU type mask + UINT32_MAX, // CPU subtype mask + "elf", +}; -//---------------------------------------------------------------------- -// Default constructor -//---------------------------------------------------------------------- -ArchSpec::ArchSpec() : - m_type (eArchTypeMachO), // Use the most complete arch definition which will always be translatable to any other ArchitectureType values - m_cpu (LLDB_INVALID_CPUTYPE), - m_sub (0), - m_triple (), - m_byte_order (lldb::endian::InlHostByteOrder()), - m_addr_byte_size (0) -{ -} +//===----------------------------------------------------------------------===// +// Table of all ArchDefinitions +static const ArchDefinition *g_arch_definitions[] = { + &g_macho_arch_def, + &g_elf_arch_def, +}; -//---------------------------------------------------------------------- -// Constructor that initializes the object with supplied cpu and -// subtypes. -//---------------------------------------------------------------------- -ArchSpec::ArchSpec (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub) : - m_type (arch_type), - m_cpu (cpu), - m_sub (sub), - m_triple (), - m_byte_order (lldb::endian::InlHostByteOrder()), - m_addr_byte_size (0) -{ - if (m_type == eArchTypeMachO) - MachOArchUpdated (); -} +static const size_t k_num_arch_definitions = + sizeof(g_arch_definitions) / sizeof(g_arch_definitions[0]); -//---------------------------------------------------------------------- -// Constructor that initializes the object with supplied -// architecture name. There are also predefined values in -// Defines.h: -// LLDB_ARCH_DEFAULT -// The arch the current system defaults to when a program is -// launched without any extra attributes or settings. -// -// LLDB_ARCH_DEFAULT_32BIT -// The 32 bit arch the current system defaults to (if any) -// -// LLDB_ARCH_DEFAULT_32BIT -// The 64 bit arch the current system defaults to (if any) -//---------------------------------------------------------------------- -ArchSpec::ArchSpec (const char *arch_name) : - m_type (eArchTypeMachO), // Use the most complete arch definition which will always be translatable to any other ArchitectureType values - m_cpu (LLDB_INVALID_CPUTYPE), - m_sub (0), - m_triple (), - m_byte_order (lldb::endian::InlHostByteOrder()), - m_addr_byte_size (0) -{ - SetArch (arch_name); -} +//===----------------------------------------------------------------------===// +// Static helper functions. -//---------------------------------------------------------------------- -// Destructor -//---------------------------------------------------------------------- -ArchSpec::~ArchSpec() + +// Get the architecture definition for a given object type. +static const ArchDefinition * +FindArchDefinition (ArchitectureType arch_type) { + for (unsigned int i = 0; i < k_num_arch_definitions; ++i) + { + const ArchDefinition *def = g_arch_definitions[i]; + if (def->type == arch_type) + return def; + } + return NULL; } -//---------------------------------------------------------------------- -// Assignment operator -//---------------------------------------------------------------------- -const ArchSpec& -ArchSpec::operator= (const ArchSpec& rhs) +// Get an architecture definition by name. +static const CoreDefinition * +FindCoreDefinition (llvm::StringRef name) { - if (this != &rhs) + for (unsigned int i = 0; i < ArchSpec::kNumCores; ++i) { - m_type = rhs.m_type; - m_cpu = rhs.m_cpu; - m_sub = rhs.m_sub; - m_triple = rhs.m_triple; - m_byte_order = rhs.m_byte_order; - m_addr_byte_size = rhs.m_addr_byte_size; + if (name.equals_lower(g_core_definitions[i].name)) + return &g_core_definitions[i]; } - return *this; + return NULL; } -//---------------------------------------------------------------------- -// Get a C string representation of the current architecture -//---------------------------------------------------------------------- -const char * -ArchSpec::AsCString() const +static inline const CoreDefinition * +FindCoreDefinition (ArchSpec::Core core) { - return ArchSpec::AsCString(m_type, m_cpu, m_sub); + if (core >= 0 && core < ArchSpec::kNumCores) + return &g_core_definitions[core]; + return NULL; } -//---------------------------------------------------------------------- -// Class function to get a C string representation given a CPU type -// and subtype. -//---------------------------------------------------------------------- -const char * -ArchSpec::AsCString (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub) +// Get a definition entry by cpu type and subtype. +static const ArchDefinitionEntry * +FindArchDefinitionEntry (const ArchDefinition *def, uint32_t cpu, uint32_t sub) { - if (arch_type >= kNumArchTypes) + if (def == NULL) return NULL; - switch (arch_type) + const uint32_t cpu_mask = def->cpu_mask; + const uint32_t sub_mask = def->sub_mask; + const ArchDefinitionEntry *entries = def->entries; + for (size_t i = 0; i < def->num_entries; ++i) { - case kNumArchTypes: - case eArchTypeInvalid: - break; - - case eArchTypeMachO: - for (uint32_t i=0; i<k_num_mach_arch_defs; i++) - { - if (cpu == g_mach_arch_defs[i].cpu) - { - if (sub == g_mach_arch_defs[i].sub) - return g_mach_arch_defs[i].name; - else if (sub != CPU_ANY && sub != LLDB_INVALID_CPUTYPE) - { - if ((sub & 0x00ffffff) == g_mach_arch_defs[i].sub) - return g_mach_arch_defs[i].name; - } - } - } - break; - - case eArchTypeELF: - for (uint32_t i=0; i<k_num_elf_arch_defs; i++) - { - if (cpu == g_elf_arch_defs[i].cpu) - { - if (sub == g_elf_arch_defs[i].sub) - return g_elf_arch_defs[i].name; - } - } - break; + if ((entries[i].cpu == (cpu_mask & cpu)) && + (entries[i].sub == (sub_mask & sub))) + return &entries[i]; } - - const char *arch_type_cstr = g_arch_type_strings[arch_type]; - - static char s_cpu_hex_str[128]; - ::snprintf(s_cpu_hex_str, - sizeof(s_cpu_hex_str), - "%s%c%u%c%u", - arch_type_cstr, - ARCH_SPEC_SEPARATOR_CHAR, - cpu, - ARCH_SPEC_SEPARATOR_CHAR, - sub); - return s_cpu_hex_str; -} - -//---------------------------------------------------------------------- -// Clears the object contents back to a default invalid state. -//---------------------------------------------------------------------- -void -ArchSpec::Clear() -{ - m_type = eArchTypeInvalid; - m_cpu = LLDB_INVALID_CPUTYPE; - m_sub = 0; - m_triple = llvm::Triple(); - m_byte_order = lldb::endian::InlHostByteOrder(); - m_addr_byte_size = 0; + return NULL; } - - - -//---------------------------------------------------------------------- -// CPU subtype get accessor. -//---------------------------------------------------------------------- -uint32_t -ArchSpec::GetCPUSubtype() const +static const ArchDefinitionEntry * +FindArchDefinitionEntry (const ArchDefinition *def, ArchSpec::Core core) { - if (m_type == eArchTypeMachO) + if (def == NULL) + return NULL; + + const ArchDefinitionEntry *entries = def->entries; + for (size_t i = 0; i < def->num_entries; ++i) { - if (m_sub == CPU_ANY || m_sub == LLDB_INVALID_CPUTYPE) - return m_sub; - return m_sub & 0xffffff; + if (entries[i].core == core) + return &entries[i]; } - return 0; + return NULL; } +//===----------------------------------------------------------------------===// +// Constructors and destructors. -//---------------------------------------------------------------------- -// CPU type get accessor. -//---------------------------------------------------------------------- -uint32_t -ArchSpec::GetCPUType() const +ArchSpec::ArchSpec() : + m_triple (), + m_core (kCore_invalid), + m_byte_order (eByteOrderInvalid) { - return m_cpu; } -//---------------------------------------------------------------------- -// This function is designed to abstract us from having to know any -// details about the current m_type, m_cpu, and m_sub values and -// translate the result into a generic CPU type so LLDB core code can -// detect any CPUs that it supports. -//---------------------------------------------------------------------- -ArchSpec::CPU -ArchSpec::GetGenericCPUType () const +ArchSpec::ArchSpec (const char *triple_cstr) : + m_triple (), + m_core (kCore_invalid), + m_byte_order (eByteOrderInvalid) { - switch (m_type) - { - case kNumArchTypes: - case eArchTypeInvalid: - break; - - case eArchTypeMachO: - switch (m_cpu) - { - case llvm::MachO::CPUTypeARM: return eCPU_arm; - case llvm::MachO::CPUTypeI386: return eCPU_i386; - case llvm::MachO::CPUTypeX86_64: return eCPU_x86_64; - case llvm::MachO::CPUTypePowerPC: return eCPU_ppc; - case llvm::MachO::CPUTypePowerPC64: return eCPU_ppc64; - case llvm::MachO::CPUTypeSPARC: return eCPU_sparc; - } - break; - - case eArchTypeELF: - switch (m_cpu) - { - case llvm::ELF::EM_ARM: return eCPU_arm; - case llvm::ELF::EM_386: return eCPU_i386; - case llvm::ELF::EM_X86_64: return eCPU_x86_64; - case llvm::ELF::EM_PPC: return eCPU_ppc; - case 21: return eCPU_ppc64; - case llvm::ELF::EM_SPARC: return eCPU_sparc; - } - break; - } - - return eCPU_Unknown; + if (triple_cstr) + SetTriple(triple_cstr); } - - - -//---------------------------------------------------------------------- -// Feature flags get accessor. -//---------------------------------------------------------------------- -uint32_t -ArchSpec::GetFeatureFlags() const +ArchSpec::ArchSpec(const llvm::Triple &triple) : + m_triple (), + m_core (kCore_invalid), + m_byte_order (eByteOrderInvalid) { - if (m_type == eArchTypeMachO) - { - if (m_sub == CPU_ANY || m_sub == LLDB_INVALID_CPUTYPE) - return 0; - return m_sub & 0xff000000; - } - return 0; + SetTriple(triple); } - -static const char * g_i386_dwarf_reg_names[] = +ArchSpec::ArchSpec (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) : + m_triple (), + m_core (kCore_invalid), + m_byte_order (eByteOrderInvalid) { - "eax", - "ecx", - "edx", - "ebx", - "esp", - "ebp", - "esi", - "edi", - "eip", - "eflags" -}; + SetArchitecture (arch_type, cpu, subtype); +} -static const char * g_i386_gcc_reg_names[] = +ArchSpec::~ArchSpec() { - "eax", - "ecx", - "edx", - "ebx", - "ebp", - "esp", - "esi", - "edi", - "eip", - "eflags" -}; - -static const char * g_x86_64_dwarf_and_gcc_reg_names[] = { - "rax", - "rdx", - "rcx", - "rbx", - "rsi", - "rdi", - "rbp", - "rsp", - "r8", - "r9", - "r10", - "r11", - "r12", - "r13", - "r14", - "r15", - "rip" -}; +} -// Values take from: -// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf +//===----------------------------------------------------------------------===// +// Assignment and initialization. -enum +const ArchSpec& +ArchSpec::operator= (const ArchSpec& rhs) { - eRegNumARM_DWARF_r0 = 0, - eRegNumARM_DWARF_r1 = 1, - eRegNumARM_DWARF_r2 = 2, - eRegNumARM_DWARF_r3 = 3, - eRegNumARM_DWARF_r4 = 4, - eRegNumARM_DWARF_r5 = 5, - eRegNumARM_DWARF_r6 = 6, - eRegNumARM_DWARF_r7 = 7, - eRegNumARM_DWARF_r8 = 8, - eRegNumARM_DWARF_r9 = 9, - eRegNumARM_DWARF_r10 = 10, - eRegNumARM_DWARF_r11 = 11, - eRegNumARM_DWARF_r12 = 12, - eRegNumARM_DWARF_r13 = 13, // SP - eRegNumARM_DWARF_r14 = 14, // LR - eRegNumARM_DWARF_r15 = 15, // PC - - eRegNumARM_DWARF_f0_obsolete= 16, - eRegNumARM_DWARF_f1_obsolete, - eRegNumARM_DWARF_f2_obsolete, - eRegNumARM_DWARF_f3_obsolete, - eRegNumARM_DWARF_f4_obsolete, - eRegNumARM_DWARF_f5_obsolete, - eRegNumARM_DWARF_f6_obsolete, - eRegNumARM_DWARF_f7_obsolete, - - eRegNumARM_DWARF_s0_obsolete = 16, - eRegNumARM_DWARF_s1_obsolete, - eRegNumARM_DWARF_s2_obsolete, - eRegNumARM_DWARF_s3_obsolete, - eRegNumARM_DWARF_s4_obsolete, - eRegNumARM_DWARF_s5_obsolete, - eRegNumARM_DWARF_s6_obsolete, - eRegNumARM_DWARF_s7_obsolete, - eRegNumARM_DWARF_s8_obsolete, - eRegNumARM_DWARF_s9_obsolete, - eRegNumARM_DWARF_s10_obsolete, - eRegNumARM_DWARF_s11_obsolete, - eRegNumARM_DWARF_s12_obsolete, - eRegNumARM_DWARF_s13_obsolete, - eRegNumARM_DWARF_s14_obsolete, - eRegNumARM_DWARF_s15_obsolete, - eRegNumARM_DWARF_s16_obsolete, - eRegNumARM_DWARF_s17_obsolete, - eRegNumARM_DWARF_s18_obsolete, - eRegNumARM_DWARF_s19_obsolete, - eRegNumARM_DWARF_s20_obsolete, - eRegNumARM_DWARF_s21_obsolete, - eRegNumARM_DWARF_s22_obsolete, - eRegNumARM_DWARF_s23_obsolete, - eRegNumARM_DWARF_s24_obsolete, - eRegNumARM_DWARF_s25_obsolete, - eRegNumARM_DWARF_s26_obsolete, - eRegNumARM_DWARF_s27_obsolete, - eRegNumARM_DWARF_s28_obsolete, - eRegNumARM_DWARF_s29_obsolete, - eRegNumARM_DWARF_s30_obsolete, - eRegNumARM_DWARF_s31_obsolete, - - eRegNumARM_DWARF_s0 = 64, - eRegNumARM_DWARF_s1, - eRegNumARM_DWARF_s2, - eRegNumARM_DWARF_s3, - eRegNumARM_DWARF_s4, - eRegNumARM_DWARF_s5, - eRegNumARM_DWARF_s6, - eRegNumARM_DWARF_s7, - eRegNumARM_DWARF_s8, - eRegNumARM_DWARF_s9, - eRegNumARM_DWARF_s10, - eRegNumARM_DWARF_s11, - eRegNumARM_DWARF_s12, - eRegNumARM_DWARF_s13, - eRegNumARM_DWARF_s14, - eRegNumARM_DWARF_s15, - eRegNumARM_DWARF_s16, - eRegNumARM_DWARF_s17, - eRegNumARM_DWARF_s18, - eRegNumARM_DWARF_s19, - eRegNumARM_DWARF_s20, - eRegNumARM_DWARF_s21, - eRegNumARM_DWARF_s22, - eRegNumARM_DWARF_s23, - eRegNumARM_DWARF_s24, - eRegNumARM_DWARF_s25, - eRegNumARM_DWARF_s26, - eRegNumARM_DWARF_s27, - eRegNumARM_DWARF_s28, - eRegNumARM_DWARF_s29, - eRegNumARM_DWARF_s30, - eRegNumARM_DWARF_s31, - - eRegNumARM_DWARF_f0 = 96, - eRegNumARM_DWARF_f1, - eRegNumARM_DWARF_f2, - eRegNumARM_DWARF_f3, - eRegNumARM_DWARF_f4, - eRegNumARM_DWARF_f5, - eRegNumARM_DWARF_f6, - eRegNumARM_DWARF_f7, - - eRegNumARM_DWARF_ACC0 = 104, - eRegNumARM_DWARF_ACC1, - eRegNumARM_DWARF_ACC2, - eRegNumARM_DWARF_ACC3, - eRegNumARM_DWARF_ACC4, - eRegNumARM_DWARF_ACC5, - eRegNumARM_DWARF_ACC6, - eRegNumARM_DWARF_ACC7, - - eRegNumARM_DWARF_wCGR0 = 104, // These overlap with ACC0-ACC7 - eRegNumARM_DWARF_wCGR1, - eRegNumARM_DWARF_wCGR2, - eRegNumARM_DWARF_wCGR3, - eRegNumARM_DWARF_wCGR4, - eRegNumARM_DWARF_wCGR5, - eRegNumARM_DWARF_wCGR6, - eRegNumARM_DWARF_wCGR7, - - eRegNumARM_DWARF_wR0 = 112, - eRegNumARM_DWARF_wR1, - eRegNumARM_DWARF_wR2, - eRegNumARM_DWARF_wR3, - eRegNumARM_DWARF_wR4, - eRegNumARM_DWARF_wR5, - eRegNumARM_DWARF_wR6, - eRegNumARM_DWARF_wR7, - eRegNumARM_DWARF_wR8, - eRegNumARM_DWARF_wR9, - eRegNumARM_DWARF_wR10, - eRegNumARM_DWARF_wR11, - eRegNumARM_DWARF_wR12, - eRegNumARM_DWARF_wR13, - eRegNumARM_DWARF_wR14, - eRegNumARM_DWARF_wR15, - - eRegNumARM_DWARF_spsr = 128, - eRegNumARM_DWARF_spsr_fiq, - eRegNumARM_DWARF_spsr_irq, - eRegNumARM_DWARF_spsr_abt, - eRegNumARM_DWARF_spsr_und, - eRegNumARM_DWARF_spsr_svc, - - eRegNumARM_DWARF_r8_usr = 144, - eRegNumARM_DWARF_r9_usr, - eRegNumARM_DWARF_r10_usr, - eRegNumARM_DWARF_r11_usr, - eRegNumARM_DWARF_r12_usr, - eRegNumARM_DWARF_r13_usr, - eRegNumARM_DWARF_r14_usr, - - eRegNumARM_DWARF_r8_fiq = 151, - eRegNumARM_DWARF_r9_fiq, - eRegNumARM_DWARF_r10_fiq, - eRegNumARM_DWARF_r11_fiq, - eRegNumARM_DWARF_r12_fiq, - eRegNumARM_DWARF_r13_fiq, - eRegNumARM_DWARF_r14_fiq, - - eRegNumARM_DWARF_r13_irq, - eRegNumARM_DWARF_r14_irq, - - eRegNumARM_DWARF_r13_abt, - eRegNumARM_DWARF_r14_abt, - - eRegNumARM_DWARF_r13_und, - eRegNumARM_DWARF_r14_und, - - eRegNumARM_DWARF_r13_svc, - eRegNumARM_DWARF_r14_svc, - - eRegNumARM_DWARF_wC0 = 192, - eRegNumARM_DWARF_wC1, - eRegNumARM_DWARF_wC2, - eRegNumARM_DWARF_wC3, - eRegNumARM_DWARF_wC4, - eRegNumARM_DWARF_wC5, - eRegNumARM_DWARF_wC6, - eRegNumARM_DWARF_wC7, - - eRegNumARM_DWARF_d0 = 256, // VFP-v3/NEON D0-D31 (32 64 bit registers) - eRegNumARM_DWARF_d1, - eRegNumARM_DWARF_d2, - eRegNumARM_DWARF_d3, - eRegNumARM_DWARF_d4, - eRegNumARM_DWARF_d5, - eRegNumARM_DWARF_d6, - eRegNumARM_DWARF_d7, - eRegNumARM_DWARF_d8, - eRegNumARM_DWARF_d9, - eRegNumARM_DWARF_d10, - eRegNumARM_DWARF_d11, - eRegNumARM_DWARF_d12, - eRegNumARM_DWARF_d13, - eRegNumARM_DWARF_d14, - eRegNumARM_DWARF_d15, - eRegNumARM_DWARF_d16, - eRegNumARM_DWARF_d17, - eRegNumARM_DWARF_d18, - eRegNumARM_DWARF_d19, - eRegNumARM_DWARF_d20, - eRegNumARM_DWARF_d21, - eRegNumARM_DWARF_d22, - eRegNumARM_DWARF_d23, - eRegNumARM_DWARF_d24, - eRegNumARM_DWARF_d25, - eRegNumARM_DWARF_d26, - eRegNumARM_DWARF_d27, - eRegNumARM_DWARF_d28, - eRegNumARM_DWARF_d29, - eRegNumARM_DWARF_d30, - eRegNumARM_DWARF_d31 -}; + if (this != &rhs) + { + m_triple = rhs.m_triple; + m_core = rhs.m_core; + m_byte_order = rhs.m_byte_order; + } + return *this; +} -// Register numbering definitions for 32 and 64 bit ppc for RegisterNumberingType::Dwarf -enum +void +ArchSpec::Clear() { - eRegNumPPC_DWARF_r0 = 0, - eRegNumPPC_DWARF_r1 = 1, - eRegNumPPC_DWARF_r2 = 2, - eRegNumPPC_DWARF_r3 = 3, - eRegNumPPC_DWARF_r4 = 4, - eRegNumPPC_DWARF_r5 = 5, - eRegNumPPC_DWARF_r6 = 6, - eRegNumPPC_DWARF_r7 = 7, - eRegNumPPC_DWARF_r8 = 8, - eRegNumPPC_DWARF_r9 = 9, - eRegNumPPC_DWARF_r10 = 10, - eRegNumPPC_DWARF_r11 = 11, - eRegNumPPC_DWARF_r12 = 12, - eRegNumPPC_DWARF_r13 = 13, - eRegNumPPC_DWARF_r14 = 14, - eRegNumPPC_DWARF_r15 = 15, - eRegNumPPC_DWARF_r16 = 16, - eRegNumPPC_DWARF_r17 = 17, - eRegNumPPC_DWARF_r18 = 18, - eRegNumPPC_DWARF_r19 = 19, - eRegNumPPC_DWARF_r20 = 20, - eRegNumPPC_DWARF_r21 = 21, - eRegNumPPC_DWARF_r22 = 22, - eRegNumPPC_DWARF_r23 = 23, - eRegNumPPC_DWARF_r24 = 24, - eRegNumPPC_DWARF_r25 = 25, - eRegNumPPC_DWARF_r26 = 26, - eRegNumPPC_DWARF_r27 = 27, - eRegNumPPC_DWARF_r28 = 28, - eRegNumPPC_DWARF_r29 = 29, - eRegNumPPC_DWARF_r30 = 30, - eRegNumPPC_DWARF_r31 = 31, - - eRegNumPPC_DWARF_fr0 = 32, - eRegNumPPC_DWARF_fr1 = 33, - eRegNumPPC_DWARF_fr2 = 34, - eRegNumPPC_DWARF_fr3 = 35, - eRegNumPPC_DWARF_fr4 = 36, - eRegNumPPC_DWARF_fr5 = 37, - eRegNumPPC_DWARF_fr6 = 38, - eRegNumPPC_DWARF_fr7 = 39, - eRegNumPPC_DWARF_fr8 = 40, - eRegNumPPC_DWARF_fr9 = 41, - eRegNumPPC_DWARF_fr10 = 42, - eRegNumPPC_DWARF_fr11 = 43, - eRegNumPPC_DWARF_fr12 = 44, - eRegNumPPC_DWARF_fr13 = 45, - eRegNumPPC_DWARF_fr14 = 46, - eRegNumPPC_DWARF_fr15 = 47, - eRegNumPPC_DWARF_fr16 = 48, - eRegNumPPC_DWARF_fr17 = 49, - eRegNumPPC_DWARF_fr18 = 50, - eRegNumPPC_DWARF_fr19 = 51, - eRegNumPPC_DWARF_fr20 = 52, - eRegNumPPC_DWARF_fr21 = 53, - eRegNumPPC_DWARF_fr22 = 54, - eRegNumPPC_DWARF_fr23 = 55, - eRegNumPPC_DWARF_fr24 = 56, - eRegNumPPC_DWARF_fr25 = 57, - eRegNumPPC_DWARF_fr26 = 58, - eRegNumPPC_DWARF_fr27 = 59, - eRegNumPPC_DWARF_fr28 = 60, - eRegNumPPC_DWARF_fr29 = 61, - eRegNumPPC_DWARF_fr30 = 62, - eRegNumPPC_DWARF_fr31 = 63, - - eRegNumPPC_DWARF_cr = 64, - eRegNumPPC_DWARF_fpscr = 65, - eRegNumPPC_DWARF_msr = 66, - eRegNumPPC_DWARF_vscr = 67, - - eRegNumPPC_DWARF_sr0 = 70, - eRegNumPPC_DWARF_sr1, - eRegNumPPC_DWARF_sr2, - eRegNumPPC_DWARF_sr3, - eRegNumPPC_DWARF_sr4, - eRegNumPPC_DWARF_sr5, - eRegNumPPC_DWARF_sr6, - eRegNumPPC_DWARF_sr7, - eRegNumPPC_DWARF_sr8, - eRegNumPPC_DWARF_sr9, - eRegNumPPC_DWARF_sr10, - eRegNumPPC_DWARF_sr11, - eRegNumPPC_DWARF_sr12, - eRegNumPPC_DWARF_sr13, - eRegNumPPC_DWARF_sr14, - eRegNumPPC_DWARF_sr15, - - - eRegNumPPC_DWARF_acc = 99, - eRegNumPPC_DWARF_mq = 100, - eRegNumPPC_DWARF_xer = 101, - eRegNumPPC_DWARF_rtcu = 104, - eRegNumPPC_DWARF_rtcl = 105, - - eRegNumPPC_DWARF_lr = 108, - eRegNumPPC_DWARF_ctr = 109, - - eRegNumPPC_DWARF_dsisr = 118, - eRegNumPPC_DWARF_dar = 119, - eRegNumPPC_DWARF_dec = 122, - eRegNumPPC_DWARF_sdr1 = 125, - eRegNumPPC_DWARF_srr0 = 126, - eRegNumPPC_DWARF_srr1 = 127, - - eRegNumPPC_DWARF_vrsave = 356, - eRegNumPPC_DWARF_sprg0 = 372, - eRegNumPPC_DWARF_sprg1, - eRegNumPPC_DWARF_sprg2, - eRegNumPPC_DWARF_sprg3, - - eRegNumPPC_DWARF_asr = 380, - eRegNumPPC_DWARF_ear = 382, - eRegNumPPC_DWARF_tb = 384, - eRegNumPPC_DWARF_tbu = 385, - eRegNumPPC_DWARF_pvr = 387, - - eRegNumPPC_DWARF_spefscr = 612, - - eRegNumPPC_DWARF_ibat0u = 628, - eRegNumPPC_DWARF_ibat0l = 629, - eRegNumPPC_DWARF_ibat1u = 630, - eRegNumPPC_DWARF_ibat1l = 631, - eRegNumPPC_DWARF_ibat2u = 632, - eRegNumPPC_DWARF_ibat2l = 633, - eRegNumPPC_DWARF_ibat3u = 634, - eRegNumPPC_DWARF_ibat3l = 635, - eRegNumPPC_DWARF_dbat0u = 636, - eRegNumPPC_DWARF_dbat0l = 637, - eRegNumPPC_DWARF_dbat1u = 638, - eRegNumPPC_DWARF_dbat1l = 639, - eRegNumPPC_DWARF_dbat2u = 640, - eRegNumPPC_DWARF_dbat2l = 641, - eRegNumPPC_DWARF_dbat3u = 642, - eRegNumPPC_DWARF_dbat3l = 643, - - eRegNumPPC_DWARF_hid0 = 1108, - eRegNumPPC_DWARF_hid1, - eRegNumPPC_DWARF_hid2, - eRegNumPPC_DWARF_hid3, - eRegNumPPC_DWARF_hid4, - eRegNumPPC_DWARF_hid5, - eRegNumPPC_DWARF_hid6, - eRegNumPPC_DWARF_hid7, - eRegNumPPC_DWARF_hid8, - eRegNumPPC_DWARF_hid9, - eRegNumPPC_DWARF_hid10, - eRegNumPPC_DWARF_hid11, - eRegNumPPC_DWARF_hid12, - eRegNumPPC_DWARF_hid13, - eRegNumPPC_DWARF_hid14, - eRegNumPPC_DWARF_hid15, - - eRegNumPPC_DWARF_vr0 = 1124, - eRegNumPPC_DWARF_vr1, - eRegNumPPC_DWARF_vr2, - eRegNumPPC_DWARF_vr3, - eRegNumPPC_DWARF_vr4, - eRegNumPPC_DWARF_vr5, - eRegNumPPC_DWARF_vr6, - eRegNumPPC_DWARF_vr7, - eRegNumPPC_DWARF_vr8, - eRegNumPPC_DWARF_vr9, - eRegNumPPC_DWARF_vr10, - eRegNumPPC_DWARF_vr11, - eRegNumPPC_DWARF_vr12, - eRegNumPPC_DWARF_vr13, - eRegNumPPC_DWARF_vr14, - eRegNumPPC_DWARF_vr15, - eRegNumPPC_DWARF_vr16, - eRegNumPPC_DWARF_vr17, - eRegNumPPC_DWARF_vr18, - eRegNumPPC_DWARF_vr19, - eRegNumPPC_DWARF_vr20, - eRegNumPPC_DWARF_vr21, - eRegNumPPC_DWARF_vr22, - eRegNumPPC_DWARF_vr23, - eRegNumPPC_DWARF_vr24, - eRegNumPPC_DWARF_vr25, - eRegNumPPC_DWARF_vr26, - eRegNumPPC_DWARF_vr27, - eRegNumPPC_DWARF_vr28, - eRegNumPPC_DWARF_vr29, - eRegNumPPC_DWARF_vr30, - eRegNumPPC_DWARF_vr31, - - eRegNumPPC_DWARF_ev0 = 1200, - eRegNumPPC_DWARF_ev1, - eRegNumPPC_DWARF_ev2, - eRegNumPPC_DWARF_ev3, - eRegNumPPC_DWARF_ev4, - eRegNumPPC_DWARF_ev5, - eRegNumPPC_DWARF_ev6, - eRegNumPPC_DWARF_ev7, - eRegNumPPC_DWARF_ev8, - eRegNumPPC_DWARF_ev9, - eRegNumPPC_DWARF_ev10, - eRegNumPPC_DWARF_ev11, - eRegNumPPC_DWARF_ev12, - eRegNumPPC_DWARF_ev13, - eRegNumPPC_DWARF_ev14, - eRegNumPPC_DWARF_ev15, - eRegNumPPC_DWARF_ev16, - eRegNumPPC_DWARF_ev17, - eRegNumPPC_DWARF_ev18, - eRegNumPPC_DWARF_ev19, - eRegNumPPC_DWARF_ev20, - eRegNumPPC_DWARF_ev21, - eRegNumPPC_DWARF_ev22, - eRegNumPPC_DWARF_ev23, - eRegNumPPC_DWARF_ev24, - eRegNumPPC_DWARF_ev25, - eRegNumPPC_DWARF_ev26, - eRegNumPPC_DWARF_ev27, - eRegNumPPC_DWARF_ev28, - eRegNumPPC_DWARF_ev29, - eRegNumPPC_DWARF_ev30, - eRegNumPPC_DWARF_ev31 -}; + m_triple = llvm::Triple(); + m_core = kCore_invalid; + m_byte_order = eByteOrderInvalid; +} -// Register numbering definitions for 32 and 64 bit ppc for RegisterNumberingType::GCC -enum -{ - eRegNumPPC_GCC_r0 = 0, - eRegNumPPC_GCC_r1 = 1, - eRegNumPPC_GCC_r2 = 2, - eRegNumPPC_GCC_r3 = 3, - eRegNumPPC_GCC_r4 = 4, - eRegNumPPC_GCC_r5 = 5, - eRegNumPPC_GCC_r6 = 6, - eRegNumPPC_GCC_r7 = 7, - eRegNumPPC_GCC_r8 = 8, - eRegNumPPC_GCC_r9 = 9, - eRegNumPPC_GCC_r10 = 10, - eRegNumPPC_GCC_r11 = 11, - eRegNumPPC_GCC_r12 = 12, - eRegNumPPC_GCC_r13 = 13, - eRegNumPPC_GCC_r14 = 14, - eRegNumPPC_GCC_r15 = 15, - eRegNumPPC_GCC_r16 = 16, - eRegNumPPC_GCC_r17 = 17, - eRegNumPPC_GCC_r18 = 18, - eRegNumPPC_GCC_r19 = 19, - eRegNumPPC_GCC_r20 = 20, - eRegNumPPC_GCC_r21 = 21, - eRegNumPPC_GCC_r22 = 22, - eRegNumPPC_GCC_r23 = 23, - eRegNumPPC_GCC_r24 = 24, - eRegNumPPC_GCC_r25 = 25, - eRegNumPPC_GCC_r26 = 26, - eRegNumPPC_GCC_r27 = 27, - eRegNumPPC_GCC_r28 = 28, - eRegNumPPC_GCC_r29 = 29, - eRegNumPPC_GCC_r30 = 30, - eRegNumPPC_GCC_r31 = 31, - eRegNumPPC_GCC_fr0 = 32, - eRegNumPPC_GCC_fr1 = 33, - eRegNumPPC_GCC_fr2 = 34, - eRegNumPPC_GCC_fr3 = 35, - eRegNumPPC_GCC_fr4 = 36, - eRegNumPPC_GCC_fr5 = 37, - eRegNumPPC_GCC_fr6 = 38, - eRegNumPPC_GCC_fr7 = 39, - eRegNumPPC_GCC_fr8 = 40, - eRegNumPPC_GCC_fr9 = 41, - eRegNumPPC_GCC_fr10 = 42, - eRegNumPPC_GCC_fr11 = 43, - eRegNumPPC_GCC_fr12 = 44, - eRegNumPPC_GCC_fr13 = 45, - eRegNumPPC_GCC_fr14 = 46, - eRegNumPPC_GCC_fr15 = 47, - eRegNumPPC_GCC_fr16 = 48, - eRegNumPPC_GCC_fr17 = 49, - eRegNumPPC_GCC_fr18 = 50, - eRegNumPPC_GCC_fr19 = 51, - eRegNumPPC_GCC_fr20 = 52, - eRegNumPPC_GCC_fr21 = 53, - eRegNumPPC_GCC_fr22 = 54, - eRegNumPPC_GCC_fr23 = 55, - eRegNumPPC_GCC_fr24 = 56, - eRegNumPPC_GCC_fr25 = 57, - eRegNumPPC_GCC_fr26 = 58, - eRegNumPPC_GCC_fr27 = 59, - eRegNumPPC_GCC_fr28 = 60, - eRegNumPPC_GCC_fr29 = 61, - eRegNumPPC_GCC_fr30 = 62, - eRegNumPPC_GCC_fr31 = 63, - eRegNumPPC_GCC_mq = 64, - eRegNumPPC_GCC_lr = 65, - eRegNumPPC_GCC_ctr = 66, - eRegNumPPC_GCC_ap = 67, - eRegNumPPC_GCC_cr0 = 68, - eRegNumPPC_GCC_cr1 = 69, - eRegNumPPC_GCC_cr2 = 70, - eRegNumPPC_GCC_cr3 = 71, - eRegNumPPC_GCC_cr4 = 72, - eRegNumPPC_GCC_cr5 = 73, - eRegNumPPC_GCC_cr6 = 74, - eRegNumPPC_GCC_cr7 = 75, - eRegNumPPC_GCC_xer = 76, - eRegNumPPC_GCC_v0 = 77, - eRegNumPPC_GCC_v1 = 78, - eRegNumPPC_GCC_v2 = 79, - eRegNumPPC_GCC_v3 = 80, - eRegNumPPC_GCC_v4 = 81, - eRegNumPPC_GCC_v5 = 82, - eRegNumPPC_GCC_v6 = 83, - eRegNumPPC_GCC_v7 = 84, - eRegNumPPC_GCC_v8 = 85, - eRegNumPPC_GCC_v9 = 86, - eRegNumPPC_GCC_v10 = 87, - eRegNumPPC_GCC_v11 = 88, - eRegNumPPC_GCC_v12 = 89, - eRegNumPPC_GCC_v13 = 90, - eRegNumPPC_GCC_v14 = 91, - eRegNumPPC_GCC_v15 = 92, - eRegNumPPC_GCC_v16 = 93, - eRegNumPPC_GCC_v17 = 94, - eRegNumPPC_GCC_v18 = 95, - eRegNumPPC_GCC_v19 = 96, - eRegNumPPC_GCC_v20 = 97, - eRegNumPPC_GCC_v21 = 98, - eRegNumPPC_GCC_v22 = 99, - eRegNumPPC_GCC_v23 = 100, - eRegNumPPC_GCC_v24 = 101, - eRegNumPPC_GCC_v25 = 102, - eRegNumPPC_GCC_v26 = 103, - eRegNumPPC_GCC_v27 = 104, - eRegNumPPC_GCC_v28 = 105, - eRegNumPPC_GCC_v29 = 106, - eRegNumPPC_GCC_v30 = 107, - eRegNumPPC_GCC_v31 = 108, - eRegNumPPC_GCC_vrsave = 109, - eRegNumPPC_GCC_vscr = 110, - eRegNumPPC_GCC_spe_acc = 111, - eRegNumPPC_GCC_spefscr = 112, - eRegNumPPC_GCC_sfp = 113 -}; +//===----------------------------------------------------------------------===// +// Predicates. -static const char * g_arm_gcc_reg_names[] = { - "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", - "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", - "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", - "cc", "sfp", "afp", - "mv0", "mv1", "mv2", "mv3", "mv4", "mv5", "mv6", "mv7", - "mv8", "mv9", "mv10", "mv11", "mv12", "mv13", "mv14", "mv15", - "wcgr0","wcgr1","wcgr2","wcgr3", - "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", - "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15", - "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", - "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", - "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", - "vfpcc" -}; -//---------------------------------------------------------------------- -// Get register names for the current object architecture given -// a register number, and a reg_kind for that register number. -//---------------------------------------------------------------------- const char * -ArchSpec::GetRegisterName(uint32_t reg_num, uint32_t reg_kind) const +ArchSpec::GetArchitectureName () const { - return ArchSpec::GetRegisterName(m_type, m_cpu, m_sub, reg_num, reg_kind); + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) + return core_def->name; + return "unknown"; } - -//---------------------------------------------------------------------- -// Get register names for the specified CPU type and subtype given -// a register number, and a reg_kind for that register number. -//---------------------------------------------------------------------- -const char * -ArchSpec::GetRegisterName (ArchitectureType arch_type, uint32_t cpu, uint32_t subtype, uint32_t reg_num, uint32_t reg_kind) +uint32_t +ArchSpec::GetMachOCPUType () const { - if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeI386) || - (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_386)) + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) { - switch (reg_kind) + const ArchDefinitionEntry *arch_def = FindArchDefinitionEntry (&g_macho_arch_def, core_def->core); + if (arch_def) { - case eRegisterKindGCC: - if (reg_num < sizeof(g_i386_gcc_reg_names)/sizeof(const char *)) - return g_i386_gcc_reg_names[reg_num]; - break; - case eRegisterKindDWARF: - if (reg_num < sizeof(g_i386_dwarf_reg_names)/sizeof(const char *)) - return g_i386_dwarf_reg_names[reg_num]; - break; - default: - break; + return arch_def->cpu; } } - else if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeX86_64) || - (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_X86_64)) - { - switch (reg_kind) - { - case eRegisterKindGCC: - case eRegisterKindDWARF: - if (reg_num < sizeof(g_x86_64_dwarf_and_gcc_reg_names)/sizeof(const char *)) - return g_x86_64_dwarf_and_gcc_reg_names[reg_num]; - break; - default: - break; - } - } - else if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeARM) || - (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_ARM)) - { - switch (reg_kind) - { - case eRegisterKindGCC: - if (reg_num < sizeof(g_arm_gcc_reg_names)/sizeof(const char *)) - return g_arm_gcc_reg_names[reg_num]; - break; + return LLDB_INVALID_CPUTYPE; +} - case eRegisterKindDWARF: - switch (reg_num) - { - case eRegNumARM_DWARF_r0: return "r0"; - case eRegNumARM_DWARF_r1: return "r1"; - case eRegNumARM_DWARF_r2: return "r2"; - case eRegNumARM_DWARF_r3: return "r3"; - case eRegNumARM_DWARF_r4: return "r4"; - case eRegNumARM_DWARF_r5: return "r5"; - case eRegNumARM_DWARF_r6: return "r6"; - case eRegNumARM_DWARF_r7: return "r7"; - case eRegNumARM_DWARF_r8: return "r8"; - case eRegNumARM_DWARF_r9: return "r9"; - case eRegNumARM_DWARF_r10: return "r10"; - case eRegNumARM_DWARF_r11: return "r11"; - case eRegNumARM_DWARF_r12: return "r12"; - case eRegNumARM_DWARF_r13: return "sp"; - case eRegNumARM_DWARF_r14: return "lr"; - case eRegNumARM_DWARF_r15: return "pc"; - case eRegNumARM_DWARF_s0_obsolete: case eRegNumARM_DWARF_s0: return "s0"; - case eRegNumARM_DWARF_s1_obsolete: case eRegNumARM_DWARF_s1: return "s1"; - case eRegNumARM_DWARF_s2_obsolete: case eRegNumARM_DWARF_s2: return "s2"; - case eRegNumARM_DWARF_s3_obsolete: case eRegNumARM_DWARF_s3: return "s3"; - case eRegNumARM_DWARF_s4_obsolete: case eRegNumARM_DWARF_s4: return "s4"; - case eRegNumARM_DWARF_s5_obsolete: case eRegNumARM_DWARF_s5: return "s5"; - case eRegNumARM_DWARF_s6_obsolete: case eRegNumARM_DWARF_s6: return "s6"; - case eRegNumARM_DWARF_s7_obsolete: case eRegNumARM_DWARF_s7: return "s7"; - case eRegNumARM_DWARF_s8_obsolete: case eRegNumARM_DWARF_s8: return "s8"; - case eRegNumARM_DWARF_s9_obsolete: case eRegNumARM_DWARF_s9: return "s9"; - case eRegNumARM_DWARF_s10_obsolete: case eRegNumARM_DWARF_s10: return "s10"; - case eRegNumARM_DWARF_s11_obsolete: case eRegNumARM_DWARF_s11: return "s11"; - case eRegNumARM_DWARF_s12_obsolete: case eRegNumARM_DWARF_s12: return "s12"; - case eRegNumARM_DWARF_s13_obsolete: case eRegNumARM_DWARF_s13: return "s13"; - case eRegNumARM_DWARF_s14_obsolete: case eRegNumARM_DWARF_s14: return "s14"; - case eRegNumARM_DWARF_s15_obsolete: case eRegNumARM_DWARF_s15: return "s15"; - case eRegNumARM_DWARF_s16_obsolete: case eRegNumARM_DWARF_s16: return "s16"; - case eRegNumARM_DWARF_s17_obsolete: case eRegNumARM_DWARF_s17: return "s17"; - case eRegNumARM_DWARF_s18_obsolete: case eRegNumARM_DWARF_s18: return "s18"; - case eRegNumARM_DWARF_s19_obsolete: case eRegNumARM_DWARF_s19: return "s19"; - case eRegNumARM_DWARF_s20_obsolete: case eRegNumARM_DWARF_s20: return "s20"; - case eRegNumARM_DWARF_s21_obsolete: case eRegNumARM_DWARF_s21: return "s21"; - case eRegNumARM_DWARF_s22_obsolete: case eRegNumARM_DWARF_s22: return "s22"; - case eRegNumARM_DWARF_s23_obsolete: case eRegNumARM_DWARF_s23: return "s23"; - case eRegNumARM_DWARF_s24_obsolete: case eRegNumARM_DWARF_s24: return "s24"; - case eRegNumARM_DWARF_s25_obsolete: case eRegNumARM_DWARF_s25: return "s25"; - case eRegNumARM_DWARF_s26_obsolete: case eRegNumARM_DWARF_s26: return "s26"; - case eRegNumARM_DWARF_s27_obsolete: case eRegNumARM_DWARF_s27: return "s27"; - case eRegNumARM_DWARF_s28_obsolete: case eRegNumARM_DWARF_s28: return "s28"; - case eRegNumARM_DWARF_s29_obsolete: case eRegNumARM_DWARF_s29: return "s29"; - case eRegNumARM_DWARF_s30_obsolete: case eRegNumARM_DWARF_s30: return "s30"; - case eRegNumARM_DWARF_s31_obsolete: case eRegNumARM_DWARF_s31: return "s31"; - case eRegNumARM_DWARF_f0: return "f0"; - case eRegNumARM_DWARF_f1: return "f1"; - case eRegNumARM_DWARF_f2: return "f2"; - case eRegNumARM_DWARF_f3: return "f3"; - case eRegNumARM_DWARF_f4: return "f4"; - case eRegNumARM_DWARF_f5: return "f5"; - case eRegNumARM_DWARF_f6: return "f6"; - case eRegNumARM_DWARF_f7: return "f7"; - case eRegNumARM_DWARF_wCGR0: return "wCGR0/ACC0"; - case eRegNumARM_DWARF_wCGR1: return "wCGR1/ACC1"; - case eRegNumARM_DWARF_wCGR2: return "wCGR2/ACC2"; - case eRegNumARM_DWARF_wCGR3: return "wCGR3/ACC3"; - case eRegNumARM_DWARF_wCGR4: return "wCGR4/ACC4"; - case eRegNumARM_DWARF_wCGR5: return "wCGR5/ACC5"; - case eRegNumARM_DWARF_wCGR6: return "wCGR6/ACC6"; - case eRegNumARM_DWARF_wCGR7: return "wCGR7/ACC7"; - case eRegNumARM_DWARF_wR0: return "wR0"; - case eRegNumARM_DWARF_wR1: return "wR1"; - case eRegNumARM_DWARF_wR2: return "wR2"; - case eRegNumARM_DWARF_wR3: return "wR3"; - case eRegNumARM_DWARF_wR4: return "wR4"; - case eRegNumARM_DWARF_wR5: return "wR5"; - case eRegNumARM_DWARF_wR6: return "wR6"; - case eRegNumARM_DWARF_wR7: return "wR7"; - case eRegNumARM_DWARF_wR8: return "wR8"; - case eRegNumARM_DWARF_wR9: return "wR9"; - case eRegNumARM_DWARF_wR10: return "wR10"; - case eRegNumARM_DWARF_wR11: return "wR11"; - case eRegNumARM_DWARF_wR12: return "wR12"; - case eRegNumARM_DWARF_wR13: return "wR13"; - case eRegNumARM_DWARF_wR14: return "wR14"; - case eRegNumARM_DWARF_wR15: return "wR15"; - case eRegNumARM_DWARF_spsr: return "spsr"; - case eRegNumARM_DWARF_spsr_fiq: return "spsr_fiq"; - case eRegNumARM_DWARF_spsr_irq: return "spsr_irq"; - case eRegNumARM_DWARF_spsr_abt: return "spsr_abt"; - case eRegNumARM_DWARF_spsr_und: return "spsr_und"; - case eRegNumARM_DWARF_spsr_svc: return "spsr_svc"; - case eRegNumARM_DWARF_r8_usr: return "r8_usr"; - case eRegNumARM_DWARF_r9_usr: return "r9_usr"; - case eRegNumARM_DWARF_r10_usr: return "r10_usr"; - case eRegNumARM_DWARF_r11_usr: return "r11_usr"; - case eRegNumARM_DWARF_r12_usr: return "r12_usr"; - case eRegNumARM_DWARF_r13_usr: return "sp_usr"; - case eRegNumARM_DWARF_r14_usr: return "lr_usr"; - case eRegNumARM_DWARF_r8_fiq: return "r8_fiq"; - case eRegNumARM_DWARF_r9_fiq: return "r9_fiq"; - case eRegNumARM_DWARF_r10_fiq: return "r10_fiq"; - case eRegNumARM_DWARF_r11_fiq: return "r11_fiq"; - case eRegNumARM_DWARF_r12_fiq: return "r12_fiq"; - case eRegNumARM_DWARF_r13_fiq: return "sp_fiq"; - case eRegNumARM_DWARF_r14_fiq: return "lr_fiq"; - case eRegNumARM_DWARF_r13_irq: return "sp_irq"; - case eRegNumARM_DWARF_r14_irq: return "lr_irq"; - case eRegNumARM_DWARF_r13_abt: return "sp_abt"; - case eRegNumARM_DWARF_r14_abt: return "lr_abt"; - case eRegNumARM_DWARF_r13_und: return "sp_und"; - case eRegNumARM_DWARF_r14_und: return "lr_und"; - case eRegNumARM_DWARF_r13_svc: return "sp_svc"; - case eRegNumARM_DWARF_r14_svc: return "lr_svc"; - case eRegNumARM_DWARF_wC0: return "wC0"; - case eRegNumARM_DWARF_wC1: return "wC1"; - case eRegNumARM_DWARF_wC2: return "wC2"; - case eRegNumARM_DWARF_wC3: return "wC3"; - case eRegNumARM_DWARF_wC4: return "wC4"; - case eRegNumARM_DWARF_wC5: return "wC5"; - case eRegNumARM_DWARF_wC6: return "wC6"; - case eRegNumARM_DWARF_wC7: return "wC7"; - case eRegNumARM_DWARF_d0: return "d0"; - case eRegNumARM_DWARF_d1: return "d1"; - case eRegNumARM_DWARF_d2: return "d2"; - case eRegNumARM_DWARF_d3: return "d3"; - case eRegNumARM_DWARF_d4: return "d4"; - case eRegNumARM_DWARF_d5: return "d5"; - case eRegNumARM_DWARF_d6: return "d6"; - case eRegNumARM_DWARF_d7: return "d7"; - case eRegNumARM_DWARF_d8: return "d8"; - case eRegNumARM_DWARF_d9: return "d9"; - case eRegNumARM_DWARF_d10: return "d10"; - case eRegNumARM_DWARF_d11: return "d11"; - case eRegNumARM_DWARF_d12: return "d12"; - case eRegNumARM_DWARF_d13: return "d13"; - case eRegNumARM_DWARF_d14: return "d14"; - case eRegNumARM_DWARF_d15: return "d15"; - case eRegNumARM_DWARF_d16: return "d16"; - case eRegNumARM_DWARF_d17: return "d17"; - case eRegNumARM_DWARF_d18: return "d18"; - case eRegNumARM_DWARF_d19: return "d19"; - case eRegNumARM_DWARF_d20: return "d20"; - case eRegNumARM_DWARF_d21: return "d21"; - case eRegNumARM_DWARF_d22: return "d22"; - case eRegNumARM_DWARF_d23: return "d23"; - case eRegNumARM_DWARF_d24: return "d24"; - case eRegNumARM_DWARF_d25: return "d25"; - case eRegNumARM_DWARF_d26: return "d26"; - case eRegNumARM_DWARF_d27: return "d27"; - case eRegNumARM_DWARF_d28: return "d28"; - case eRegNumARM_DWARF_d29: return "d29"; - case eRegNumARM_DWARF_d30: return "d30"; - case eRegNumARM_DWARF_d31: return "d31"; - } - break; - default: - break; - } - } - else if ((arch_type == eArchTypeMachO && (cpu == llvm::MachO::CPUTypePowerPC || cpu == llvm::MachO::CPUTypePowerPC64)) || - (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_PPC)) +uint32_t +ArchSpec::GetMachOCPUSubType () const +{ + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) { - switch (reg_kind) + const ArchDefinitionEntry *arch_def = FindArchDefinitionEntry (&g_macho_arch_def, core_def->core); + if (arch_def) { - case eRegisterKindGCC: - switch (reg_num) - { - case eRegNumPPC_GCC_r0: return "r0"; - case eRegNumPPC_GCC_r1: return "r1"; - case eRegNumPPC_GCC_r2: return "r2"; - case eRegNumPPC_GCC_r3: return "r3"; - case eRegNumPPC_GCC_r4: return "r4"; - case eRegNumPPC_GCC_r5: return "r5"; - case eRegNumPPC_GCC_r6: return "r6"; - case eRegNumPPC_GCC_r7: return "r7"; - case eRegNumPPC_GCC_r8: return "r8"; - case eRegNumPPC_GCC_r9: return "r9"; - case eRegNumPPC_GCC_r10: return "r10"; - case eRegNumPPC_GCC_r11: return "r11"; - case eRegNumPPC_GCC_r12: return "r12"; - case eRegNumPPC_GCC_r13: return "r13"; - case eRegNumPPC_GCC_r14: return "r14"; - case eRegNumPPC_GCC_r15: return "r15"; - case eRegNumPPC_GCC_r16: return "r16"; - case eRegNumPPC_GCC_r17: return "r17"; - case eRegNumPPC_GCC_r18: return "r18"; - case eRegNumPPC_GCC_r19: return "r19"; - case eRegNumPPC_GCC_r20: return "r20"; - case eRegNumPPC_GCC_r21: return "r21"; - case eRegNumPPC_GCC_r22: return "r22"; - case eRegNumPPC_GCC_r23: return "r23"; - case eRegNumPPC_GCC_r24: return "r24"; - case eRegNumPPC_GCC_r25: return "r25"; - case eRegNumPPC_GCC_r26: return "r26"; - case eRegNumPPC_GCC_r27: return "r27"; - case eRegNumPPC_GCC_r28: return "r28"; - case eRegNumPPC_GCC_r29: return "r29"; - case eRegNumPPC_GCC_r30: return "r30"; - case eRegNumPPC_GCC_r31: return "r31"; - case eRegNumPPC_GCC_fr0: return "fr0"; - case eRegNumPPC_GCC_fr1: return "fr1"; - case eRegNumPPC_GCC_fr2: return "fr2"; - case eRegNumPPC_GCC_fr3: return "fr3"; - case eRegNumPPC_GCC_fr4: return "fr4"; - case eRegNumPPC_GCC_fr5: return "fr5"; - case eRegNumPPC_GCC_fr6: return "fr6"; - case eRegNumPPC_GCC_fr7: return "fr7"; - case eRegNumPPC_GCC_fr8: return "fr8"; - case eRegNumPPC_GCC_fr9: return "fr9"; - case eRegNumPPC_GCC_fr10: return "fr10"; - case eRegNumPPC_GCC_fr11: return "fr11"; - case eRegNumPPC_GCC_fr12: return "fr12"; - case eRegNumPPC_GCC_fr13: return "fr13"; - case eRegNumPPC_GCC_fr14: return "fr14"; - case eRegNumPPC_GCC_fr15: return "fr15"; - case eRegNumPPC_GCC_fr16: return "fr16"; - case eRegNumPPC_GCC_fr17: return "fr17"; - case eRegNumPPC_GCC_fr18: return "fr18"; - case eRegNumPPC_GCC_fr19: return "fr19"; - case eRegNumPPC_GCC_fr20: return "fr20"; - case eRegNumPPC_GCC_fr21: return "fr21"; - case eRegNumPPC_GCC_fr22: return "fr22"; - case eRegNumPPC_GCC_fr23: return "fr23"; - case eRegNumPPC_GCC_fr24: return "fr24"; - case eRegNumPPC_GCC_fr25: return "fr25"; - case eRegNumPPC_GCC_fr26: return "fr26"; - case eRegNumPPC_GCC_fr27: return "fr27"; - case eRegNumPPC_GCC_fr28: return "fr28"; - case eRegNumPPC_GCC_fr29: return "fr29"; - case eRegNumPPC_GCC_fr30: return "fr30"; - case eRegNumPPC_GCC_fr31: return "fr31"; - case eRegNumPPC_GCC_mq: return "mq"; - case eRegNumPPC_GCC_lr: return "lr"; - case eRegNumPPC_GCC_ctr: return "ctr"; - case eRegNumPPC_GCC_ap: return "ap"; - case eRegNumPPC_GCC_cr0: return "cr0"; - case eRegNumPPC_GCC_cr1: return "cr1"; - case eRegNumPPC_GCC_cr2: return "cr2"; - case eRegNumPPC_GCC_cr3: return "cr3"; - case eRegNumPPC_GCC_cr4: return "cr4"; - case eRegNumPPC_GCC_cr5: return "cr5"; - case eRegNumPPC_GCC_cr6: return "cr6"; - case eRegNumPPC_GCC_cr7: return "cr7"; - case eRegNumPPC_GCC_xer: return "xer"; - case eRegNumPPC_GCC_v0: return "v0"; - case eRegNumPPC_GCC_v1: return "v1"; - case eRegNumPPC_GCC_v2: return "v2"; - case eRegNumPPC_GCC_v3: return "v3"; - case eRegNumPPC_GCC_v4: return "v4"; - case eRegNumPPC_GCC_v5: return "v5"; - case eRegNumPPC_GCC_v6: return "v6"; - case eRegNumPPC_GCC_v7: return "v7"; - case eRegNumPPC_GCC_v8: return "v8"; - case eRegNumPPC_GCC_v9: return "v9"; - case eRegNumPPC_GCC_v10: return "v10"; - case eRegNumPPC_GCC_v11: return "v11"; - case eRegNumPPC_GCC_v12: return "v12"; - case eRegNumPPC_GCC_v13: return "v13"; - case eRegNumPPC_GCC_v14: return "v14"; - case eRegNumPPC_GCC_v15: return "v15"; - case eRegNumPPC_GCC_v16: return "v16"; - case eRegNumPPC_GCC_v17: return "v17"; - case eRegNumPPC_GCC_v18: return "v18"; - case eRegNumPPC_GCC_v19: return "v19"; - case eRegNumPPC_GCC_v20: return "v20"; - case eRegNumPPC_GCC_v21: return "v21"; - case eRegNumPPC_GCC_v22: return "v22"; - case eRegNumPPC_GCC_v23: return "v23"; - case eRegNumPPC_GCC_v24: return "v24"; - case eRegNumPPC_GCC_v25: return "v25"; - case eRegNumPPC_GCC_v26: return "v26"; - case eRegNumPPC_GCC_v27: return "v27"; - case eRegNumPPC_GCC_v28: return "v28"; - case eRegNumPPC_GCC_v29: return "v29"; - case eRegNumPPC_GCC_v30: return "v30"; - case eRegNumPPC_GCC_v31: return "v31"; - case eRegNumPPC_GCC_vrsave: return "vrsave"; - case eRegNumPPC_GCC_vscr: return "vscr"; - case eRegNumPPC_GCC_spe_acc: return "spe_acc"; - case eRegNumPPC_GCC_spefscr: return "spefscr"; - case eRegNumPPC_GCC_sfp: return "sfp"; - default: - break; - } - break; - - case eRegisterKindDWARF: - switch (reg_num) - { - case eRegNumPPC_DWARF_r0: return "r0"; - case eRegNumPPC_DWARF_r1: return "r1"; - case eRegNumPPC_DWARF_r2: return "r2"; - case eRegNumPPC_DWARF_r3: return "r3"; - case eRegNumPPC_DWARF_r4: return "r4"; - case eRegNumPPC_DWARF_r5: return "r5"; - case eRegNumPPC_DWARF_r6: return "r6"; - case eRegNumPPC_DWARF_r7: return "r7"; - case eRegNumPPC_DWARF_r8: return "r8"; - case eRegNumPPC_DWARF_r9: return "r9"; - case eRegNumPPC_DWARF_r10: return "r10"; - case eRegNumPPC_DWARF_r11: return "r11"; - case eRegNumPPC_DWARF_r12: return "r12"; - case eRegNumPPC_DWARF_r13: return "r13"; - case eRegNumPPC_DWARF_r14: return "r14"; - case eRegNumPPC_DWARF_r15: return "r15"; - case eRegNumPPC_DWARF_r16: return "r16"; - case eRegNumPPC_DWARF_r17: return "r17"; - case eRegNumPPC_DWARF_r18: return "r18"; - case eRegNumPPC_DWARF_r19: return "r19"; - case eRegNumPPC_DWARF_r20: return "r20"; - case eRegNumPPC_DWARF_r21: return "r21"; - case eRegNumPPC_DWARF_r22: return "r22"; - case eRegNumPPC_DWARF_r23: return "r23"; - case eRegNumPPC_DWARF_r24: return "r24"; - case eRegNumPPC_DWARF_r25: return "r25"; - case eRegNumPPC_DWARF_r26: return "r26"; - case eRegNumPPC_DWARF_r27: return "r27"; - case eRegNumPPC_DWARF_r28: return "r28"; - case eRegNumPPC_DWARF_r29: return "r29"; - case eRegNumPPC_DWARF_r30: return "r30"; - case eRegNumPPC_DWARF_r31: return "r31"; - - case eRegNumPPC_DWARF_fr0: return "fr0"; - case eRegNumPPC_DWARF_fr1: return "fr1"; - case eRegNumPPC_DWARF_fr2: return "fr2"; - case eRegNumPPC_DWARF_fr3: return "fr3"; - case eRegNumPPC_DWARF_fr4: return "fr4"; - case eRegNumPPC_DWARF_fr5: return "fr5"; - case eRegNumPPC_DWARF_fr6: return "fr6"; - case eRegNumPPC_DWARF_fr7: return "fr7"; - case eRegNumPPC_DWARF_fr8: return "fr8"; - case eRegNumPPC_DWARF_fr9: return "fr9"; - case eRegNumPPC_DWARF_fr10: return "fr10"; - case eRegNumPPC_DWARF_fr11: return "fr11"; - case eRegNumPPC_DWARF_fr12: return "fr12"; - case eRegNumPPC_DWARF_fr13: return "fr13"; - case eRegNumPPC_DWARF_fr14: return "fr14"; - case eRegNumPPC_DWARF_fr15: return "fr15"; - case eRegNumPPC_DWARF_fr16: return "fr16"; - case eRegNumPPC_DWARF_fr17: return "fr17"; - case eRegNumPPC_DWARF_fr18: return "fr18"; - case eRegNumPPC_DWARF_fr19: return "fr19"; - case eRegNumPPC_DWARF_fr20: return "fr20"; - case eRegNumPPC_DWARF_fr21: return "fr21"; - case eRegNumPPC_DWARF_fr22: return "fr22"; - case eRegNumPPC_DWARF_fr23: return "fr23"; - case eRegNumPPC_DWARF_fr24: return "fr24"; - case eRegNumPPC_DWARF_fr25: return "fr25"; - case eRegNumPPC_DWARF_fr26: return "fr26"; - case eRegNumPPC_DWARF_fr27: return "fr27"; - case eRegNumPPC_DWARF_fr28: return "fr28"; - case eRegNumPPC_DWARF_fr29: return "fr29"; - case eRegNumPPC_DWARF_fr30: return "fr30"; - case eRegNumPPC_DWARF_fr31: return "fr31"; - - case eRegNumPPC_DWARF_cr: return "cr"; - case eRegNumPPC_DWARF_fpscr: return "fpscr"; - case eRegNumPPC_DWARF_msr: return "msr"; - case eRegNumPPC_DWARF_vscr: return "vscr"; - - case eRegNumPPC_DWARF_sr0: return "sr0"; - case eRegNumPPC_DWARF_sr1: return "sr1"; - case eRegNumPPC_DWARF_sr2: return "sr2"; - case eRegNumPPC_DWARF_sr3: return "sr3"; - case eRegNumPPC_DWARF_sr4: return "sr4"; - case eRegNumPPC_DWARF_sr5: return "sr5"; - case eRegNumPPC_DWARF_sr6: return "sr6"; - case eRegNumPPC_DWARF_sr7: return "sr7"; - case eRegNumPPC_DWARF_sr8: return "sr8"; - case eRegNumPPC_DWARF_sr9: return "sr9"; - case eRegNumPPC_DWARF_sr10: return "sr10"; - case eRegNumPPC_DWARF_sr11: return "sr11"; - case eRegNumPPC_DWARF_sr12: return "sr12"; - case eRegNumPPC_DWARF_sr13: return "sr13"; - case eRegNumPPC_DWARF_sr14: return "sr14"; - case eRegNumPPC_DWARF_sr15: return "sr15"; - - case eRegNumPPC_DWARF_acc: return "acc"; - case eRegNumPPC_DWARF_mq: return "mq"; - case eRegNumPPC_DWARF_xer: return "xer"; - case eRegNumPPC_DWARF_rtcu: return "rtcu"; - case eRegNumPPC_DWARF_rtcl: return "rtcl"; - - case eRegNumPPC_DWARF_lr: return "lr"; - case eRegNumPPC_DWARF_ctr: return "ctr"; - - case eRegNumPPC_DWARF_dsisr: return "dsisr"; - case eRegNumPPC_DWARF_dar: return "dar"; - case eRegNumPPC_DWARF_dec: return "dec"; - case eRegNumPPC_DWARF_sdr1: return "sdr1"; - case eRegNumPPC_DWARF_srr0: return "srr0"; - case eRegNumPPC_DWARF_srr1: return "srr1"; - - case eRegNumPPC_DWARF_vrsave: return "vrsave"; - - case eRegNumPPC_DWARF_sprg0: return "sprg0"; - case eRegNumPPC_DWARF_sprg1: return "sprg1"; - case eRegNumPPC_DWARF_sprg2: return "sprg2"; - case eRegNumPPC_DWARF_sprg3: return "sprg3"; - - case eRegNumPPC_DWARF_asr: return "asr"; - case eRegNumPPC_DWARF_ear: return "ear"; - case eRegNumPPC_DWARF_tb: return "tb"; - case eRegNumPPC_DWARF_tbu: return "tbu"; - case eRegNumPPC_DWARF_pvr: return "pvr"; - - case eRegNumPPC_DWARF_spefscr: return "spefscr"; - - case eRegNumPPC_DWARF_ibat0u: return "ibat0u"; - case eRegNumPPC_DWARF_ibat0l: return "ibat0l"; - case eRegNumPPC_DWARF_ibat1u: return "ibat1u"; - case eRegNumPPC_DWARF_ibat1l: return "ibat1l"; - case eRegNumPPC_DWARF_ibat2u: return "ibat2u"; - case eRegNumPPC_DWARF_ibat2l: return "ibat2l"; - case eRegNumPPC_DWARF_ibat3u: return "ibat3u"; - case eRegNumPPC_DWARF_ibat3l: return "ibat3l"; - case eRegNumPPC_DWARF_dbat0u: return "dbat0u"; - case eRegNumPPC_DWARF_dbat0l: return "dbat0l"; - case eRegNumPPC_DWARF_dbat1u: return "dbat1u"; - case eRegNumPPC_DWARF_dbat1l: return "dbat1l"; - case eRegNumPPC_DWARF_dbat2u: return "dbat2u"; - case eRegNumPPC_DWARF_dbat2l: return "dbat2l"; - case eRegNumPPC_DWARF_dbat3u: return "dbat3u"; - case eRegNumPPC_DWARF_dbat3l: return "dbat3l"; - - case eRegNumPPC_DWARF_hid0: return "hid0"; - case eRegNumPPC_DWARF_hid1: return "hid1"; - case eRegNumPPC_DWARF_hid2: return "hid2"; - case eRegNumPPC_DWARF_hid3: return "hid3"; - case eRegNumPPC_DWARF_hid4: return "hid4"; - case eRegNumPPC_DWARF_hid5: return "hid5"; - case eRegNumPPC_DWARF_hid6: return "hid6"; - case eRegNumPPC_DWARF_hid7: return "hid7"; - case eRegNumPPC_DWARF_hid8: return "hid8"; - case eRegNumPPC_DWARF_hid9: return "hid9"; - case eRegNumPPC_DWARF_hid10: return "hid10"; - case eRegNumPPC_DWARF_hid11: return "hid11"; - case eRegNumPPC_DWARF_hid12: return "hid12"; - case eRegNumPPC_DWARF_hid13: return "hid13"; - case eRegNumPPC_DWARF_hid14: return "hid14"; - case eRegNumPPC_DWARF_hid15: return "hid15"; - - case eRegNumPPC_DWARF_vr0: return "vr0"; - case eRegNumPPC_DWARF_vr1: return "vr1"; - case eRegNumPPC_DWARF_vr2: return "vr2"; - case eRegNumPPC_DWARF_vr3: return "vr3"; - case eRegNumPPC_DWARF_vr4: return "vr4"; - case eRegNumPPC_DWARF_vr5: return "vr5"; - case eRegNumPPC_DWARF_vr6: return "vr6"; - case eRegNumPPC_DWARF_vr7: return "vr7"; - case eRegNumPPC_DWARF_vr8: return "vr8"; - case eRegNumPPC_DWARF_vr9: return "vr9"; - case eRegNumPPC_DWARF_vr10: return "vr10"; - case eRegNumPPC_DWARF_vr11: return "vr11"; - case eRegNumPPC_DWARF_vr12: return "vr12"; - case eRegNumPPC_DWARF_vr13: return "vr13"; - case eRegNumPPC_DWARF_vr14: return "vr14"; - case eRegNumPPC_DWARF_vr15: return "vr15"; - case eRegNumPPC_DWARF_vr16: return "vr16"; - case eRegNumPPC_DWARF_vr17: return "vr17"; - case eRegNumPPC_DWARF_vr18: return "vr18"; - case eRegNumPPC_DWARF_vr19: return "vr19"; - case eRegNumPPC_DWARF_vr20: return "vr20"; - case eRegNumPPC_DWARF_vr21: return "vr21"; - case eRegNumPPC_DWARF_vr22: return "vr22"; - case eRegNumPPC_DWARF_vr23: return "vr23"; - case eRegNumPPC_DWARF_vr24: return "vr24"; - case eRegNumPPC_DWARF_vr25: return "vr25"; - case eRegNumPPC_DWARF_vr26: return "vr26"; - case eRegNumPPC_DWARF_vr27: return "vr27"; - case eRegNumPPC_DWARF_vr28: return "vr28"; - case eRegNumPPC_DWARF_vr29: return "vr29"; - case eRegNumPPC_DWARF_vr30: return "vr30"; - case eRegNumPPC_DWARF_vr31: return "vr31"; - - case eRegNumPPC_DWARF_ev0: return "ev0"; - case eRegNumPPC_DWARF_ev1: return "ev1"; - case eRegNumPPC_DWARF_ev2: return "ev2"; - case eRegNumPPC_DWARF_ev3: return "ev3"; - case eRegNumPPC_DWARF_ev4: return "ev4"; - case eRegNumPPC_DWARF_ev5: return "ev5"; - case eRegNumPPC_DWARF_ev6: return "ev6"; - case eRegNumPPC_DWARF_ev7: return "ev7"; - case eRegNumPPC_DWARF_ev8: return "ev8"; - case eRegNumPPC_DWARF_ev9: return "ev9"; - case eRegNumPPC_DWARF_ev10: return "ev10"; - case eRegNumPPC_DWARF_ev11: return "ev11"; - case eRegNumPPC_DWARF_ev12: return "ev12"; - case eRegNumPPC_DWARF_ev13: return "ev13"; - case eRegNumPPC_DWARF_ev14: return "ev14"; - case eRegNumPPC_DWARF_ev15: return "ev15"; - case eRegNumPPC_DWARF_ev16: return "ev16"; - case eRegNumPPC_DWARF_ev17: return "ev17"; - case eRegNumPPC_DWARF_ev18: return "ev18"; - case eRegNumPPC_DWARF_ev19: return "ev19"; - case eRegNumPPC_DWARF_ev20: return "ev20"; - case eRegNumPPC_DWARF_ev21: return "ev21"; - case eRegNumPPC_DWARF_ev22: return "ev22"; - case eRegNumPPC_DWARF_ev23: return "ev23"; - case eRegNumPPC_DWARF_ev24: return "ev24"; - case eRegNumPPC_DWARF_ev25: return "ev25"; - case eRegNumPPC_DWARF_ev26: return "ev26"; - case eRegNumPPC_DWARF_ev27: return "ev27"; - case eRegNumPPC_DWARF_ev28: return "ev28"; - case eRegNumPPC_DWARF_ev29: return "ev29"; - case eRegNumPPC_DWARF_ev30: return "ev30"; - case eRegNumPPC_DWARF_ev31: return "ev31"; - default: - break; - } - break; - default: - break; + return arch_def->cpu; } - } - return NULL; + return LLDB_INVALID_CPUTYPE; } -//---------------------------------------------------------------------- -// Returns true if this object contains a valid architecture, false -// otherwise. -//---------------------------------------------------------------------- -bool -ArchSpec::IsValid() const +llvm::Triple::ArchType +ArchSpec::GetMachine () const { - return !(m_cpu == LLDB_INVALID_CPUTYPE); + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) + return core_def->machine; + + return llvm::Triple::UnknownArch; } -//---------------------------------------------------------------------- -// Returns true if this architecture is 64 bit, otherwise 32 bit is -// assumed and false is returned. -//---------------------------------------------------------------------- uint32_t ArchSpec::GetAddressByteSize() const { - if (m_addr_byte_size > 0) - return m_addr_byte_size; - - switch (m_type) - { - case kNumArchTypes: - case eArchTypeInvalid: - break; - - case eArchTypeMachO: - if (GetCPUType() & llvm::MachO::CPUArchABI64) - return 8; - else - return 4; - break; - - case eArchTypeELF: - switch (m_cpu) - { - case llvm::ELF::EM_M32: - case llvm::ELF::EM_SPARC: - case llvm::ELF::EM_386: - case llvm::ELF::EM_68K: - case llvm::ELF::EM_88K: - case llvm::ELF::EM_486: - case llvm::ELF::EM_860: - case llvm::ELF::EM_MIPS: - case llvm::ELF::EM_PPC: - case llvm::ELF::EM_ARM: - case llvm::ELF::EM_ALPHA: - case llvm::ELF::EM_SPARCV9: - return 4; - case llvm::ELF::EM_X86_64: - return 8; - } - break; - } + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) + return core_def->addr_byte_size; return 0; } -//---------------------------------------------------------------------- -// Returns the number of bytes that this object takes when an -// instance exists in memory. -//---------------------------------------------------------------------- -size_t -ArchSpec::MemorySize() const +ByteOrder +ArchSpec::GetDefaultEndian () const { - return sizeof(ArchSpec); + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) + return core_def->default_byte_order; + return eByteOrderInvalid; } -bool -ArchSpec::SetArchFromTargetTriple (const char *target_triple) -{ - if (target_triple) - { - const char *hyphen = strchr(target_triple, '-'); - if (hyphen) - { - std::string arch_only (target_triple, hyphen); - return SetArch (arch_only.c_str()); - } - } - return SetArch (target_triple); -} -void -ArchSpec::SetMachOArch (uint32_t cpu, uint32_t sub) +lldb::ByteOrder +ArchSpec::GetByteOrder () const { - m_type = lldb::eArchTypeMachO; - m_cpu = cpu; - m_sub = sub; - MachOArchUpdated (); + if (m_byte_order == eByteOrderInvalid) + return GetDefaultEndian(); + return m_byte_order; } -void -ArchSpec::MachOArchUpdated (size_t idx) +//===----------------------------------------------------------------------===// +// Mutators. + +bool +ArchSpec::SetTriple (const llvm::Triple &triple) { - // m_type, m_cpu, and m_sub have been updated, fixup everything else - if (idx >= k_num_mach_arch_defs) - { - for (size_t i=0; i<k_num_mach_arch_defs; i++) - { - if (m_cpu == g_mach_arch_defs[i].cpu) - { - if (m_sub == CPU_ANY || m_sub == LLDB_INVALID_CPUTYPE) - { - if (m_sub == g_mach_arch_defs[i].sub) - { - idx = i; - break; - } - } - else if ((m_sub & 0x00ffffff) == g_mach_arch_defs[i].sub) - { - idx = i; - break; - } - } - } - } + m_triple = triple; - if (idx < k_num_mach_arch_defs) + llvm::StringRef arch_name (m_triple.getArchName()); + const CoreDefinition *core_def = FindCoreDefinition (arch_name); + if (core_def) { - m_byte_order = g_mach_arch_defs[idx].byte_order; - m_addr_byte_size = g_mach_arch_defs[idx].addr_byte_size; - char triple_cstr[1024]; - int triple_cstr_len = ::snprintf (triple_cstr, - sizeof(triple_cstr), - "%s-apple-darwin", - g_mach_arch_defs[idx].name); - std::string triple_sstr (llvm::Triple::normalize (llvm::StringRef (triple_cstr, triple_cstr_len))); - llvm::StringRef triple_sref (triple_sstr.c_str(), triple_sstr.size()); - llvm::Triple triple (triple_sref); - m_triple = triple; + m_core = core_def->core; + m_byte_order = core_def->default_byte_order; + + // If the vendor, OS or environment aren't specified, default to the system? + const ArchSpec &host_arch_ref = Host::GetArchitecture (Host::eSystemDefaultArchitecture); + if (m_triple.getVendor() == llvm::Triple::UnknownVendor) + m_triple.setVendor(host_arch_ref.GetTriple().getVendor()); + if (m_triple.getOS() == llvm::Triple::UnknownOS) + m_triple.setOS(host_arch_ref.GetTriple().getOS()); + if (m_triple.getEnvironment() == llvm::Triple::UnknownEnvironment) + m_triple.setEnvironment(host_arch_ref.GetTriple().getEnvironment()); } else { - assert (!"Unknown mach-o architecture"); - m_byte_order = lldb::endian::InlHostByteOrder(); - // We weren't able to find our CPU type in out known list of mach architectures... - if (GetCPUType() & llvm::MachO::CPUArchABI64) - m_addr_byte_size = 8; - else - m_addr_byte_size = 4; - m_triple = llvm::Triple(); + Clear(); } -} -void -ArchSpec::ELFArchUpdated (size_t idx) -{ - if (idx >= k_num_elf_arch_defs) - { - for (size_t i=0; i<k_num_elf_arch_defs; i++) - { - if (g_elf_arch_defs[i].cpu == m_cpu) - { - idx = i; - break; - } - } - } - if (idx < k_num_elf_arch_defs) - { - m_byte_order = g_elf_arch_defs[idx].byte_order; - m_addr_byte_size = g_elf_arch_defs[idx].addr_byte_size; - char triple_cstr[1024]; - int triple_cstr_len = ::snprintf (triple_cstr, - sizeof(triple_cstr), - "%s-unknown-unknown", - g_elf_arch_defs[idx].name); - std::string triple_sstr (llvm::Triple::normalize (llvm::StringRef (triple_cstr, triple_cstr_len))); - llvm::StringRef triple_sref (triple_sstr.c_str(), triple_sstr.size()); - llvm::Triple triple (triple_sref); - m_triple = triple; - } - else - { - assert (!"Unknown ELF architecture"); - m_byte_order = lldb::endian::InlHostByteOrder(); - m_addr_byte_size = sizeof(void *); - m_triple = llvm::Triple(); - } + + return IsValid(); } -//---------------------------------------------------------------------- -// Change the CPU type and subtype given an architecture name. -//---------------------------------------------------------------------- bool -ArchSpec::SetArch (const char *arch_name) +ArchSpec::SetTriple (const char *triple_cstr) { - if (arch_name && arch_name[0] != '\0') + if (triple_cstr || triple_cstr[0]) { - // All system default architecture string values start with LLDB_ARCH_DEFAULT - if (::strncmp (arch_name, LLDB_ARCH_DEFAULT, strlen(LLDB_ARCH_DEFAULT)) == 0) + llvm::StringRef triple_stref (triple_cstr); + if (triple_stref.startswith (LLDB_ARCH_DEFAULT)) { // Special case for the current host default architectures... - - if (::strcmp (arch_name, LLDB_ARCH_DEFAULT_32BIT) == 0) + if (triple_stref.equals (LLDB_ARCH_DEFAULT_32BIT)) *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); - else if (::strcmp (arch_name, LLDB_ARCH_DEFAULT_64BIT) == 0) + else if (triple_stref.equals (LLDB_ARCH_DEFAULT_64BIT)) *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); - else + else if (triple_stref.equals (LLDB_ARCH_DEFAULT)) *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); - - return IsValid(); } - - size_t i; - switch (m_type) + else { - case eArchTypeInvalid: - case eArchTypeMachO: - for (i=0; i<k_num_mach_arch_defs; i++) - { - if (strcasecmp(arch_name, g_mach_arch_defs[i].name) == 0) - { - m_type = eArchTypeMachO; - m_cpu = g_mach_arch_defs[i].cpu; - m_sub = g_mach_arch_defs[i].sub; - MachOArchUpdated (i); - return true; - } - } - break; - - case eArchTypeELF: - for (i=0; i<k_num_elf_arch_defs; i++) - { - if (strcasecmp(arch_name, g_elf_arch_defs[i].name) == 0) - { - m_cpu = g_elf_arch_defs[i].cpu; - m_sub = g_elf_arch_defs[i].sub; - ELFArchUpdated (i); - return true; - } - } - break; - - case kNumArchTypes: - break; + std::string normalized_triple_sstr (llvm::Triple::normalize(triple_stref)); + triple_stref = normalized_triple_sstr; + SetTriple (llvm::Triple (triple_stref)); } + } + else + Clear(); + return IsValid(); +} - const char *str = arch_name; - // Check for a numeric cpu followed by an optional separator char and numeric subtype. - // This allows for support of new cpu type/subtypes without having to have - // a recompiled debug core. - // Examples: - // "12.6" is armv6 - // "0x0000000c-0x00000006" is also armv6 - - m_type = eArchTypeInvalid; - for (i=1; i<kNumArchTypes; ++i) - { - const char *arch_type_cstr = g_arch_type_strings[i]; - if (strstr(str, arch_type_cstr)) - { - m_type = (ArchitectureType)i; - str += strlen(arch_type_cstr) + 1; // Also skip separator char - } - } - - if (m_type != eArchTypeInvalid) +//bool +//ArchSpec::SetArchitecture (const char *arch_name) +//{ +// return SetArchitecture(llvm::StringRef (arch_name)); +//} +// +//bool +//ArchSpec::SetArchitecture (const llvm::StringRef& arch_name) +//{ +// // All default architecture names start with LLDB_ARCH_DEFAULT. +// if (arch_name.startswith (LLDB_ARCH_DEFAULT)) +// { +// // Special case for the current host default architectures... +// if (arch_name.equals (LLDB_ARCH_DEFAULT_32BIT)) +// *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); +// else if (arch_name.equals (LLDB_ARCH_DEFAULT_64BIT)) +// *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); +// else +// *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); +// } +// else +// { +// const CoreDefinition *core_def = FindCoreDefinition (arch_name); +// if (core_def) +// m_core = core_def->core; +// CoreUpdated(true); +// } +// return IsValid(); +//} +// +bool +ArchSpec::SetArchitecture (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub) +{ + m_core = kCore_invalid; + bool update_triple = true; + const ArchDefinition *arch_def = FindArchDefinition(arch_type); + if (arch_def) + { + const ArchDefinitionEntry *arch_def_entry = FindArchDefinitionEntry (arch_def, cpu, sub); + if (arch_def_entry) { - m_type = eArchTypeMachO; - char *end = NULL; - m_cpu = ::strtoul (str, &end, 0); - if (str != end) + const CoreDefinition *core_def = FindCoreDefinition (arch_def_entry->core); + if (core_def) { - if (*end == ARCH_SPEC_SEPARATOR_CHAR) + m_core = core_def->core; + update_triple = false; + m_triple.setArch (core_def->machine); + if (arch_type == eArchTypeMachO) { - // We have a cputype.cpusubtype format - str = end + 1; - if (*str != '\0') - { - m_sub = strtoul(str, &end, 0); - if (*end == '\0') - { - MachOArchUpdated (); - // We consumed the entire string and got a cpu type and subtype - return true; - } - } + m_triple.setVendor (llvm::Triple::Apple); + m_triple.setOS (llvm::Triple::Darwin); } - - // If we reach this point we have a valid cpu type, but no cpu subtype. - // Search for the first matching cpu type and use the corresponding cpu - // subtype. This setting should typically be the _ALL variant and should - // appear first in the list for each cpu type in the g_mach_arch_defs - // structure. - for (i=0; i<k_num_mach_arch_defs; ++i) + else { - if (m_cpu == g_mach_arch_defs[i].cpu) - { - m_sub = g_mach_arch_defs[i].sub; - m_byte_order = g_mach_arch_defs[i].byte_order; - m_addr_byte_size = g_mach_arch_defs[i].addr_byte_size; - MachOArchUpdated (i); - return true; - } + m_triple.setVendor (llvm::Triple::UnknownVendor); + m_triple.setOS (llvm::Triple::UnknownOS); } - - // Default the cpu subtype to zero when we don't have a matching - // cpu type in our architecture defs structure (g_mach_arch_defs). - m_sub = 0; - MachOArchUpdated (); - return true; } } } - Clear(); - return false; + CoreUpdated(update_triple); + return IsValid(); } -ByteOrder -ArchSpec::GetDefaultEndian () const +void +ArchSpec::SetByteOrder (lldb::ByteOrder byte_order) { - switch (GetGenericCPUType ()) + m_byte_order = byte_order; +} + +//===----------------------------------------------------------------------===// +// Helper methods. + +void +ArchSpec::CoreUpdated (bool update_triple) +{ + const CoreDefinition *core_def = FindCoreDefinition (m_core); + if (core_def) { - case eCPU_ppc: - case eCPU_ppc64: - return eByteOrderBig; - - case eCPU_arm: - case eCPU_i386: - case eCPU_x86_64: - return eByteOrderLittle; - - default: - break; + if (update_triple) + m_triple = llvm::Triple(core_def->name, "unknown", "unknown"); + m_byte_order = core_def->default_byte_order; + } + else + { + if (update_triple) + m_triple = llvm::Triple(); + m_byte_order = eByteOrderInvalid; } - return eByteOrderInvalid; } -//---------------------------------------------------------------------- -// Equal operator -//---------------------------------------------------------------------- +//===----------------------------------------------------------------------===// +// Operators. + bool lldb_private::operator== (const ArchSpec& lhs, const ArchSpec& rhs) { - uint32_t lhs_cpu = lhs.GetCPUType(); - uint32_t rhs_cpu = rhs.GetCPUType(); + const ArchSpec::Core lhs_core = lhs.GetCore (); + const ArchSpec::Core rhs_core = rhs.GetCore (); + + if (lhs_core == rhs_core) + return true; - if (lhs_cpu == CPU_ANY || rhs_cpu == CPU_ANY) + if (lhs_core == ArchSpec::kCore_any || rhs_core == ArchSpec::kCore_any) return true; - else if (lhs_cpu == rhs_cpu) + if (lhs_core == ArchSpec::kCore_arm_any) + { + if ((rhs_core >= ArchSpec::kCore_arm_first && rhs_core <= ArchSpec::kCore_arm_last) || (rhs_core == ArchSpec::kCore_arm_any)) + return true; + } + else if (rhs_core == ArchSpec::kCore_arm_any) + { + if ((lhs_core >= ArchSpec::kCore_arm_first && lhs_core <= ArchSpec::kCore_arm_last) || (lhs_core == ArchSpec::kCore_arm_any)) + return true; + } + else if (lhs_core == ArchSpec::kCore_x86_32_any) + { + if ((rhs_core >= ArchSpec::kCore_x86_32_first && rhs_core <= ArchSpec::kCore_x86_32_last) || (rhs_core == ArchSpec::kCore_x86_32_any)) + return true; + } + else if (rhs_core == ArchSpec::kCore_x86_32_any) { - uint32_t lhs_subtype = lhs.GetCPUSubtype(); - uint32_t rhs_subtype = rhs.GetCPUSubtype(); - if (lhs_subtype == CPU_ANY || rhs_subtype == CPU_ANY) + if ((lhs_core >= ArchSpec::kCore_x86_32_first && lhs_core <= ArchSpec::kCore_x86_32_last) || (lhs_core == ArchSpec::kCore_x86_32_any)) + return true; + } + else if (lhs_core == ArchSpec::kCore_ppc_any) + { + if ((rhs_core >= ArchSpec::kCore_ppc_first && rhs_core <= ArchSpec::kCore_ppc_last) || (rhs_core == ArchSpec::kCore_ppc_any)) + return true; + } + else if (rhs_core == ArchSpec::kCore_ppc_any) + { + if ((lhs_core >= ArchSpec::kCore_ppc_first && lhs_core <= ArchSpec::kCore_ppc_last) || (lhs_core == ArchSpec::kCore_ppc_any)) + return true; + } + else if (lhs_core == ArchSpec::kCore_ppc64_any) + { + if ((rhs_core >= ArchSpec::kCore_ppc64_first && rhs_core <= ArchSpec::kCore_ppc64_last) || (rhs_core == ArchSpec::kCore_ppc64_any)) + return true; + } + else if (rhs_core == ArchSpec::kCore_ppc64_any) + { + if ((lhs_core >= ArchSpec::kCore_ppc64_first && lhs_core <= ArchSpec::kCore_ppc64_last) || (lhs_core == ArchSpec::kCore_ppc64_any)) return true; - return lhs_subtype == rhs_subtype; } return false; } - -//---------------------------------------------------------------------- -// Not Equal operator -//---------------------------------------------------------------------- bool lldb_private::operator!= (const ArchSpec& lhs, const ArchSpec& rhs) { return !(lhs == rhs); } -//---------------------------------------------------------------------- -// Less than operator -//---------------------------------------------------------------------- bool lldb_private::operator<(const ArchSpec& lhs, const ArchSpec& rhs) { - uint32_t lhs_cpu = lhs.GetCPUType(); - uint32_t rhs_cpu = rhs.GetCPUType(); - - if (lhs_cpu == rhs_cpu) - return lhs.GetCPUSubtype() < rhs.GetCPUSubtype(); - - return lhs_cpu < rhs_cpu; + const ArchSpec::Core lhs_core = lhs.GetCore (); + const ArchSpec::Core rhs_core = rhs.GetCore (); + return lhs_core < rhs_core; } - diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index fbbab5bede4..28f589f6f25 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -877,7 +877,7 @@ Debugger::FormatPrompt ArchSpec arch (target->GetArchitecture ()); if (arch.IsValid()) { - s.PutCString (arch.AsCString()); + s.PutCString (arch.GetArchitectureName()); var_success = true; } } diff --git a/lldb/source/Core/Disassembler.cpp b/lldb/source/Core/Disassembler.cpp index 994e510056f..2c5e34aa90c 100644 --- a/lldb/source/Core/Disassembler.cpp +++ b/lldb/source/Core/Disassembler.cpp @@ -38,7 +38,7 @@ Disassembler::FindPlugin (const ArchSpec &arch) { Timer scoped_timer (__PRETTY_FUNCTION__, "Disassembler::FindPlugin (arch = %s)", - arch.AsCString()); + arch.GetArchitectureName()); std::auto_ptr<Disassembler> disassembler_ap; DisassemblerCreateInstance create_callback; diff --git a/lldb/source/Core/Log.cpp b/lldb/source/Core/Log.cpp index 49bd653d14e..1b5c74acf03 100644 --- a/lldb/source/Core/Log.cpp +++ b/lldb/source/Core/Log.cpp @@ -87,13 +87,10 @@ Log::PrintfWithFlagsVarArg (uint32_t flags, const char *format, va_list args) { static uint32_t g_sequence_id = 0; StreamString header; - static Mutex g_LogThreadedMutex(Mutex::eMutexTypeRecursive); - - Mutex::Locker locker; - - // Lock the threaded logging mutex if we are doing thread safe logging - if (m_options.Test (LLDB_LOG_OPTION_THREADSAFE)) - locker.Reset(g_LogThreadedMutex.GetMutex()); + // Enabling the thread safe logging actually deadlocks right now. + // Need to fix this at some point. +// static Mutex g_LogThreadedMutex(Mutex::eMutexTypeRecursive); +// Mutex::Locker locker (g_LogThreadedMutex); // Add a sequence ID if requested if (m_options.Test (LLDB_LOG_OPTION_PREPEND_SEQUENCE)) diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 96cc4d73258..a504829d75c 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -42,7 +42,7 @@ Module::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstStrin if (log) log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", this, - m_arch.AsCString(), + m_arch.GetArchitectureName(), m_file.GetDirectory().AsCString(""), m_file.GetFilename().AsCString(""), m_object_name.IsEmpty() ? "" : "(", @@ -56,7 +56,7 @@ Module::~Module() if (log) log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", this, - m_arch.AsCString(), + m_arch.GetArchitectureName(), m_file.GetDirectory().AsCString(""), m_file.GetFilename().AsCString(""), m_object_name.IsEmpty() ? "" : "(", @@ -474,7 +474,7 @@ Module::GetDescription (Stream *s) Mutex::Locker locker (m_mutex); if (m_arch.IsValid()) - s->Printf("(%s) ", m_arch.AsCString()); + s->Printf("(%s) ", m_arch.GetArchitectureName()); char path[PATH_MAX]; if (m_file.GetPath(path, sizeof(path))) @@ -648,17 +648,11 @@ Module::IsExecutable () bool Module::SetArchitecture (const ArchSpec &new_arch) { - if (m_arch == new_arch) - return true; - else if (!m_arch.IsValid()) + if (!m_arch.IsValid()) { m_arch = new_arch; return true; - } - else - { - return false; - } - + } + return m_arch == new_arch; } diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index 093878d30b5..864634f1fe8 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -404,7 +404,7 @@ ModuleList::LogUUIDAndPaths (LogSP &log_sp, const char *prefix_cstr) prefix_cstr ? prefix_cstr : "", (uint32_t)std::distance (begin, pos), uuid_cstr, - module->GetArchitecture().AsCString(), + module->GetArchitecture().GetArchitectureName(), module_file_spec.GetDirectory().GetCString(), module_file_spec.GetFilename().GetCString()); } @@ -521,7 +521,7 @@ ModuleList::GetModuleSP (const Module *module_ptr) const FileSpec &module_file_spec = module_ptr->GetFileSpec(); fprintf (stderr, "warning: module not in shared module list: %s (%s) \"%s/%s\"\n", uuid_cstr, - module_ptr->GetArchitecture().AsCString(), + module_ptr->GetArchitecture().GetArchitectureName(), module_file_spec.GetDirectory().GetCString(), module_file_spec.GetFilename().GetCString()); } @@ -650,9 +650,9 @@ ModuleList::GetSharedModule if (arch.IsValid()) { if (uuid_cstr[0]) - error.SetErrorStringWithFormat("'%s' does not contain the %s architecture and UUID %s.\n", path, arch.AsCString(), uuid_cstr[0]); + error.SetErrorStringWithFormat("'%s' does not contain the %s architecture and UUID %s.\n", path, arch.GetArchitectureName(), uuid_cstr[0]); else - error.SetErrorStringWithFormat("'%s' does not contain the %s architecture.\n", path, arch.AsCString()); + error.SetErrorStringWithFormat("'%s' does not contain the %s architecture.\n", path, arch.GetArchitectureName()); } } else @@ -707,7 +707,7 @@ ModuleList::GetSharedModule if (file_spec) { if (arch.IsValid()) - error.SetErrorStringWithFormat("Unable to open %s architecture in '%s'.\n", arch.AsCString(), path); + error.SetErrorStringWithFormat("Unable to open %s architecture in '%s'.\n", arch.GetArchitectureName(), path); else error.SetErrorStringWithFormat("Unable to open '%s'.\n", path); } @@ -721,7 +721,7 @@ ModuleList::GetSharedModule if (uuid_cstr[0]) error.SetErrorStringWithFormat("Cannot locate a module for UUID '%s'.\n", uuid_cstr[0]); else - error.SetErrorStringWithFormat("Cannot locate a module.\n", path, arch.AsCString()); + error.SetErrorStringWithFormat("Cannot locate a module.\n", path, arch.GetArchitectureName()); } } } diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp index 8f27c5982c5..231924f1c2d 100644 --- a/lldb/source/Expression/ClangExpressionParser.cpp +++ b/lldb/source/Expression/ClangExpressionParser.cpp @@ -714,7 +714,7 @@ ClangExpressionParser::DisassembleFunction (Stream &stream, ExecutionContext &ex if (disassembler == NULL) { ret.SetErrorToGenericError(); - ret.SetErrorStringWithFormat("Unable to find disassembler plug-in for %s architecture.", arch.AsCString()); + ret.SetErrorStringWithFormat("Unable to find disassembler plug-in for %s architecture.", arch.GetArchitectureName()); return ret; } diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp index 4c72e50c277..98e5b95cce4 100644 --- a/lldb/source/Host/common/Host.cpp +++ b/lldb/source/Host/common/Host.cpp @@ -268,20 +268,20 @@ Host::GetArchitecture (SystemDefaultArchitecture arch_kind) if (cputype & CPU_ARCH_ABI64) { // We have a 64 bit kernel on a 64 bit system - g_host_arch_32.SetMachOArch (~(CPU_ARCH_MASK) & cputype, cpusubtype); - g_host_arch_64.SetMachOArch (cputype, cpusubtype); + g_host_arch_32.SetArchitecture (lldb::eArchTypeMachO, ~(CPU_ARCH_MASK) & cputype, cpusubtype); + g_host_arch_64.SetArchitecture (lldb::eArchTypeMachO, cputype, cpusubtype); } else { // We have a 32 bit kernel on a 64 bit system - g_host_arch_32.SetMachOArch (cputype, cpusubtype); + g_host_arch_32.SetArchitecture (lldb::eArchTypeMachO, cputype, cpusubtype); cputype |= CPU_ARCH_ABI64; - g_host_arch_64.SetMachOArch (cputype, cpusubtype); + g_host_arch_64.SetArchitecture (lldb::eArchTypeMachO, cputype, cpusubtype); } } else { - g_host_arch_32.SetMachOArch (cputype, cpusubtype); + g_host_arch_32.SetArchitecture (lldb::eArchTypeMachO, cputype, cpusubtype); g_host_arch_64.Clear(); } } @@ -293,23 +293,23 @@ Host::GetArchitecture (SystemDefaultArchitecture arch_kind) { #if defined (__x86_64__) - g_host_arch_64.SetArch ("x86_64"); + g_host_arch_64.SetTriple ("x86_64"); #elif defined (__i386__) - g_host_arch_32.SetArch ("i386"); + g_host_arch_32.SetTriple ("i386"); #elif defined (__arm__) - g_host_arch_32.SetArch ("arm"); + g_host_arch_32.SetTriple ("arm"); #elif defined (__ppc64__) - g_host_arch_64.SetArch ("ppc64"); + g_host_arch_64.SetTriple ("ppc64"); #elif defined (__powerpc__) || defined (__ppc__) - g_host_arch_32.SetArch ("ppc"); + g_host_arch_32.SetTriple ("ppc"); #else @@ -377,7 +377,7 @@ Host::GetTargetTriple() { StreamString triple; triple.Printf("%s-%s-%s", - GetArchitecture().AsCString(), + GetArchitecture().GetArchitectureName(), GetVendorString().AsCString(), GetOSString().AsCString()); @@ -1093,9 +1093,9 @@ Host::GetArchSpecForExistingProcess (lldb::pid_t pid) if (error == 0) return return_spec; if (bsd_info.pbi_flags & PROC_FLAG_LP64) - return_spec.SetArch(LLDB_ARCH_DEFAULT_64BIT); + return_spec.SetTriple (LLDB_ARCH_DEFAULT_64BIT); else - return_spec.SetArch(LLDB_ARCH_DEFAULT_32BIT); + return_spec.SetTriple (LLDB_ARCH_DEFAULT_32BIT); #endif return return_spec; diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm index 552c7b34098..e7df53dd9d9 100644 --- a/lldb/source/Host/macosx/Host.mm +++ b/lldb/source/Host/macosx/Host.mm @@ -279,7 +279,7 @@ LaunchInNewTerminalWithCommandFile if (arch_spec && arch_spec->IsValid()) { - command_file.Printf("--arch=%s ", arch_spec->AsCString()); + command_file.Printf("--arch=%s ", arch_spec->GetArchitectureName()); } if (disable_aslr) @@ -441,12 +441,12 @@ LaunchInNewTerminalWithAppleScript darwin_debug_file_spec.GetPath(launcher_path, sizeof(launcher_path)); if (arch_spec) - command.Printf("arch -arch %s ", arch_spec->AsCString()); + command.Printf("arch -arch %s ", arch_spec->GetArchitectureName()); command.Printf("'%s' --unix-socket=%s", launcher_path, unix_socket_name.c_str()); if (arch_spec && arch_spec->IsValid()) - command.Printf(" --arch=%s", arch_spec->AsCString()); + command.Printf(" --arch=%s", arch_spec->GetArchitectureName()); if (working_dir) command.Printf(" --working-dir '%s'", working_dir); diff --git a/lldb/source/Host/macosx/Symbols.cpp b/lldb/source/Host/macosx/Symbols.cpp index 71748490f79..7a32e08a476 100644 --- a/lldb/source/Host/macosx/Symbols.cpp +++ b/lldb/source/Host/macosx/Symbols.cpp @@ -433,7 +433,7 @@ Symbols::LocateExecutableObjectFile (const FileSpec *exec_fspec, const ArchSpec* Timer scoped_timer (__PRETTY_FUNCTION__, "LocateExecutableObjectFile (file = %s, arch = %s, uuid = %p)", exec_fspec ? exec_fspec->GetFilename().AsCString ("<NULL>") : "<NULL>", - arch ? arch->AsCString() : "<NULL>", + arch ? arch->GetArchitectureName() : "<NULL>", uuid); FileSpec objfile_fspec; @@ -450,7 +450,7 @@ Symbols::LocateExecutableSymbolFile (const FileSpec *exec_fspec, const ArchSpec* Timer scoped_timer (__PRETTY_FUNCTION__, "LocateExecutableSymbolFile (file = %s, arch = %s, uuid = %p)", exec_fspec ? exec_fspec->GetFilename().AsCString ("<NULL>") : "<NULL>", - arch ? arch->AsCString() : "<NULL>", + arch ? arch->GetArchitectureName() : "<NULL>", uuid); FileSpec symbol_fspec; diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp index bc6bfd16ccc..edecaa17486 100644 --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp @@ -345,16 +345,12 @@ DisassemblerLLVM::InstructionLLVM::Extract(const DataExtractor &data, uint32_t d static inline EDAssemblySyntax_t SyntaxForArchSpec (const ArchSpec &arch) { - switch (arch.GetGenericCPUType()) + switch (arch.GetMachine ()) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: return kEDAssemblySyntaxX86ATT; - case ArchSpec::eCPU_arm: - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: - case ArchSpec::eCPU_sparc: default: break; } diff --git a/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp b/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp index 491cdada4c0..76a74bda68a 100644 --- a/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp +++ b/lldb/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp @@ -6814,7 +6814,7 @@ bool EmulateInstructionARM::SetArchitecture (const ArchSpec &arch) { m_arm_isa = 0; - const char *arch_cstr = arch.AsCString (); + const char *arch_cstr = arch.GetArchitectureName (); if (arch_cstr) { if (0 == ::strcasecmp(arch_cstr, "armv4t")) m_arm_isa = ARMv4T; diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp index fb73083afc4..7ff54c7ed8e 100644 --- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp +++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp @@ -360,7 +360,7 @@ ObjectContainerBSDArchive::Dump (Stream *s) const { s->Indent(); GetArchitectureAtIndex(i, arch); - s->Printf("arch[%u] = %s\n", arch.AsCString()); + s->Printf("arch[%u] = %s\n", arch.GetArchitectureName()); } for (i=0; i<num_objects; i++) { diff --git a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp index c2f8edc415b..7ff1943532c 100644 --- a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp +++ b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp @@ -168,7 +168,7 @@ ObjectContainerUniversalMachO::Dump (Stream *s) const { s->Indent(); GetArchitectureAtIndex(i, arch); - s->Printf("arch[%u] = %s\n", arch.AsCString()); + s->Printf("arch[%u] = %s\n", arch.GetArchitectureName()); } for (i=0; i<num_objects; i++) { @@ -190,7 +190,7 @@ ObjectContainerUniversalMachO::GetArchitectureAtIndex (uint32_t idx, ArchSpec& a { if (idx < m_header.nfat_arch) { - arch.SetMachOArch (m_fat_archs[idx].cputype, m_fat_archs[idx].cpusubtype); + arch.SetArchitecture (lldb::eArchTypeMachO, m_fat_archs[idx].cputype, m_fat_archs[idx].cpusubtype); return true; } return false; @@ -207,7 +207,7 @@ ObjectContainerUniversalMachO::GetObjectFile (const FileSpec *file) { arch = Target::GetDefaultArchitecture (); if (!arch.IsValid()) - arch = LLDB_ARCH_DEFAULT; + arch.SetTriple (LLDB_ARCH_DEFAULT); } else arch = m_module->GetArchitecture(); diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 0739b978aa3..445518d9e64 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -19,6 +19,7 @@ #include "lldb/Core/PluginManager.h" #include "lldb/Core/Section.h" #include "lldb/Core/Stream.h" +#include "lldb/Host/Host.h" #define CASE_AND_STREAM(s, def, width) \ case def: s->Printf("%-*s", width, #def); break; @@ -1045,28 +1046,9 @@ ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) bool ObjectFileELF::GetArchitecture (ArchSpec &arch) { - switch (m_header.e_machine) - { - default: - assert(false && "Unexpected machine type."); - break; - case EM_SPARC: arch.GetTriple().setArchName("sparc"); break; - case EM_386: arch.GetTriple().setArchName("i386"); break; - case EM_68K: arch.GetTriple().setArchName("68k"); break; - case EM_88K: arch.GetTriple().setArchName("88k"); break; - case EM_860: arch.GetTriple().setArchName("i860"); break; - case EM_MIPS: arch.GetTriple().setArchName("mips"); break; - case EM_PPC: arch.GetTriple().setArchName("powerpc"); break; - case EM_PPC64: arch.GetTriple().setArchName("powerpc64"); break; - case EM_ARM: arch.GetTriple().setArchName("arm"); break; - case EM_X86_64: arch.GetTriple().setArchName("x86_64"); break; - } - // TODO: determine if there is a vendor in the ELF? Default to "linux" for now - arch.GetTriple().setOSName ("linux"); - // TODO: determine if there is an OS in the ELF? Default to "gnu" for now - arch.GetTriple().setVendorName("gnu"); - - arch.SetElfArch(m_header.e_machine, m_header.e_flags); + arch.SetArchitecture (lldb::eArchTypeELF, m_header.e_machine, m_header.e_flags); + arch.GetTriple().setOSName (Host::GetOSString().GetCString()); + arch.GetTriple().setVendorName(Host::GetVendorString().GetCString()); return true; } diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index ac536c56617..deac8947521 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -1351,7 +1351,7 @@ ObjectFileMachO::Dump (Stream *s) ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype); - *s << ", file = '" << m_file << "', arch = " << header_arch.AsCString() << "\n"; + *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n"; if (m_sections_ap.get()) m_sections_ap->Dump(s, NULL, true, UINT32_MAX); @@ -1439,7 +1439,7 @@ bool ObjectFileMachO::GetArchitecture (ArchSpec &arch) { lldb_private::Mutex::Locker locker(m_mutex); - arch.SetMachOArch(m_header.cputype, m_header.cpusubtype); + arch.SetArchitecture (lldb::eArchTypeMachO, m_header.cputype, m_header.cpusubtype); return true; } diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp index a218c1dd041..5141e4b67eb 100644 --- a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp +++ b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_i386.cpp @@ -42,7 +42,11 @@ MachThreadContext_i386::Create (const ArchSpec &arch_spec, ThreadMacOSX &thread) void MachThreadContext_i386::Initialize() { - ArchSpec arch_spec("i386"); + llvm::Triple triple; + triple.setArch (llvm::Triple::x86); + triple.setVendor (llvm::Triple::Apple); + triple.setOS (llvm::Triple::Darwin); + ArchSpec arch_spec (triple); ProcessMacOSX::AddArchCreateCallback(arch_spec, MachThreadContext_i386::Create); } diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp index 706f63a53b6..a31713edd85 100644 --- a/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp +++ b/lldb/source/Plugins/Process/MacOSX-User/source/MacOSX/MachThreadContext_x86_64.cpp @@ -11,6 +11,8 @@ #include <sys/cdefs.h> +#include "llvm/ADT/Triple.h" + #include "lldb/Symbol/Function.h" #include "lldb/Symbol/Symbol.h" @@ -41,7 +43,11 @@ MachThreadContext_x86_64::Create(const ArchSpec &arch_spec, ThreadMacOSX &thread void MachThreadContext_x86_64::Initialize() { - ArchSpec arch_spec("x86_64"); + llvm::Triple triple; + triple.setArch (llvm::Triple::x86_64); + triple.setVendor (llvm::Triple::Apple); + triple.setOS (llvm::Triple::Darwin); + ArchSpec arch_spec (triple); ProcessMacOSX::AddArchCreateCallback(arch_spec, MachThreadContext_x86_64::Create); } diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp index e4be2730584..464500cf6b3 100644 --- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp +++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp @@ -337,7 +337,9 @@ ProcessMacOSX::DoLaunch // Set our user ID to an invalid process ID. SetID (LLDB_INVALID_PROCESS_ID); error.SetErrorToGenericError (); - error.SetErrorStringWithFormat("Failed to get object file from '%s' for arch %s.\n", module->GetFileSpec().GetFilename().AsCString(), module->GetArchitecture().AsCString()); + error.SetErrorStringWithFormat("Failed to get object file from '%s' for arch %s.\n", + module->GetFileSpec().GetFilename().AsCString(), + module->GetArchitecture().GetArchitectureName()); } // Return the process ID we have @@ -498,16 +500,16 @@ ProcessMacOSX::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 }; static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC }; - ArchSpec::CPU arch_cpu = m_arch_spec.GetGenericCPUType(); - switch (arch_cpu) + llvm::Triple::ArchType machine = m_arch_spec.GetMachine(); + switch (machine) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: trap_opcode = g_i386_breakpoint_opcode; trap_opcode_size = sizeof(g_i386_breakpoint_opcode); break; - case ArchSpec::eCPU_arm: + case llvm::Triple::arm: // TODO: fill this in for ARM. We need to dig up the symbol for // the address in the breakpoint locaiton and figure out if it is // an ARM or Thumb breakpoint. @@ -515,8 +517,8 @@ ProcessMacOSX::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) trap_opcode_size = sizeof(g_arm_breakpoint_opcode); break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: trap_opcode = g_ppc_breakpoint_opcode; trap_opcode_size = sizeof(g_ppc_breakpoint_opcode); break; @@ -1672,19 +1674,16 @@ ProcessMacOSX::PosixSpawnChildForPTraceDebugging // We don't need to do this for ARM, and we really shouldn't now that we // have multiple CPU subtypes and no posix_spawnattr call that allows us // to set which CPU subtype to launch... - if (arch_spec.GetType() == eArchTypeMachO) + cpu_type_t cpu = arch_spec.GetMachOCPUType(); + if (cpu != 0 && cpu != UINT32_MAX && cpu != LLDB_INVALID_CPUTYPE) { - cpu_type_t cpu = arch_spec.GetCPUType(); - if (cpu != 0 && cpu != UINT32_MAX && cpu != LLDB_INVALID_CPUTYPE) - { - size_t ocount = 0; - err.SetError( ::posix_spawnattr_setbinpref_np (&attr, 1, &cpu, &ocount), eErrorTypePOSIX); - if (err.Fail() || log) - err.PutToLog(log.get(), "::posix_spawnattr_setbinpref_np ( &attr, 1, cpu_type = 0x%8.8x, count => %zu )", cpu, ocount); + size_t ocount = 0; + err.SetError( ::posix_spawnattr_setbinpref_np (&attr, 1, &cpu, &ocount), eErrorTypePOSIX); + if (err.Fail() || log) + err.PutToLog(log.get(), "::posix_spawnattr_setbinpref_np ( &attr, 1, cpu_type = 0x%8.8x, count => %zu )", cpu, ocount); - if (err.Fail() != 0 || ocount != 1) - return LLDB_INVALID_PROCESS_ID; - } + if (err.Fail() != 0 || ocount != 1) + return LLDB_INVALID_PROCESS_ID; } #endif diff --git a/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp b/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp index 6824b799dd7..20e3ef76021 100644 --- a/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp +++ b/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp @@ -18,7 +18,7 @@ using namespace lldb_private; lldb_private::ArchDefaultUnwindPlan * ArchDefaultUnwindPlan_x86_64::CreateInstance (const lldb_private::ArchSpec &arch) { - if (arch.GetGenericCPUType () == ArchSpec::eCPU_x86_64) + if (arch.GetMachine () == llvm::Triple::x86_64) return new ArchDefaultUnwindPlan_x86_64 (); return NULL; } @@ -126,7 +126,7 @@ ArchDefaultUnwindPlan_x86_64::GetArchDefaultUnwindPlan (Thread& thread, Address lldb_private::ArchDefaultUnwindPlan * ArchDefaultUnwindPlan_i386::CreateInstance (const lldb_private::ArchSpec &arch) { - if (arch.GetGenericCPUType () == ArchSpec::eCPU_i386) + if (arch.GetMachine () == llvm::Triple::x86) return new ArchDefaultUnwindPlan_i386 (); return NULL; } diff --git a/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.cpp b/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.cpp index 35a4bf9204f..19eda664db1 100644 --- a/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.cpp +++ b/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.cpp @@ -34,22 +34,20 @@ ArchVolatileRegs_x86::RegisterIsVolatile (Thread& thread, uint32_t regnum) lldb_private::ArchVolatileRegs * ArchVolatileRegs_x86::CreateInstance (const lldb_private::ArchSpec &arch) { - uint32_t cpu = arch.GetCPUType (); - if (cpu != llvm::MachO::CPUTypeX86_64 && cpu != llvm::MachO::CPUTypeI386) - return NULL; - - return new ArchVolatileRegs_x86 (cpu); + llvm::Triple::ArchType cpu = arch.GetMachine (); + if (cpu == llvm::Triple::x86 || cpu == llvm::Triple::x86_64) + return new ArchVolatileRegs_x86 (cpu); + return NULL; } -ArchVolatileRegs_x86::ArchVolatileRegs_x86(int cpu) : - lldb_private::ArchVolatileRegs(), - m_cpu(cpu), - m_non_volatile_regs() +ArchVolatileRegs_x86::ArchVolatileRegs_x86(llvm::Triple::ArchType cpu) : + lldb_private::ArchVolatileRegs(), + m_cpu(cpu), + m_non_volatile_regs() { } void - ArchVolatileRegs_x86::initialize_regset(Thread& thread) { if (m_non_volatile_regs.size() > 0) @@ -78,13 +76,14 @@ ArchVolatileRegs_x86::initialize_regset(Thread& thread) const char **names; int namecount; - if (m_cpu == llvm::MachO::CPUTypeX86_64) + if (m_cpu == llvm::Triple::x86_64) { names = x86_64_regnames; namecount = sizeof (x86_64_regnames) / sizeof (char *); } else { + assert (m_cpu == llvm::Triple::x86); names = i386_regnames; namecount = sizeof (i386_regnames) / sizeof (char *); } diff --git a/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.h b/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.h index 97714b99da4..516f126e91b 100644 --- a/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.h +++ b/lldb/source/Plugins/Process/Utility/ArchVolatileRegs-x86.h @@ -11,6 +11,7 @@ #define liblldb_ArchVolatileRegs_x86_h_ #include "lldb/lldb-private.h" +#include "lldb/Core/ArchSpec.h" #include "lldb/Utility/ArchVolatileRegs.h" #include <set> @@ -62,11 +63,11 @@ public: EnablePluginLogging (lldb_private::Stream *strm, lldb_private::Args &command); private: - ArchVolatileRegs_x86(int cpu); // Call CreateInstance instead. + ArchVolatileRegs_x86(llvm::Triple::ArchType cpu); // Call CreateInstance instead. void initialize_regset(lldb_private::Thread& thread); - int m_cpu; + llvm::Triple::ArchType m_cpu; std::set<int> m_non_volatile_regs; }; diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp index 2a47640f6d9..79cbde4de1c 100644 --- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp +++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp @@ -30,7 +30,7 @@ StopInfoMachException::GetDescription () { if (m_description.empty() && m_value != 0) { - ArchSpec::CPU cpu = m_thread.GetProcess().GetTarget().GetArchitecture().GetGenericCPUType(); + const llvm::Triple::ArchType cpu = m_thread.GetProcess().GetTarget().GetArchitecture().GetMachine(); const char *exc_desc = NULL; const char *code_label = "code"; @@ -44,7 +44,7 @@ StopInfoMachException::GetDescription () subcode_label = "address"; switch (cpu) { - case ArchSpec::eCPU_arm: + case llvm::Triple::arm: switch (m_exc_code) { case 0x101: code_desc = "EXC_ARM_DA_ALIGN"; break; @@ -52,8 +52,8 @@ StopInfoMachException::GetDescription () } break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: switch (m_exc_code) { case 0x101: code_desc = "EXC_PPC_VM_PROT_READ"; break; @@ -71,14 +71,14 @@ StopInfoMachException::GetDescription () exc_desc = "EXC_BAD_INSTRUCTION"; switch (cpu) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: if (m_exc_code == 1) code_desc = "EXC_I386_INVOP"; break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: switch (m_exc_code) { case 1: code_desc = "EXC_PPC_INVALID_SYSCALL"; break; @@ -90,7 +90,7 @@ StopInfoMachException::GetDescription () } break; - case ArchSpec::eCPU_arm: + case llvm::Triple::arm: if (m_exc_code == 1) code_desc = "EXC_ARM_UNDEFINED"; break; @@ -104,8 +104,8 @@ StopInfoMachException::GetDescription () exc_desc = "EXC_ARITHMETIC"; switch (cpu) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: switch (m_exc_code) { case 1: code_desc = "EXC_I386_DIV"; break; @@ -119,8 +119,8 @@ StopInfoMachException::GetDescription () } break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: switch (m_exc_code) { case 1: code_desc = "EXC_PPC_OVERFLOW"; break; @@ -157,8 +157,8 @@ StopInfoMachException::GetDescription () exc_desc = "EXC_BREAKPOINT"; switch (cpu) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: switch (m_exc_code) { case 1: subcode_desc = "EXC_I386_SGL"; break; @@ -166,15 +166,15 @@ StopInfoMachException::GetDescription () } break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: switch (m_exc_code) { case 1: subcode_desc = "EXC_PPC_BREAKPOINT"; break; } break; - case ArchSpec::eCPU_arm: + case llvm::Triple::arm: switch (m_exc_code) { case 1: subcode_desc = "EXC_ARM_BREAKPOINT"; break; @@ -248,7 +248,7 @@ StopInfoMachException::CreateStopReasonWithMachException { if (exc_type != 0) { - ArchSpec::CPU cpu = thread.GetProcess().GetTarget().GetArchitecture().GetGenericCPUType(); + const llvm::Triple::ArchType cpu = thread.GetProcess().GetTarget().GetArchitecture().GetMachine(); switch (exc_type) { @@ -258,8 +258,8 @@ StopInfoMachException::CreateStopReasonWithMachException case 2: // EXC_BAD_INSTRUCTION switch (cpu) { - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: switch (exc_code) { case 1: // EXC_PPC_INVALID_SYSCALL @@ -293,8 +293,8 @@ StopInfoMachException::CreateStopReasonWithMachException bool is_software_breakpoint = false; switch (cpu) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: if (exc_code == 1) // EXC_I386_SGL { return StopInfo::CreateStopReasonToTrace(thread); @@ -305,12 +305,12 @@ StopInfoMachException::CreateStopReasonWithMachException } break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: is_software_breakpoint = exc_code == 1; // EXC_PPC_BREAKPOINT break; - case ArchSpec::eCPU_arm: + case llvm::Triple::arm: is_software_breakpoint = exc_code == 1; // EXC_ARM_BREAKPOINT break; diff --git a/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp b/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp index 94b3ae1c8bb..8f0f7d47578 100644 --- a/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp +++ b/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp @@ -847,11 +847,12 @@ UnwindAssemblyProfiler_x86::FirstNonPrologueInsn (AddressRange& func, Target& ta UnwindAssemblyProfiler * UnwindAssemblyProfiler_x86::CreateInstance (const ArchSpec &arch) { - ArchSpec::CPU cpu = arch.GetGenericCPUType (); - if (cpu != ArchSpec::eCPU_x86_64 && cpu != ArchSpec::eCPU_i386) - return NULL; - - return new UnwindAssemblyProfiler_x86 (cpu == ArchSpec::eCPU_x86_64 ? k_x86_64 : k_i386); + const llvm::Triple::ArchType cpu = arch.GetMachine (); + if (cpu == llvm::Triple::x86) + return new UnwindAssemblyProfiler_x86 (k_i386); + else if (cpu == llvm::Triple::x86_64) + return new UnwindAssemblyProfiler_x86 (k_x86_64); + return NULL; } diff --git a/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp b/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp index 2d9e0210929..f712fd92c54 100644 --- a/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp +++ b/lldb/source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp @@ -32,12 +32,12 @@ UnwindMacOSXFrameBackchain::GetFrameCount() { if (m_cursors.empty()) { - const ArchSpec target_arch (m_thread.GetProcess().GetTarget().GetArchitecture ()); + const ArchSpec& target_arch = m_thread.GetProcess().GetTarget().GetArchitecture (); // Frame zero should always be supplied by the thread... StackFrameSP frame_sp (m_thread.GetStackFrameAtIndex (0)); - if (target_arch == ArchSpec("x86_64")) + if (target_arch.GetMachine() == llvm::Triple::x86_64) GetStackFrameData_x86_64 (frame_sp.get()); - else if (target_arch == ArchSpec("i386")) + else if (target_arch.GetMachine() == llvm::Triple::x86) GetStackFrameData_i386 (frame_sp.get()); } diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp index e23be430b2e..126b60f2f70 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp @@ -1001,7 +1001,7 @@ GDBRemoteCommunication::GetHostInfo () } if (cpu != LLDB_INVALID_CPUTYPE) - m_arch.SetMachOArch (cpu, sub); + m_arch.SetArchitecture (lldb::eArchTypeMachO, cpu, sub); } } return m_supports_qHostInfo == eLazyBoolYes; diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index df3e09a9988..34eca44081a 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -328,8 +328,7 @@ ProcessGDBRemote::BuildDynamicRegisterInfo (bool force) // We didn't get anything. See if we are debugging ARM and fill with // a hard coded register set until we can get an updated debugserver // down on the devices. - ArchSpec arm_arch ("arm"); - if (GetTarget().GetArchitecture() == arm_arch) + if (GetTarget().GetArchitecture().GetMachine() == llvm::Triple::arm) m_register_info.HardcodeARMRegisters(); } m_register_info.Finalize (); @@ -553,7 +552,9 @@ ProcessGDBRemote::DoLaunch { // Set our user ID to an invalid process ID. 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()); + error.SetErrorStringWithFormat("Failed to get object file from '%s' for arch %s.\n", + module->GetFileSpec().GetFilename().AsCString(), + module->GetArchitecture().GetArchitectureName()); } return error; @@ -642,8 +643,8 @@ ProcessGDBRemote::DidLaunchOrAttach () // it has, so we really need to take the remote host architecture as our // defacto architecture in this case. - if (gdb_remote_arch == ArchSpec ("arm") && - vendor && ::strcmp(vendor, "apple") == 0) + if (gdb_remote_arch.GetMachine() == llvm::Triple::arm && + gdb_remote_arch.GetTriple().getVendor() == llvm::Triple::Apple) { GetTarget().SetArchitecture (gdb_remote_arch); target_arch = gdb_remote_arch; @@ -1044,16 +1045,16 @@ ProcessGDBRemote::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 }; static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC }; - ArchSpec::CPU arch_cpu = GetTarget().GetArchitecture().GetGenericCPUType(); - switch (arch_cpu) + const llvm::Triple::ArchType machine = GetTarget().GetArchitecture().GetMachine(); + switch (machine) { - case ArchSpec::eCPU_i386: - case ArchSpec::eCPU_x86_64: + case llvm::Triple::x86: + case llvm::Triple::x86_64: trap_opcode = g_i386_breakpoint_opcode; trap_opcode_size = sizeof(g_i386_breakpoint_opcode); break; - case ArchSpec::eCPU_arm: + case llvm::Triple::arm: // TODO: fill this in for ARM. We need to dig up the symbol for // the address in the breakpoint locaiton and figure out if it is // an ARM or Thumb breakpoint. @@ -1061,8 +1062,8 @@ ProcessGDBRemote::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) trap_opcode_size = sizeof(g_arm_breakpoint_opcode); break; - case ArchSpec::eCPU_ppc: - case ArchSpec::eCPU_ppc64: + case llvm::Triple::ppc: + case llvm::Triple::ppc64: trap_opcode = g_ppc_breakpoint_opcode; trap_opcode_size = sizeof(g_ppc_breakpoint_opcode); break; @@ -1955,31 +1956,33 @@ ProcessGDBRemote::StartDebugserverProcess Error local_err; // Errors that don't affect the spawning. if (log) - log->Printf ("%s ( path='%s', argv=%p, envp=%p, arch=%s )", __FUNCTION__, debugserver_path, inferior_argv, inferior_envp, inferior_arch.AsCString()); + log->Printf ("%s ( path='%s', argv=%p, envp=%p, arch=%s )", + __FUNCTION__, + debugserver_path, + inferior_argv, + inferior_envp, + inferior_arch.GetArchitectureName()); error.SetError( ::posix_spawnattr_init (&attr), eErrorTypePOSIX); if (error.Fail() || log) error.PutToLog(log.get(), "::posix_spawnattr_init ( &attr )"); if (error.Fail()) - return error;; + return error; #if !defined (__arm__) // We don't need to do this for ARM, and we really shouldn't now // that we have multiple CPU subtypes and no posix_spawnattr call // that allows us to set which CPU subtype to launch... - if (inferior_arch.GetType() == eArchTypeMachO) + cpu_type_t cpu = inferior_arch.GetMachOCPUType(); + if (cpu != 0 && cpu != UINT32_MAX && cpu != LLDB_INVALID_CPUTYPE) { - cpu_type_t cpu = inferior_arch.GetCPUType(); - if (cpu != 0 && cpu != UINT32_MAX && cpu != LLDB_INVALID_CPUTYPE) - { - size_t ocount = 0; - error.SetError( ::posix_spawnattr_setbinpref_np (&attr, 1, &cpu, &ocount), eErrorTypePOSIX); - if (error.Fail() || log) - error.PutToLog(log.get(), "::posix_spawnattr_setbinpref_np ( &attr, 1, cpu_type = 0x%8.8x, count => %zu )", cpu, ocount); - - if (error.Fail() != 0 || ocount != 1) - return error; - } + size_t ocount = 0; + error.SetError( ::posix_spawnattr_setbinpref_np (&attr, 1, &cpu, &ocount), eErrorTypePOSIX); + if (error.Fail() || log) + error.PutToLog(log.get(), "::posix_spawnattr_setbinpref_np ( &attr, 1, cpu_type = 0x%8.8x, count => %zu )", cpu, ocount); + + if (error.Fail() != 0 || ocount != 1) + return error; } #endif diff --git a/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp index 635c00c7438..99ce588a30d 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp @@ -142,7 +142,8 @@ ThreadGDBRemote::GetUnwinder () if (m_unwinder_ap.get() == NULL) { const ArchSpec target_arch (GetProcess().GetTarget().GetArchitecture ()); - if (target_arch == ArchSpec("x86_64") || target_arch == ArchSpec("i386")) + const llvm::Triple::ArchType machine = target_arch.GetMachine(); + if (machine == llvm::Triple::x86_64 || machine == llvm::Triple::x86) { m_unwinder_ap.reset (new UnwindLLDB (*this)); } diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 9b7f20561b7..3a775b091fe 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -182,7 +182,7 @@ SymbolContext::GetDescription(Stream *s, lldb::DescriptionLevel level, Target *t module_sp->GetFileSpec().Dump(s); *s << '"'; if (module_sp->GetArchitecture().IsValid()) - s->Printf (", arch = \"%s\"", module_sp->GetArchitecture().AsCString()); + s->Printf (", arch = \"%s\"", module_sp->GetArchitecture().GetArchitectureName()); s->EOL(); } diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 3ce42d82e21..e1e73c24cab 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -801,28 +801,20 @@ Target::GetSettingsController () ArchSpec Target::GetDefaultArchitecture () { - lldb::UserSettingsControllerSP &settings_controller = GetSettingsController(); - lldb::SettableVariableType var_type; - Error err; - StringList result = settings_controller->GetVariable ("target.default-arch", var_type, "[]", err); - - const char *default_name = ""; - if (result.GetSize() == 1 && err.Success()) - default_name = result.GetStringAtIndex (0); - - ArchSpec default_arch (default_name); - return default_arch; + lldb::UserSettingsControllerSP settings_controller_sp (GetSettingsController()); + + if (settings_controller_sp) + return static_cast<Target::SettingsController *>(settings_controller_sp.get())->GetArchitecture (); + return ArchSpec(); } void -Target::SetDefaultArchitecture (ArchSpec new_arch) +Target::SetDefaultArchitecture (const ArchSpec& arch) { - if (new_arch.IsValid()) - GetSettingsController ()->SetVariable ("target.default-arch", - new_arch.AsCString(), - lldb::eVarSetOperationAssign, - false, - "[]"); + lldb::UserSettingsControllerSP settings_controller_sp (GetSettingsController()); + + if (settings_controller_sp) + static_cast<Target::SettingsController *>(settings_controller_sp.get())->GetArchitecture () = arch; } Target * @@ -854,7 +846,7 @@ Target::UpdateInstanceName () { sstr.Printf ("%s_%s", module_sp->GetFileSpec().GetFilename().AsCString(), - module_sp->GetArchitecture().AsCString()); + module_sp->GetArchitecture().GetArchitectureName()); GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), sstr.GetData()); } @@ -1053,11 +1045,9 @@ Target::SettingsController::SetGlobalVariable (const ConstString &var_name, { if (var_name == GetSettingNameForDefaultArch()) { - ArchSpec tmp_spec (value); - if (tmp_spec.IsValid()) - m_default_architecture = tmp_spec; - else - err.SetErrorStringWithFormat ("'%s' is not a valid architecture.", value); + m_default_architecture.SetTriple (value); + if (!m_default_architecture.IsValid()) + err.SetErrorStringWithFormat ("'%s' is not a valid architecture or triple.", value); } return true; } @@ -1072,7 +1062,7 @@ Target::SettingsController::GetGlobalVariable (const ConstString &var_name, { // If the arch is invalid (the default), don't show a string for it if (m_default_architecture.IsValid()) - value.AppendString (m_default_architecture.AsCString()); + value.AppendString (m_default_architecture.GetArchitectureName()); return true; } else diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index cbbb12f0353..af681d22f45 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -58,7 +58,7 @@ TargetList::CreateTarget "TargetList::CreateTarget (file = '%s/%s', arch = '%s', uuid = %p)", file.GetDirectory().AsCString(), file.GetFilename().AsCString(), - arch.AsCString(), + arch.GetArchitectureName(), uuid_ptr); Error error; @@ -96,7 +96,7 @@ TargetList::CreateTarget file.GetDirectory().AsCString(), file.GetDirectory() ? "/" : "", file.GetFilename().AsCString(), - arch.AsCString()); + arch.GetArchitectureName()); } else { diff --git a/lldb/test/dotest.py b/lldb/test/dotest.py index d36a5fe3fdd..77ee47dedb0 100755 --- a/lldb/test/dotest.py +++ b/lldb/test/dotest.py @@ -629,7 +629,7 @@ def lldbLoggings(): else: lldb_log_option = "event process expr state api" ci.HandleCommand( - "log enable -T -n -f " + os.environ["LLDB_LOG"] + " lldb " + lldb_log_option, + "log enable -n -f " + os.environ["LLDB_LOG"] + " lldb " + lldb_log_option, res) if not res.Succeeded(): raise Exception('log enable failed (check LLDB_LOG env variable.') @@ -641,7 +641,7 @@ def lldbLoggings(): else: gdb_remote_log_option = "packets process" ci.HandleCommand( - "log enable -T -n -f " + os.environ["GDB_REMOTE_LOG"] + " process.gdb-remote " + "log enable -n -f " + os.environ["GDB_REMOTE_LOG"] + " process.gdb-remote " + gdb_remote_log_option, res) if not res.Succeeded(): |