124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- PathMappingList.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_PathMappingList_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_PathMappingList_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass PathMappingList
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef void (*ChangedCallback) (const PathMappingList &path_list,
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     void *baton);
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34964deba8853eb794e59263322b59b09b43669618Greg Clayton    PathMappingList ();
35964deba8853eb794e59263322b59b09b43669618Greg Clayton
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PathMappingList (ChangedCallback callback,
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     void *callback_baton);
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    PathMappingList (const PathMappingList &rhs);
40ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~PathMappingList ();
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    const PathMappingList &
44ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    operator =(const PathMappingList &rhs);
45ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Append (const ConstString &path, const ConstString &replacement, bool notify);
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
50964deba8853eb794e59263322b59b09b43669618Greg Clayton    Append (const PathMappingList &rhs, bool notify);
51964deba8853eb794e59263322b59b09b43669618Greg Clayton
52964deba8853eb794e59263322b59b09b43669618Greg Clayton    void
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear (bool notify);
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55931449ee91b1a3acf0cd8ab2e1dd1285d7c42ad4Johnny Chen    // By default, dump all pairs.
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
57931449ee91b1a3acf0cd8ab2e1dd1285d7c42ad4Johnny Chen    Dump (Stream *s, int pair_index=-1);
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
595c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton    bool
605c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton    IsEmpty() const
615c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton    {
625c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton        return m_pairs.empty();
635c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton    }
645c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
66964deba8853eb794e59263322b59b09b43669618Greg Clayton    GetSize () const
67964deba8853eb794e59263322b59b09b43669618Greg Clayton    {
68964deba8853eb794e59263322b59b09b43669618Greg Clayton        return m_pairs.size();
69964deba8853eb794e59263322b59b09b43669618Greg Clayton    }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    bool
72ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    GetPathsAtIndex (uint32_t idx, ConstString &path, ConstString &new_path) const;
73ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Insert (const ConstString &path,
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const ConstString &replacement,
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t insert_idx,
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool notify);
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Remove (off_t index, bool notify);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
84ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    Remove (const ConstString &path, bool notify);
85ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
86ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    bool
87ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    Replace (const ConstString &path,
8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton             const ConstString &replacement,
8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton             bool notify);
9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    bool
9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    Replace (const ConstString &path,
9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton             const ConstString &replacement,
9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton             uint32_t index,
95ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton             bool notify);
96ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    bool
97964deba8853eb794e59263322b59b09b43669618Greg Clayton    RemapPath (const ConstString &path, ConstString &new_path) const;
98964deba8853eb794e59263322b59b09b43669618Greg Clayton
992418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    //------------------------------------------------------------------
1002418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// Remaps a source file given \a path into \a new_path.
1012418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1022418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// Remaps \a path if any source remappings match. This function
1032418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// does NOT stat the file system so it can be used in tight loops
1042418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// where debug info is being parsed.
1052418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1062418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// @param[in] path
1072418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     The original source file path to try and remap.
1082418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1092418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// @param[out] new_path
1102418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     The newly remapped filespec that is may or may not exist.
1112418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1122418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// @return
1132418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     /b true if \a path was successfully located and \a new_path
1142418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     is filled in with a new source path, \b false otherwise.
1152418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    //------------------------------------------------------------------
1162418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    bool
1172418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    RemapPath (const char *path, std::string &new_path) const;
1182418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton
1192418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton
1202418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    //------------------------------------------------------------------
1212418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// Finds a source file given a file spec using the path remappings.
1222418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1232418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// Tries to resolve \a orig_spec by checking the path remappings.
1242418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// It makes sure the file exists by checking with the file system,
1252418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// so this call can be expensive if the remappings are on a network
1262418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// or are even on the local file system, so use this function
1272418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// sparingly (not in a tight debug info parsing loop).
1282418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1292418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// @param[in] orig_spec
1302418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     The original source file path to try and remap.
1312418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1322418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// @param[out] new_spec
1332418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     The newly remapped filespec that is guaranteed to exist.
1342418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///
1352418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    /// @return
1362418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     /b true if \a orig_spec was successfully located and
1372418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     \a new_spec is filled in with an existing file spec,
1382418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    ///     \b false otherwise.
1392418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    //------------------------------------------------------------------
140964deba8853eb794e59263322b59b09b43669618Greg Clayton    bool
141964deba8853eb794e59263322b59b09b43669618Greg Clayton    FindFile (const FileSpec &orig_spec, FileSpec &new_spec) const;
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    uint32_t
144ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    FindIndexForPath (const ConstString &path) const;
145ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
146a01b0fa183a5bd0110722bf17401882b1672635fGreg Clayton    uint32_t
147a01b0fa183a5bd0110722bf17401882b1672635fGreg Clayton    GetModificationID() const
148a01b0fa183a5bd0110722bf17401882b1672635fGreg Clayton    {
149a01b0fa183a5bd0110722bf17401882b1672635fGreg Clayton        return m_mod_id;
150a01b0fa183a5bd0110722bf17401882b1672635fGreg Clayton    }
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::pair <ConstString, ConstString> pair;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector <pair> collection;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef collection::iterator iterator;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef collection::const_iterator const_iterator;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    iterator
158ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    FindIteratorForPath (const ConstString &path);
159ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
160ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    const_iterator
161ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton    FindIteratorForPath (const ConstString &path) const;
162ff44ab42e9f5d8e4d550e11d1b69413e0bc75b71Greg Clayton
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    collection m_pairs;
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ChangedCallback m_callback;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void * m_callback_baton;
166a01b0fa183a5bd0110722bf17401882b1672635fGreg Clayton    uint32_t m_mod_id; // Incremented anytime anything is added or removed.
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_PathMappingList_h_
172