1 //===-- ConstString.h -------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_ConstString_h_
11 #define liblldb_ConstString_h_
12 #if defined(__cplusplus)
13 
14 #include <assert.h>
15 
16 #include "lldb/lldb-private.h"
17 #include "llvm/ADT/StringRef.h"
18 
19 
20 namespace lldb_private {
21 
22 //----------------------------------------------------------------------
23 /// @class ConstString ConstString.h "lldb/Core/ConstString.h"
24 /// @brief A uniqued constant string class.
25 ///
26 /// Provides an efficient way to store strings as uniqued strings. After
27 /// the strings are uniqued, finding strings that are equal to one
28 /// another is very fast as just the pointers need to be compared. It
29 /// also allows for many common strings from many different sources to
30 /// be shared to keep the memory footprint low.
31 ///
32 /// No reference counting is done on strings that are added to the
33 /// string pool, once strings are added they are in the string pool for
34 /// the life of the program.
35 //----------------------------------------------------------------------
36 class ConstString
37 {
38 public:
39     //------------------------------------------------------------------
40     /// Default constructor
41     ///
42     /// Initializes the string to an empty string.
43     //------------------------------------------------------------------
ConstString()44     ConstString ():
45         m_string (NULL)
46     {
47     }
48 
49 
50     //------------------------------------------------------------------
51     /// Copy constructor
52     ///
53     /// Copies the string value in \a rhs into this object.
54     ///
55     /// @param[in] rhs
56     ///     Another string object to copy.
57     //------------------------------------------------------------------
ConstString(const ConstString & rhs)58     ConstString (const ConstString& rhs) :
59         m_string (rhs.m_string)
60     {
61     }
62 
63     explicit ConstString (const llvm::StringRef &s);
64 
65     //------------------------------------------------------------------
66     /// Construct with C String value
67     ///
68     /// Constructs this object with a C string by looking to see if the
69     /// C string already exists in the global string pool. If it doesn't
70     /// exist, it is added to the string pool.
71     ///
72     /// @param[in] cstr
73     ///     A NULL terminated C string to add to the string pool.
74     //------------------------------------------------------------------
75     explicit ConstString (const char *cstr);
76 
77     //------------------------------------------------------------------
78     /// Construct with C String value with max length
79     ///
80     /// Constructs this object with a C string with a length. If
81     /// \a max_cstr_len is greater than the actual length of the string,
82     /// the string length will be truncated. This allows substrings to
83     /// be created without the need to NULL terminate the string as it
84     /// is passed into this function.
85     ///
86     /// @param[in] cstr
87     ///     A pointer to the first character in the C string. The C
88     ///     string can be NULL terminated in a buffer that contains
89     ///     more characters than the length of the stirng, or the
90     ///     string can be part of another string and a new substring
91     ///     can be created.
92     ///
93     /// @param[in] max_cstr_len
94     ///     The max length of \a cstr. If the string length of \a cstr
95     ///     is less than \a max_cstr_len, then the string will be
96     ///     truncated. If the string length of \a cstr is greater than
97     ///     \a max_cstr_len, then only max_cstr_len bytes will be used
98     ///     from \a cstr.
99     //------------------------------------------------------------------
100     explicit ConstString (const char *cstr, size_t max_cstr_len);
101 
102     //------------------------------------------------------------------
103     /// Destructor
104     ///
105     /// Since constant string values are currently not reference counted,
106     /// there isn't much to do here.
107     //------------------------------------------------------------------
~ConstString()108     ~ConstString ()
109     {
110     }
111 
112 
113     //----------------------------------------------------------------------
114     /// C string equality binary predicate function object for ConstString
115     /// objects.
116     //----------------------------------------------------------------------
117     struct StringIsEqual
118     {
119         //--------------------------------------------------------------
120         /// C equality test.
121         ///
122         /// Two C strings are equal when they are contained in ConstString
123         /// objects when their pointer values are equal to each other.
124         ///
125         /// @return
126         ///     Returns \b true if the C string in \a lhs is equal to
127         ///     the C string value in \a rhs, \b false otherwise.
128         //--------------------------------------------------------------
operatorStringIsEqual129         bool operator()(const char* lhs, const char* rhs) const
130         {
131             return lhs == rhs;
132         }
133     };
134 
135     //------------------------------------------------------------------
136     /// Convert to bool operator.
137     ///
138     /// This allows code to check a ConstString object to see if it
139     /// contains a valid string using code such as:
140     ///
141     /// @code
142     /// ConstString str(...);
143     /// if (str)
144     /// { ...
145     /// @endcode
146     ///
147     /// @return
148     ///     /b True this object contains a valid non-empty C string, \b
149     ///     false otherwise.
150     //------------------------------------------------------------------
151     operator bool() const
152     {
153         return m_string && m_string[0];
154     }
155 
156     //------------------------------------------------------------------
157     /// Assignment operator
158     ///
159     /// Assigns the string in this object with the value from \a rhs.
160     ///
161     /// @param[in] rhs
162     ///     Another string object to copy into this object.
163     ///
164     /// @return
165     ///     A const reference to this object.
166     //------------------------------------------------------------------
167     const ConstString&
168     operator = (const ConstString& rhs)
169     {
170         m_string = rhs.m_string;
171         return *this;
172     }
173 
174     //------------------------------------------------------------------
175     /// Equal to operator
176     ///
177     /// Returns true if this string is equal to the string in \a rhs.
178     /// This operation is very fast as it results in a pointer
179     /// comparison since all strings are in a uniqued in a global string
180     /// pool.
181     ///
182     /// @param[in] rhs
183     ///     Another string object to compare this object to.
184     ///
185     /// @return
186     ///     @li \b true if this object is equal to \a rhs.
187     ///     @li \b false if this object is not equal to \a rhs.
188     //------------------------------------------------------------------
189     bool
190     operator == (const ConstString& rhs) const
191     {
192         // We can do a pointer compare to compare these strings since they
193         // must come from the same pool in order to be equal.
194         return m_string == rhs.m_string;
195     }
196 
197     //------------------------------------------------------------------
198     /// Not equal to operator
199     ///
200     /// Returns true if this string is not equal to the string in \a rhs.
201     /// This operation is very fast as it results in a pointer
202     /// comparison since all strings are in a uniqued in a global string
203     /// pool.
204     ///
205     /// @param[in] rhs
206     ///     Another string object to compare this object to.
207     ///
208     /// @return
209     ///     @li \b true if this object is not equal to \a rhs.
210     ///     @li \b false if this object is equal to \a rhs.
211     //------------------------------------------------------------------
212     bool
213     operator != (const ConstString& rhs) const
214     {
215         return m_string != rhs.m_string;
216     }
217 
218     bool
219     operator < (const ConstString& rhs) const;
220 
221     //------------------------------------------------------------------
222     /// Get the string value as a C string.
223     ///
224     /// Get the value of the contained string as a NULL terminated C
225     /// string value.
226     ///
227     /// If \a value_if_empty is NULL, then NULL will be returned.
228     ///
229     /// @return
230     ///     Returns \a value_if_empty if the string is empty, otherwise
231     ///     the C string value contained in this object.
232     //------------------------------------------------------------------
233     const char *
234     AsCString(const char *value_if_empty = NULL) const
235     {
236         if (m_string == NULL)
237             return value_if_empty;
238         return m_string;
239     }
240 
241     //------------------------------------------------------------------
242     /// Get the string value as a llvm::StringRef
243     ///
244     /// @return
245     ///     Returns a new llvm::StringRef object filled in with the
246     ///     needed data.
247     //------------------------------------------------------------------
248     llvm::StringRef
GetStringRef()249     GetStringRef () const
250     {
251         return llvm::StringRef (m_string, GetLength());
252     }
253 
254     //------------------------------------------------------------------
255     /// Get the string value as a C string.
256     ///
257     /// Get the value of the contained string as a NULL terminated C
258     /// string value. Similar to the ConstString::AsCString() function,
259     /// yet this function will always return NULL if the string is not
260     /// valid. So this function is a direct accessor to the string
261     /// pointer value.
262     ///
263     /// @return
264     ///     Returns NULL the string is invalid, otherwise the C string
265     ///     value contained in this object.
266     //------------------------------------------------------------------
267     const char *
GetCString()268     GetCString () const
269     {
270         return m_string;
271     }
272 
273 
274     //------------------------------------------------------------------
275     /// Get the length in bytes of string value.
276     ///
277     /// The string pool stores the length of the string, so we can avoid
278     /// calling strlen() on the pointer value with this function.
279     ///
280     /// @return
281     ///     Returns the number of bytes that this string occupies in
282     ///     memory, not including the NULL termination byte.
283     //------------------------------------------------------------------
284     size_t
285     GetLength () const;
286 
287     //------------------------------------------------------------------
288     /// Clear this object's state.
289     ///
290     /// Clear any contained string and reset the value to the an empty
291     /// string value.
292     //------------------------------------------------------------------
293     void
Clear()294     Clear ()
295     {
296         m_string = NULL;
297     }
298 
299     //------------------------------------------------------------------
300     /// Compare two string objects.
301     ///
302     /// Compares the C string values contained in \a lhs and \a rhs and
303     /// returns an integer result.
304     ///
305     /// NOTE: only call this function when you want a true string
306     /// comparision. If you want string equality use the, use the ==
307     /// operator as it is much more efficient. Also if you want string
308     /// inequality, use the != operator for the same reasons.
309     ///
310     /// @param[in] lhs
311     ///     The Left Hand Side const ConstString object reference.
312     ///
313     /// @param[in] rhs
314     ///     The Right Hand Side const ConstString object reference.
315     ///
316     /// @return
317     ///     @li -1 if lhs < rhs
318     ///     @li 0 if lhs == rhs
319     ///     @li 1 if lhs > rhs
320     //------------------------------------------------------------------
321     static int
322     Compare (const ConstString& lhs, const ConstString& rhs);
323 
324     //------------------------------------------------------------------
325     /// Dump the object description to a stream.
326     ///
327     /// Dump the string value to the stream \a s. If the contained string
328     /// is empty, print \a value_if_empty to the stream instead. If
329     /// \a value_if_empty is NULL, then nothing will be dumped to the
330     /// stream.
331     ///
332     /// @param[in] s
333     ///     The stream that will be used to dump the object description.
334     ///
335     /// @param[in] value_if_empty
336     ///     The value to dump if the string is empty. If NULL, nothing
337     ///     will be output to the stream.
338     //------------------------------------------------------------------
339     void
340     Dump (Stream *s, const char *value_if_empty = NULL) const;
341 
342     //------------------------------------------------------------------
343     /// Dump the object debug description to a stream.
344     ///
345     /// @param[in] s
346     ///     The stream that will be used to dump the object description.
347     //------------------------------------------------------------------
348     void
349     DumpDebug (Stream *s) const;
350 
351     //------------------------------------------------------------------
352     /// Test for empty string.
353     ///
354     /// @return
355     ///     @li \b true if the contained string is empty.
356     ///     @li \b false if the contained string is not empty.
357     //------------------------------------------------------------------
358     bool
IsEmpty()359     IsEmpty () const
360     {
361         return m_string == NULL || m_string[0] == '\0';
362     }
363 
364     //------------------------------------------------------------------
365     /// Set the C string value.
366     ///
367     /// Set the string value in the object by uniquing the \a cstr
368     /// string value in our global string pool.
369     ///
370     /// If the C string already exists in the global string pool, it
371     /// finds the current entry and returns the existing value. If it
372     /// doesn't exist, it is added to the string pool.
373     ///
374     /// @param[in] cstr
375     ///     A NULL terminated C string to add to the string pool.
376     //------------------------------------------------------------------
377     void
378     SetCString (const char *cstr);
379 
380     void
381     SetString (const llvm::StringRef &s);
382 
383     //------------------------------------------------------------------
384     /// Set the C string value and its mangled counterpart.
385     ///
386     /// Object files and debug sybmols often use mangled string to
387     /// represent the linkage name for a symbol, function or global.
388     /// The string pool can efficiently store these values and their
389     /// counterparts so when we run into another instance of a mangled
390     /// name, we can avoid calling the name demangler over and over on
391     /// the same strings and then trying to unique them.
392     ///
393     /// @param[in] demangled
394     ///     The demangled C string to correlate with the \a mangled
395     ///     name.
396     ///
397     /// @param[in] mangled
398     ///     The already uniqued mangled ConstString to correlate the
399     ///     soon to be uniqued version of \a demangled.
400     //------------------------------------------------------------------
401     void
402     SetCStringWithMangledCounterpart (const char *demangled,
403                                       const ConstString &mangled);
404 
405     //------------------------------------------------------------------
406     /// Retrieve the mangled or demangled counterpart for a mangled
407     /// or demangled ConstString.
408     ///
409     /// Object files and debug sybmols often use mangled string to
410     /// represent the linkage name for a symbol, function or global.
411     /// The string pool can efficiently store these values and their
412     /// counterparts so when we run into another instance of a mangled
413     /// name, we can avoid calling the name demangler over and over on
414     /// the same strings and then trying to unique them.
415     ///
416     /// @param[in] counterpart
417     ///     A reference to a ConstString object that might get filled in
418     ///     with the demangled/mangled counterpart.
419     ///
420     /// @return
421     ///     /b True if \a counterpart was filled in with the counterpart
422     ///     /b false otherwise.
423     //------------------------------------------------------------------
424     bool
425     GetMangledCounterpart (ConstString &counterpart) const;
426 
427     //------------------------------------------------------------------
428     /// Set the C string value with length.
429     ///
430     /// Set the string value in the object by uniquing \a cstr_len bytes
431     /// starting at the \a cstr string value in our global string pool.
432     /// If trim is true, then \a cstr_len indicates a maximum length of
433     /// the CString and if the actual length of the string is less, then
434     /// it will be trimmed.
435     ///
436     /// If the C string already exists in the global string pool, it
437     /// finds the current entry and returns the existing value. If it
438     /// doesn't exist, it is added to the string pool.
439     ///
440     /// @param[in] cstr
441     ///     A NULL terminated C string to add to the string pool.
442     ///
443     /// @param[in] cstr_len
444     ///     The maximum length of the C string.
445     //------------------------------------------------------------------
446     void
447     SetCStringWithLength (const char *cstr, size_t cstr_len);
448 
449     //------------------------------------------------------------------
450     /// Set the C string value with the minimum length between
451     /// \a fixed_cstr_len and the actual length of the C string. This
452     /// can be used for data structures that have a fixed length to
453     /// store a C string where the string might not be NULL terminated
454     /// if the string takes the entire buffer.
455     //------------------------------------------------------------------
456     void
457     SetTrimmedCStringWithLength (const char *cstr, size_t fixed_cstr_len);
458 
459     //------------------------------------------------------------------
460     /// Get the memory cost of this object.
461     ///
462     /// Return the size in bytes that this object takes in memory. This
463     /// returns the size in bytes of this object, which does not include
464     /// any the shared string values it may refer to.
465     ///
466     /// @return
467     ///     The number of bytes that this object occupies in memory.
468     ///
469     /// @see ConstString::StaticMemorySize ()
470     //------------------------------------------------------------------
471     size_t
MemorySize()472     MemorySize () const
473     {
474         return sizeof(ConstString);
475     }
476 
477 
478     //------------------------------------------------------------------
479     /// Get the size in bytes of the current global string pool.
480     ///
481     /// Reports the the size in bytes of all shared C string values,
482     /// containers and any other values as a byte size for the
483     /// entire string pool.
484     ///
485     /// @return
486     ///     The number of bytes that the global string pool occupies
487     ///     in memory.
488     //------------------------------------------------------------------
489     static size_t
490     StaticMemorySize ();
491 
492 protected:
493     //------------------------------------------------------------------
494     // Member variables
495     //------------------------------------------------------------------
496     const char *m_string;
497 };
498 
499 //------------------------------------------------------------------
500 /// Stream the string value \a str to the stream \a s
501 //------------------------------------------------------------------
502 Stream& operator << (Stream& s, const ConstString& str);
503 
504 } // namespace lldb_private
505 
506 #endif  // #if defined(__cplusplus)
507 #endif  // liblldb_ConstString_h_
508