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