|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
|
2 // Use of this source code is governed by a BSD-style license that can be |
|
3 // found in the LICENSE file. |
|
4 |
|
5 #include "build/build_config.h" |
|
6 |
|
7 #if defined(COMPILER_MSVC) |
|
8 // MSDN says to #include <intrin.h>, but that breaks the VS2005 build. |
|
9 extern "C" { |
|
10 void* _ReturnAddress(); |
|
11 } |
|
12 #endif |
|
13 |
|
14 #include "base/location.h" |
|
15 #include "base/strings/string_number_conversions.h" |
|
16 #include "base/strings/stringprintf.h" |
|
17 |
|
18 namespace tracked_objects { |
|
19 |
|
20 Location::Location(const char* function_name, |
|
21 const char* file_name, |
|
22 int line_number, |
|
23 const void* program_counter) |
|
24 : function_name_(function_name), |
|
25 file_name_(file_name), |
|
26 line_number_(line_number), |
|
27 program_counter_(program_counter) { |
|
28 } |
|
29 |
|
30 Location::Location() |
|
31 : function_name_("Unknown"), |
|
32 file_name_("Unknown"), |
|
33 line_number_(-1), |
|
34 program_counter_(NULL) { |
|
35 } |
|
36 |
|
37 std::string Location::ToString() const { |
|
38 return std::string(function_name_) + "@" + file_name_ + ":" + |
|
39 base::IntToString(line_number_); |
|
40 } |
|
41 |
|
42 void Location::Write(bool display_filename, bool display_function_name, |
|
43 std::string* output) const { |
|
44 base::StringAppendF(output, "%s[%d] ", |
|
45 display_filename ? file_name_ : "line", |
|
46 line_number_); |
|
47 |
|
48 if (display_function_name) { |
|
49 WriteFunctionName(output); |
|
50 output->push_back(' '); |
|
51 } |
|
52 } |
|
53 |
|
54 void Location::WriteFunctionName(std::string* output) const { |
|
55 // Translate "<" to "<" for HTML safety. |
|
56 // TODO(jar): Support ASCII or html for logging in ASCII. |
|
57 for (const char *p = function_name_; *p; p++) { |
|
58 switch (*p) { |
|
59 case '<': |
|
60 output->append("<"); |
|
61 break; |
|
62 |
|
63 case '>': |
|
64 output->append(">"); |
|
65 break; |
|
66 |
|
67 default: |
|
68 output->push_back(*p); |
|
69 break; |
|
70 } |
|
71 } |
|
72 } |
|
73 |
|
74 //------------------------------------------------------------------------------ |
|
75 LocationSnapshot::LocationSnapshot() : line_number(-1) { |
|
76 } |
|
77 |
|
78 LocationSnapshot::LocationSnapshot( |
|
79 const tracked_objects::Location& location) |
|
80 : file_name(location.file_name()), |
|
81 function_name(location.function_name()), |
|
82 line_number(location.line_number()) { |
|
83 } |
|
84 |
|
85 LocationSnapshot::~LocationSnapshot() { |
|
86 } |
|
87 |
|
88 //------------------------------------------------------------------------------ |
|
89 #if defined(COMPILER_MSVC) |
|
90 __declspec(noinline) |
|
91 #endif |
|
92 BASE_EXPORT const void* GetProgramCounter() { |
|
93 #if defined(COMPILER_MSVC) |
|
94 return _ReturnAddress(); |
|
95 #elif defined(COMPILER_GCC) |
|
96 return __builtin_extract_return_addr(__builtin_return_address(0)); |
|
97 #endif // COMPILER_GCC |
|
98 |
|
99 return NULL; |
|
100 } |
|
101 |
|
102 } // namespace tracked_objects |