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