blob: 42bfca36a20bc0fde9eb2b2d9b32de33cdb4bf09 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- InstrumentationMap.h - XRay Instrumentation Map ----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Defines the interface for extracting the instrumentation map from an
11// XRay-instrumented binary.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_XRAY_INSTRUMENTATION_MAP_H
16#define LLVM_XRAY_INSTRUMENTATION_MAP_H
17
18#include "llvm/ADT/Optional.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Support/Error.h"
21#include "llvm/Support/YAMLTraits.h"
22#include <cstdint>
23#include <unordered_map>
24#include <vector>
25
26namespace llvm {
27
28namespace xray {
29
30// Forward declare to make a friend.
31class InstrumentationMap;
32
33/// Loads the instrumentation map from |Filename|. This auto-deduces the type of
34/// the instrumentation map.
35Expected<InstrumentationMap> loadInstrumentationMap(StringRef Filename);
36
37/// Represents an XRay instrumentation sled entry from an object file.
38struct SledEntry {
39 /// Each entry here represents the kinds of supported instrumentation map
40 /// entries.
41 enum class FunctionKinds { ENTRY, EXIT, TAIL, LOG_ARGS_ENTER, CUSTOM_EVENT };
42
43 /// The address of the sled.
44 uint64_t Address;
45
46 /// The address of the function.
47 uint64_t Function;
48
49 /// The kind of sled.
50 FunctionKinds Kind;
51
52 /// Whether the sled was annotated to always be instrumented.
53 bool AlwaysInstrument;
54};
55
56struct YAMLXRaySledEntry {
57 int32_t FuncId;
58 yaml::Hex64 Address;
59 yaml::Hex64 Function;
60 SledEntry::FunctionKinds Kind;
61 bool AlwaysInstrument;
62 std::string FunctionName;
63};
64
65/// The InstrumentationMap represents the computed function id's and indicated
66/// function addresses from an object file (or a YAML file). This provides an
67/// interface to just the mapping between the function id, and the function
68/// address.
69///
70/// We also provide raw access to the actual instrumentation map entries we find
71/// associated with a particular object file.
72///
73class InstrumentationMap {
74public:
75 using FunctionAddressMap = std::unordered_map<int32_t, uint64_t>;
76 using FunctionAddressReverseMap = std::unordered_map<uint64_t, int32_t>;
77 using SledContainer = std::vector<SledEntry>;
78
79private:
80 SledContainer Sleds;
81 FunctionAddressMap FunctionAddresses;
82 FunctionAddressReverseMap FunctionIds;
83
84 friend Expected<InstrumentationMap> loadInstrumentationMap(StringRef);
85
86public:
87 /// Provides a raw accessor to the unordered map of function addresses.
88 const FunctionAddressMap &getFunctionAddresses() { return FunctionAddresses; }
89
90 /// Returns an XRay computed function id, provided a function address.
91 Optional<int32_t> getFunctionId(uint64_t Addr) const;
92
93 /// Returns the function address for a function id.
94 Optional<uint64_t> getFunctionAddr(int32_t FuncId) const;
95
96 /// Provide read-only access to the entries of the instrumentation map.
97 const SledContainer &sleds() const { return Sleds; };
98};
99
100} // end namespace xray
101
102namespace yaml {
103
104template <> struct ScalarEnumerationTraits<xray::SledEntry::FunctionKinds> {
105 static void enumeration(IO &IO, xray::SledEntry::FunctionKinds &Kind) {
106 IO.enumCase(Kind, "function-enter", xray::SledEntry::FunctionKinds::ENTRY);
107 IO.enumCase(Kind, "function-exit", xray::SledEntry::FunctionKinds::EXIT);
108 IO.enumCase(Kind, "tail-exit", xray::SledEntry::FunctionKinds::TAIL);
109 IO.enumCase(Kind, "log-args-enter",
110 xray::SledEntry::FunctionKinds::LOG_ARGS_ENTER);
111 IO.enumCase(Kind, "custom-event",
112 xray::SledEntry::FunctionKinds::CUSTOM_EVENT);
113 }
114};
115
116template <> struct MappingTraits<xray::YAMLXRaySledEntry> {
117 static void mapping(IO &IO, xray::YAMLXRaySledEntry &Entry) {
118 IO.mapRequired("id", Entry.FuncId);
119 IO.mapRequired("address", Entry.Address);
120 IO.mapRequired("function", Entry.Function);
121 IO.mapRequired("kind", Entry.Kind);
122 IO.mapRequired("always-instrument", Entry.AlwaysInstrument);
123 IO.mapOptional("function-name", Entry.FunctionName);
124 }
125
126 static constexpr bool flow = true;
127};
128
129} // end namespace yaml
130
131} // end namespace llvm
132
133LLVM_YAML_IS_SEQUENCE_VECTOR(xray::YAMLXRaySledEntry)
134
135#endif // LLVM_XRAY_INSTRUMENTATION_MAP_H