source_line_resolver_interface.h revision cb91a2f879250f2ef5f74321b5d08807247d41a7
1cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// Copyright (C) 2006 Google Inc. 2cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// 3cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// Licensed under the Apache License, Version 2.0 (the "License"); 4cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// you may not use this file except in compliance with the License. 5cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// You may obtain a copy of the License at 6cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// 7cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// http://www.apache.org/licenses/LICENSE-2.0 8cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// 9cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// Unless required by applicable law or agreed to in writing, software 10cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// distributed under the License is distributed on an "AS IS" BASIS, 11cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// See the License for the specific language governing permissions and 13cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// limitations under the License. 14cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 15cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// SourceLineResolver returns function/file/line info for a memory address. 16cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// It uses address map files produced by a compatible writer, e.g. 17cb91a2f879250f2ef5f74321b5d08807247d41a7bryner// PDBSourceLineWriter. 18cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 19cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#ifndef _SOURCE_LINE_RESOLVER_H__ 20cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#define _SOURCE_LINE_RESOLVER_H__ 21cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 22cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#include "config.h" 23cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#include <string> 24cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#include <ext/hash_map> 25cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 26cb91a2f879250f2ef5f74321b5d08807247d41a7bryner_START_GOOGLE_NAMESPACE_ 27cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 28cb91a2f879250f2ef5f74321b5d08807247d41a7brynerusing STL_NAMESPACE::string; 29cb91a2f879250f2ef5f74321b5d08807247d41a7brynerusing __gnu_cxx::hash_map; 30cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 31cb91a2f879250f2ef5f74321b5d08807247d41a7brynerclass SourceLineResolver { 32cb91a2f879250f2ef5f74321b5d08807247d41a7bryner public: 33cb91a2f879250f2ef5f74321b5d08807247d41a7bryner typedef unsigned long long MemAddr; 34cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 35cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // A struct that gives source file information for a memory address. 36cb91a2f879250f2ef5f74321b5d08807247d41a7bryner struct SourceLineInfo { 37cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // Resets all fields to their default empty values 38cb91a2f879250f2ef5f74321b5d08807247d41a7bryner void Reset(); 39cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 40cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // The function name, for example Foo::Foo() 41cb91a2f879250f2ef5f74321b5d08807247d41a7bryner string function_name; 42cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 43cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // The source file, for example C:\foo\bar.cc 44cb91a2f879250f2ef5f74321b5d08807247d41a7bryner string source_file; 45cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 46cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // The line number within the source file (1-based) 47cb91a2f879250f2ef5f74321b5d08807247d41a7bryner int source_line; 48cb91a2f879250f2ef5f74321b5d08807247d41a7bryner }; 49cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 50cb91a2f879250f2ef5f74321b5d08807247d41a7bryner SourceLineResolver(); 51cb91a2f879250f2ef5f74321b5d08807247d41a7bryner ~SourceLineResolver(); 52cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 53cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // Adds a module to this resolver, returning true on success. 54cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // 55cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // module_name may be an arbitrary string. Typically, it will be the 56cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // filename of the module, optionally with version identifiers. 57cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // 58cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // map_file should contain line/address mappings for this module. 59cb91a2f879250f2ef5f74321b5d08807247d41a7bryner bool LoadModule(const string &module_name, const string &map_file); 60cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 61cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // Determines the source line for the given address, and fills info 62cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // with the result. module_name must match a module name that was 63cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // passed to LoadModule(). The address should be module-relative. 64cb91a2f879250f2ef5f74321b5d08807247d41a7bryner void LookupAddress(MemAddr address, const string &module_name, 65cb91a2f879250f2ef5f74321b5d08807247d41a7bryner SourceLineInfo *info) const; 66cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 67cb91a2f879250f2ef5f74321b5d08807247d41a7bryner private: 68cb91a2f879250f2ef5f74321b5d08807247d41a7bryner template<class T> class MemAddrMap; 69cb91a2f879250f2ef5f74321b5d08807247d41a7bryner struct Line; 70cb91a2f879250f2ef5f74321b5d08807247d41a7bryner struct Function; 71cb91a2f879250f2ef5f74321b5d08807247d41a7bryner struct File; 72cb91a2f879250f2ef5f74321b5d08807247d41a7bryner struct HashString { 73cb91a2f879250f2ef5f74321b5d08807247d41a7bryner size_t operator()(const string &s) const; 74cb91a2f879250f2ef5f74321b5d08807247d41a7bryner }; 75cb91a2f879250f2ef5f74321b5d08807247d41a7bryner class Module; 76cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 77cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // All of the modules we've loaded 78cb91a2f879250f2ef5f74321b5d08807247d41a7bryner typedef hash_map<string, Module*, HashString> ModuleMap; 79cb91a2f879250f2ef5f74321b5d08807247d41a7bryner ModuleMap *modules_; 80cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 81cb91a2f879250f2ef5f74321b5d08807247d41a7bryner // Disallow unwanted copy ctor and assignment operator 82cb91a2f879250f2ef5f74321b5d08807247d41a7bryner SourceLineResolver(const SourceLineResolver&); 83cb91a2f879250f2ef5f74321b5d08807247d41a7bryner void operator=(const SourceLineResolver&); 84cb91a2f879250f2ef5f74321b5d08807247d41a7bryner}; 85cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 86cb91a2f879250f2ef5f74321b5d08807247d41a7bryner_END_GOOGLE_NAMESPACE_ 87cb91a2f879250f2ef5f74321b5d08807247d41a7bryner 88cb91a2f879250f2ef5f74321b5d08807247d41a7bryner#endif // _SOLURCE_LINE_RESOLVER_H__ 89