124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ArchSpec.h ----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_ArchSpec_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ArchSpec_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(__cplusplus) 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 16940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton#include "llvm/ADT/StringRef.h" 17395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "llvm/ADT/Triple.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstruct CoreDefinition; 22940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @class ArchSpec ArchSpec.h "lldb/Core/ArchSpec.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief An architecture specification class. 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 27940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton/// A class designed to be created from a cpu type and subtype, a 28940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton/// string representation, or an llvm::Triple. Keeping all of the 29940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton/// conversions of strings to architecture enumeration values confined 30940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton/// to this class allows new architecture support to be added easily. 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ArchSpec 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 35940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton enum Core 36cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton { 37940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_generic, 38940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_armv4, 39940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_armv4t, 40940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_armv5, 41a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_arm_armv5e, 42940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_armv5t, 43940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_armv6, 44940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_arm_armv7, 45b1888f24fa181489840b9acf193e224d125d0776Greg Clayton eCore_arm_armv7f, 46b1888f24fa181489840b9acf193e224d125d0776Greg Clayton eCore_arm_armv7s, 472099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda eCore_arm_armv7k, 482099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda eCore_arm_armv7m, 492099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda eCore_arm_armv7em, 50889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton eCore_arm_xscale, 51a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumb, 52a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv4t, 53a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv5, 54a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv5e, 55a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv6, 56a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv7, 57a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv7f, 58a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton eCore_thumbv7s, 592099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda eCore_thumbv7k, 602099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda eCore_thumbv7m, 612099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda eCore_thumbv7em, 62940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 63940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_generic, 64940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc601, 65940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc602, 66940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc603, 67940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc603e, 68940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc603ev, 69940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc604, 70940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc604e, 71940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc620, 72940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc750, 73940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc7400, 74940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc7450, 75940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc_ppc970, 76940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 77940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc64_generic, 78940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_ppc64_ppc970_64, 79940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 80940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_sparc_generic, 81940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 82940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_sparc9_generic, 83940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 84940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_x86_32_i386, 85940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_x86_32_i486, 86940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_x86_32_i486sx, 87940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 88940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eCore_x86_64_x86_64, 89a53324d018afb71a1a53840c426aab47edb56383Greg Clayton eCore_uknownMach32, 90a53324d018afb71a1a53840c426aab47edb56383Greg Clayton eCore_uknownMach64, 91940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kNumCores, 92940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 93940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_invalid, 94940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton // The following constants are used for wildcard matching only 95b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton kCore_any, 96940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_arm_any, 97b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton kCore_ppc_any, 98b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton kCore_ppc64_any, 99b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton kCore_x86_32_any, 100b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 101940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_arm_first = eCore_arm_generic, 102940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_arm_last = eCore_arm_xscale, 103940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 104b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton kCore_thumb_first = eCore_thumb, 1052099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda kCore_thumb_last = eCore_thumbv7em, 106b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 107940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_ppc_first = eCore_ppc_generic, 108940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_ppc_last = eCore_ppc_ppc970, 109940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 110940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_ppc64_first = eCore_ppc64_generic, 111940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_ppc64_last = eCore_ppc64_ppc970_64, 112940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 113940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_x86_32_first = eCore_x86_32_i386, 114940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton kCore_x86_32_last = eCore_x86_32_i486sx 115cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton }; 116cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Default constructor. 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Default constructor that initializes the object with invalid 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// cpu type and subtype values. 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArchSpec (); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 126940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Constructor over triple. 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 128940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Constructs an ArchSpec with properties consistent with the given 129940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Triple. 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 13125dcbeb046c056f1c8a8244c548dc410c425fa46Jim Ingham explicit 132940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchSpec (const llvm::Triple &triple); 13325dcbeb046c056f1c8a8244c548dc410c425fa46Jim Ingham explicit 134b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec (const char *triple_cstr); 135b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton explicit 136f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton ArchSpec (const char *triple_cstr, Platform *platform); 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 138940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Constructor over architecture name. 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 140940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Constructs an ArchSpec with properties consistent with the given 141940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// object type and architecture name. 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 14325dcbeb046c056f1c8a8244c548dc410c425fa46Jim Ingham explicit 144b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton ArchSpec (ArchitectureType arch_type, 145940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t cpu_type, 146940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t cpu_subtype); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Destructor. 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~ArchSpec (); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Assignment operator. 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] rhs another ArchSpec object to copy. 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 158940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return A const reference to this object. 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ArchSpec& 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner operator= (const ArchSpec& rhs); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton static size_t 1645e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton AutoComplete (const char *name, 1655e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton StringList &matches); 1665e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 168940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Returns a static string representing the current architecture. 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 170940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return A static string correcponding to the current 171940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// architecture. 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char * 174940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton GetArchitectureName () const; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Clears the object state. 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Clears the object state back to a default invalid state. 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear (); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns the size in bytes of an address of the current 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// architecture. 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return The byte size of an address of the current architecture. 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetAddressByteSize () const; 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 194940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Returns a machine family for the current architecture. 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 196940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return An LLVM arch type. 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 198940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::Triple::ArchType 199940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton GetMachine () const; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 202940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Tests if this ArchSpec is valid. 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 204940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return True if the current architecture is valid, false 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// otherwise. 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 208940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton IsValid () const 209940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 21041a857a34dd83831c4e9db23179608cb8bd28328Jason Molenda return m_core >= eCore_arm_generic && m_core < kNumCores; 211940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton bool 214b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton TripleVendorWasSpecified() const 215b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 216b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return !m_triple.getVendorName().empty(); 217b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 218b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 219b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton bool 220b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton TripleOSWasSpecified() const 221b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 222b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return !m_triple.getOSName().empty(); 223b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 226940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Sets this ArchSpec according to the given architecture name. 227940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 228940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// The architecture name can be one of the generic system default 229940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// values: 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @li \c LLDB_ARCH_DEFAULT - The arch the current system defaults 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// to when a program is launched without any extra 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// attributes or settings. 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @li \c LLDB_ARCH_DEFAULT_32BIT - The default host architecture 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// for 32 bit (if any). 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @li \c LLDB_ARCH_DEFAULT_64BIT - The default host architecture 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// for 64 bit (if any). 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 239940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Alternatively, if the object type of this ArchSpec has been 240940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// configured, a concrete architecture can be specified to set 241940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// the CPU type ("x86_64" for example). 242940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 243940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Finally, an encoded object and archetecture format is accepted. 244940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// The format contains an object type (like "macho" or "elf"), 245940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// followed by a platform dependent encoding of CPU type and 246940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// subtype. For example: 247940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 248940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// "macho" : Specifies an object type of MachO. 249940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// "macho-16-6" : MachO specific encoding for ARMv6. 250940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// "elf-43 : ELF specific encoding for Sparc V9. 251940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] arch_name The name of an architecture. 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 254940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return True if @p arch_name was successfully translated, false 255940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// otherwise. 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 257940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// bool 258940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// SetArchitecture (const llvm::StringRef& arch_name); 259940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// 260940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// bool 261940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// SetArchitecture (const char *arch_name); 262940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 264940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Change the architecture object type and CPU type. 265940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 266940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @param[in] arch_type The object type of this ArchSpec. 267940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 268940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @param[in] cpu The required CPU type. 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 270940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return True if the object and CPU type were sucessfully set. 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 272940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton bool 273b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton SetArchitecture (ArchitectureType arch_type, 274940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t cpu, 275940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t sub); 276395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 277395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton //------------------------------------------------------------------ 278395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton /// Returns the byte order for the architecture specification. 279395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton /// 280395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton /// @return The endian enumeration for the current endianness of 281395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton /// the architecture specification 282395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton //------------------------------------------------------------------ 283395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton lldb::ByteOrder 284940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton GetByteOrder () const; 285395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 286940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 287940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Sets this ArchSpec's byte order. 288940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 289940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// In the common case there is no need to call this method as the 290940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// byte order can almost always be determined by the architecture. 291940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// However, many CPU's are bi-endian (ARM, Alpha, PowerPC, etc) 292940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// and the default/assumed byte order may be incorrect. 293940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 294395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton void 295889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton SetByteOrder (lldb::ByteOrder byte_order) 296889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { 297889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton m_byte_order = byte_order; 298889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton } 299889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 300889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t 301889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton GetMinimumOpcodeByteSize() const; 302889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 303889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t 304889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton GetMaximumOpcodeByteSize() const; 305940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 306940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton Core 307940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton GetCore () const 308395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 309940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_core; 310395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 311395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 312940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t 313940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton GetMachOCPUType () const; 314940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 315940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t 316940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton GetMachOCPUSubType () const; 317940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 318940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 319940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Architecture tripple accessor. 320940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 321940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return A triple describing this ArchSpec. 322940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 323395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton llvm::Triple & 324395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton GetTriple () 325395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 326395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_triple; 327395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 328940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 329940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 330940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Architecture tripple accessor. 331940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 332940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return A triple describing this ArchSpec. 333940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 334395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton const llvm::Triple & 335395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton GetTriple () const 336395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 337395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_triple; 338395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 341940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// Architecture tripple setter. 342940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 343b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson /// Configures this ArchSpec according to the given triple. If the 344b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson /// triple has unknown components in all of the vendor, OS, and 345b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson /// the optional environment field (i.e. "i386-unknown-unknown") 346b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson /// then default values are taken from the host. Architecture and 347b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson /// environment components are used to further resolve the CPU type 348b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson /// and subtype, endian characteristics, etc. 349940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// 350940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// @return A triple describing this ArchSpec. 351940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton //------------------------------------------------------------------ 352940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton bool 353940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton SetTriple (const llvm::Triple &triple); 3540f577c2ab79604f7300ac66afebcaa4a4b2dceefGreg Clayton 355940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton bool 356b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton SetTriple (const char *triple_cstr); 357b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 358b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton bool 359b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton SetTriple (const char *triple_cstr, 360b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton Platform *platform); 361940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns the default endianness of the architecture. 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return The endian enumeration for the default endianness of 366940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton /// the architecture. 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ByteOrder 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefaultEndian () const; 370cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 3716e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda //------------------------------------------------------------------ 3726e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// Compare an ArchSpec to another ArchSpec, requiring an exact cpu 3736e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// type match between them. 3746e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// e.g. armv7s is not an exact match with armv7 - this would return false 3756e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// 3766e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// @return true if the two ArchSpecs match. 3776e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda //------------------------------------------------------------------ 3786e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda bool 3796e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda IsExactMatch (const ArchSpec& rhs) const; 3806e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 3816e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda //------------------------------------------------------------------ 3826e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// Compare an ArchSpec to another ArchSpec, requiring a compatible 3836e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// cpu type match between them. 3846e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// e.g. armv7s is compatible with armv7 - this method would return true 3856e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// 3866e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda /// @return true if the two ArchSpecs are compatible 3876e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda //------------------------------------------------------------------ 3886e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda bool 3896e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda IsCompatibleMatch (const ArchSpec& rhs) const; 3906e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 3926e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda bool 39340e278caddf5442776f9408f20d757cc85fe630aSean Callanan IsEqualTo (const ArchSpec& rhs, bool exact_match) const; 3946e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 395395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton llvm::Triple m_triple; 396940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton Core m_core; 397395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton lldb::ByteOrder m_byte_order; 398940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 399940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton // Called when m_def or m_entry are changed. Fills in all remaining 400940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton // members with default values. 401395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton void 402940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton CoreUpdated (bool update_triple); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @fn bool operator< (const ArchSpec& lhs, const ArchSpec& rhs) 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief Less than operator. 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Tests two ArchSpec objects to see if \a lhs is less than \a 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// rhs. 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @param[in] lhs The Left Hand Side ArchSpec object to compare. 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @param[in] rhs The Left Hand Side ArchSpec object to compare. 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @return true if \a lhs is less than \a rhs 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool operator< (const ArchSpec& lhs, const ArchSpec& rhs); 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #if defined(__cplusplus) 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef liblldb_ArchSpec_h_ 423