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