Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- llvm/Debuginfod/Debuginfod.h - Debuginfod client --------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
///
9
/// \file
10
/// This file contains several declarations for the debuginfod client and
11
/// server. The client functions are getDefaultDebuginfodUrls,
12
/// getCachedOrDownloadArtifact, and several convenience functions for specific
13
/// artifact types: getCachedOrDownloadSource, getCachedOrDownloadExecutable,
14
/// and getCachedOrDownloadDebuginfo. For the server, this file declares the
15
/// DebuginfodLogEntry and DebuginfodServer structs, as well as the
16
/// DebuginfodLog, DebuginfodCollection classes.
17
///
18
//===----------------------------------------------------------------------===//
19
 
20
#ifndef LLVM_DEBUGINFOD_DEBUGINFOD_H
21
#define LLVM_DEBUGINFOD_DEBUGINFOD_H
22
 
23
#include "HTTPServer.h"
24
 
25
#include "llvm/ADT/StringMap.h"
26
#include "llvm/ADT/StringRef.h"
27
#include "llvm/Object/BuildID.h"
28
#include "llvm/Support/Error.h"
29
#include "llvm/Support/MemoryBuffer.h"
30
#include "llvm/Support/Mutex.h"
31
#include "llvm/Support/RWMutex.h"
32
#include "llvm/Support/Timer.h"
33
 
34
#include <chrono>
35
#include <condition_variable>
36
#include <optional>
37
#include <queue>
38
 
39
namespace llvm {
40
 
41
/// Returns false if a debuginfod lookup can be determined to have no chance of
42
/// succeeding.
43
bool canUseDebuginfod();
44
 
45
/// Finds default array of Debuginfod server URLs by checking DEBUGINFOD_URLS
46
/// environment variable.
47
SmallVector<StringRef> getDefaultDebuginfodUrls();
48
 
49
/// Finds a default local file caching directory for the debuginfod client,
50
/// first checking DEBUGINFOD_CACHE_PATH.
51
Expected<std::string> getDefaultDebuginfodCacheDirectory();
52
 
53
/// Finds a default timeout for debuginfod HTTP requests. Checks
54
/// DEBUGINFOD_TIMEOUT environment variable, default is 90 seconds (90000 ms).
55
std::chrono::milliseconds getDefaultDebuginfodTimeout();
56
 
57
/// Fetches a specified source file by searching the default local cache
58
/// directory and server URLs.
59
Expected<std::string> getCachedOrDownloadSource(object::BuildIDRef ID,
60
                                                StringRef SourceFilePath);
61
 
62
/// Fetches an executable by searching the default local cache directory and
63
/// server URLs.
64
Expected<std::string> getCachedOrDownloadExecutable(object::BuildIDRef ID);
65
 
66
/// Fetches a debug binary by searching the default local cache directory and
67
/// server URLs.
68
Expected<std::string> getCachedOrDownloadDebuginfo(object::BuildIDRef ID);
69
 
70
/// Fetches any debuginfod artifact using the default local cache directory and
71
/// server URLs.
72
Expected<std::string> getCachedOrDownloadArtifact(StringRef UniqueKey,
73
                                                  StringRef UrlPath);
74
 
75
/// Fetches any debuginfod artifact using the specified local cache directory,
76
/// server URLs, and request timeout (in milliseconds). If the artifact is
77
/// found, uses the UniqueKey for the local cache file.
78
Expected<std::string> getCachedOrDownloadArtifact(
79
    StringRef UniqueKey, StringRef UrlPath, StringRef CacheDirectoryPath,
80
    ArrayRef<StringRef> DebuginfodUrls, std::chrono::milliseconds Timeout);
81
 
82
class ThreadPool;
83
 
84
struct DebuginfodLogEntry {
85
  std::string Message;
86
  DebuginfodLogEntry() = default;
87
  DebuginfodLogEntry(const Twine &Message);
88
};
89
 
90
class DebuginfodLog {
91
  std::mutex QueueMutex;
92
  std::condition_variable QueueCondition;
93
  std::queue<DebuginfodLogEntry> LogEntryQueue;
94
 
95
public:
96
  // Adds a log entry to end of the queue.
97
  void push(DebuginfodLogEntry Entry);
98
  // Adds a log entry to end of the queue.
99
  void push(const Twine &Message);
100
  // Blocks until there are log entries in the queue, then pops and returns the
101
  // first one.
102
  DebuginfodLogEntry pop();
103
};
104
 
105
/// Tracks a collection of debuginfod artifacts on the local filesystem.
106
class DebuginfodCollection {
107
  SmallVector<std::string, 1> Paths;
108
  sys::RWMutex BinariesMutex;
109
  StringMap<std::string> Binaries;
110
  sys::RWMutex DebugBinariesMutex;
111
  StringMap<std::string> DebugBinaries;
112
  Error findBinaries(StringRef Path);
113
  Expected<std::optional<std::string>> getDebugBinaryPath(object::BuildIDRef);
114
  Expected<std::optional<std::string>> getBinaryPath(object::BuildIDRef);
115
  // If the collection has not been updated since MinInterval, call update() and
116
  // return true. Otherwise return false. If update returns an error, return the
117
  // error.
118
  Expected<bool> updateIfStale();
119
  DebuginfodLog &Log;
120
  ThreadPool &Pool;
121
  Timer UpdateTimer;
122
  sys::Mutex UpdateMutex;
123
 
124
  // Minimum update interval, in seconds, for on-demand updates triggered when a
125
  // build-id is not found.
126
  double MinInterval;
127
 
128
public:
129
  DebuginfodCollection(ArrayRef<StringRef> Paths, DebuginfodLog &Log,
130
                       ThreadPool &Pool, double MinInterval);
131
  Error update();
132
  Error updateForever(std::chrono::milliseconds Interval);
133
  Expected<std::string> findDebugBinaryPath(object::BuildIDRef);
134
  Expected<std::string> findBinaryPath(object::BuildIDRef);
135
};
136
 
137
struct DebuginfodServer {
138
  HTTPServer Server;
139
  DebuginfodLog &Log;
140
  DebuginfodCollection &Collection;
141
  DebuginfodServer(DebuginfodLog &Log, DebuginfodCollection &Collection);
142
};
143
 
144
} // end namespace llvm
145
 
146
#endif