LLVM 23.0.0git
Instrumentor.h
Go to the documentation of this file.
1//===-- Instrumentor.h - Highly configurable instrumentation pass ---------===//
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// The Instrumentor, a highly configurable instrumentation pass.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_TRANSFORMS_IPO_INSTRUMENTOR_H
14#define LLVM_TRANSFORMS_IPO_INSTRUMENTOR_H
15
16#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/MapVector.h"
20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/Constants.h"
24#include "llvm/IR/DataLayout.h"
25#include "llvm/IR/IRBuilder.h"
26#include "llvm/IR/Instruction.h"
28#include "llvm/IR/LLVMContext.h"
29#include "llvm/IR/Module.h"
30#include "llvm/IR/PassManager.h"
36
37#include <cstdint>
38#include <functional>
39#include <memory>
40#include <string>
41#include <tuple>
42
43namespace llvm {
44namespace instrumentor {
45
48
49/// Callback type for getting/setting a value for a instrumented opportunity.
50///{
51using GetterCallbackTy = std::function<Value *(
53using SetterCallbackTy = std::function<Value *(
55///}
56
57/// Helper to represent an argument to an instrumentation runtime function.
58struct IRTArg {
59 /// Flags describing the possible properties of an argument.
61 NONE = 0,
62 STRING = 1 << 0,
63 REPLACABLE = 1 << 1,
67 VALUE_PACK = 1 << 5,
68 TYPEID = 1 << 6,
70 };
71
72 /// Construct an argument.
79
80 /// Whether the argument is enabled and should be passed to the function call.
81 bool Enabled;
82
83 /// The type of the argument.
85
86 /// A string with the name of the argument.
88
89 /// A string with the description of the argument.
91
92 /// The flags that describe the properties of the argument. Multiple flags may
93 /// be specified.
94 unsigned Flags;
95
96 /// The callback for getting the value of the argument.
98
99 /// The callback for consuming the output value of the argument.
101
102 /// Whether the argument value can be cached between the PRE and POST calls.
104};
105
106/// Helper to represent an instrumentation runtime function that is related to
107/// an instrumentation opportunity.
109 /// Construct an instrumentation function description linked to the \p IO
110 /// instrumentation opportunity and \p RetTy return type.
112 Type *RetTy = nullptr);
113
114 /// Create the type of the instrumentation function.
117 const DataLayout &DL,
118 bool ForceIndirection);
119
120 /// Create a call instruction that calls to the instrumentation function and
121 /// passes the corresponding arguments.
124 const DataLayout &DL,
125 InstrumentationCaches &ICaches);
126
127 /// Create a string representation of the function declaration in C. Two
128 /// strings are returned: the function definition with direct arguments and
129 /// the function with any indirect argument.
130 LLVM_ABI std::pair<std::string, std::string>
131 createCSignature(const InstrumentationConfig &IConf) const;
132
133 /// Create a string representation of the function definition in C. The
134 /// function body implements a stub and only prints the passed arguments. Two
135 /// strings are returned: the function definition with direct arguments and
136 /// the function with any indirect argument.
137 LLVM_ABI std::pair<std::string, std::string> createCBodies() const;
138
139 /// Return whether the \p IRTA argument can be replaced.
140 bool isReplacable(IRTArg &IRTA) const {
142 }
143
144 /// Return whether the function may have any indirect argument.
145 bool isPotentiallyIndirect(IRTArg &IRTA) const {
146 return ((IRTA.Flags & IRTArg::POTENTIALLY_INDIRECT) ||
148 }
149
150 /// Whether the function requires indirection in some argument.
152
153 /// Whether any argument may require indirection.
155
156 /// The number of arguments that can be replaced.
157 unsigned NumReplaceableArgs = 0;
158
159 /// The instrumentation opportunity which it is linked to.
161
162 /// The return type of the instrumentation function.
163 Type *RetTy = nullptr;
164};
165
166/// Helper to represent an instrumentation location, which is composed of an
167/// instrumentation opportunity type and a position.
169 /// The supported location kinds, which are composed of a opportunity type and
170 /// position. The PRE position indicates the instrumentation function call is
171 /// inserted before the instrumented event occurs. The POST position indicates
172 /// the instrumentation call is inserted after the event occurs. Some
173 /// opportunity types may only support one position.
188
189 /// Construct an instrumentation location with the given kind.
190 InstrumentationLocation(KindTy Kind) : Kind(Kind) {}
191
192 /// Return the type and position.
193 KindTy getKind() const { return Kind; }
194
195 /// Return the string representation given a location kind. This is the string
196 /// used in the configuration file.
198 switch (Kind) {
199 case MODULE_PRE:
200 return "module_pre";
201 case MODULE_POST:
202 return "module_post";
203 case GLOBAL_PRE:
204 return "global_pre";
205 case GLOBAL_POST:
206 return "global_post";
207 case FUNCTION_PRE:
208 return "function_pre";
209 case FUNCTION_POST:
210 return "function_post";
211 case BASIC_BLOCK_PRE:
212 return "basic_block_pre";
213 case BASIC_BLOCK_POST:
214 return "basic_block_post";
215 case INSTRUCTION_PRE:
216 return "instruction_pre";
217 case INSTRUCTION_POST:
218 return "instruction_post";
219 case SPECIAL_VALUE:
220 return "special_value";
221 }
222 llvm_unreachable("Invalid kind!");
223 }
224
225 /// Return the location kind described by a string.
227 return StringSwitch<KindTy>(S)
228 .Case("module_pre", MODULE_PRE)
229 .Case("module_post", MODULE_POST)
230 .Case("global_pre", GLOBAL_PRE)
231 .Case("global_post", GLOBAL_POST)
232 .Case("function_pre", FUNCTION_PRE)
233 .Case("function_post", FUNCTION_POST)
234 .Case("basic_block_pre", BASIC_BLOCK_PRE)
235 .Case("basic_block_post", BASIC_BLOCK_POST)
236 .Case("instruction_pre", INSTRUCTION_PRE)
237 .Case("instruction_post", INSTRUCTION_POST)
238 .Case("special_value", SPECIAL_VALUE)
239 .Default(Last);
240 }
241
242 /// Return whether a location kind is positioned before the event occurs.
243 static bool isPRE(KindTy Kind) {
244 switch (Kind) {
245 case MODULE_PRE:
246 case GLOBAL_PRE:
247 case FUNCTION_PRE:
248 case BASIC_BLOCK_PRE:
249 case INSTRUCTION_PRE:
250 return true;
251 case MODULE_POST:
252 case GLOBAL_POST:
253 case FUNCTION_POST:
254 case BASIC_BLOCK_POST:
255 case INSTRUCTION_POST:
256 case SPECIAL_VALUE:
257 return false;
258 }
259 llvm_unreachable("Invalid kind!");
260 }
261
262 /// Return whether the instrumentation location is before the event occurs.
263 bool isPRE() const { return isPRE(Kind); }
264
265private:
266 /// The kind (type and position) of the instrumentation location.
267 const KindTy Kind;
268};
269
270/// An option for the base configuration.
272 /// The possible types of options.
277
278 /// Create a boolean option with \p Name name, \p Description description and
279 /// \p DefaultValue as boolean default value.
280 LLVM_ABI static std::unique_ptr<BaseConfigurationOption>
282 StringRef Description, bool DefaultValue);
283
284 /// Create a string option with \p Name name, \p Description description and
285 /// \p DefaultValue as string default value.
286 LLVM_ABI static std::unique_ptr<BaseConfigurationOption>
288 StringRef Description, StringRef DefaultValue);
289
290 /// Helper union that holds any possible option type.
291 union ValueTy {
292 bool Bool;
294 };
295
296 /// Set and get of the boolean value. Only valid if it is a boolean option.
297 ///{
298 void setBool(bool B) {
299 assert(Kind == BOOLEAN && "Not a boolean!");
300 Value.Bool = B;
301 }
302 bool getBool() const {
303 assert(Kind == BOOLEAN && "Not a boolean!");
304 return Value.Bool;
305 }
306 ///}
307
308 /// Set and get the string value. Only valid if it is a boolean option.
309 ///{
311 assert(Kind == STRING && "Not a string!");
312 Value.String = S;
313 }
315 assert(Kind == STRING && "Not a string!");
316 return Value.String;
317 }
318 ///}
319
320 /// The information of the option.
321 ///{
326 ///}
327
328 /// Construct a base configuration option.
331};
332
333/// The class that contains the configuration for the instrumentor. It holds the
334/// information for each instrumented opportunity, including the base
335/// configuration options. Another class may inherit from this one to modify the
336/// default behavior.
339
340 /// Construct an instrumentation configuration with the base options.
342
343 /// Initialize the config to a clean base state without loosing cached values
344 /// that can be reused across configurations.
346 // Clear previous configurations but not the caches.
348 for (auto &Map : IChoices)
349 Map.clear();
350
352 *this, "runtime_prefix", "The runtime API prefix.", "__instrumentor_");
354 *this, "runtime_stubs_file",
355 "The file into which runtime stubs should be written.", "");
357 *this, "target_regex",
358 "Regular expression to be matched against the module target. "
359 "Only targets that match this regex will be instrumented.",
360 "");
362 *this, "function_regex",
363 "Regular expression to be matched against a function name. "
364 "Only functions that match this regex will be instrumented.",
365 "");
367 *this, "demangle_function_names",
368 "Demangle functions names passed to the runtime.", true);
370 *this, "host_enabled", "Instrument non-GPU targets", true);
372 *this, "gpu_enabled", "Instrument GPU targets", true);
373 populate(IIRB);
374 }
375
376 /// Populate the instrumentation opportunities.
377 virtual void populate(InstrumentorIRBuilderTy &IIRB);
378
379 /// Get the runtime prefix for the instrumentation runtime functions.
380 StringRef getRTName() const { return RuntimePrefix->getString(); }
381
382 /// Get the instrumentation function name.
383 std::string getRTName(StringRef Prefix, StringRef Name,
384 StringRef Suffix1 = "", StringRef Suffix2 = "") const {
385 return (getRTName() + Prefix + Name + Suffix1 + Suffix2).str();
386 }
387
388 /// Add the base configuration option \p BCO into the list of base options.
390 BaseConfigurationOptions.push_back(BCO);
391 }
392
393 /// Register instrumentation opportunity \p IO.
394 void addChoice(InstrumentationOpportunity &IO, LLVMContext &Ctx);
395
396 /// Allocate an object of type \p Ty using a bump allocator and construct it
397 /// with the \p Args arguments. The object may not be freed manually.
398 template <typename Ty, typename... ArgsTy>
399 static Ty *allocate(ArgsTy &&...Args) {
401 Ty *Obj = Allocator.Allocate();
402 new (Obj) Ty(std::forward<ArgsTy>(Args)...);
403 return Obj;
404 }
405
406 /// Map to remember underlying objects for pointers.
408
409 /// Map to remember base pointer info for values in a specific function.
411
412 /// Return the base pointer info for \p V.
414
415 /// Mapping to remember global strings passed to the runtime.
417
418 /// Mapping from constants to globals with the constant as initializer.
420
422 Constant *&V = GlobalStringsMap[SS.save(S)];
423 if (!V) {
424 auto &M = *IIRB.IRB.GetInsertBlock()->getModule();
425 V = IIRB.IRB.CreateGlobalString(
426 S, getRTName() + ".str",
427 M.getDataLayout().getDefaultGlobalsAddressSpace(), &M);
428 if (V->getType() != IIRB.IRB.getPtrTy())
429 V = ConstantExpr::getAddrSpaceCast(V, IIRB.IRB.getPtrTy());
430 }
431 return V;
432 }
433 /// The list of enabled base configuration options.
435
436 /// The base configuration options.
437 std::unique_ptr<BaseConfigurationOption> RuntimePrefix;
438 std::unique_ptr<BaseConfigurationOption> RuntimeStubsFile;
439 std::unique_ptr<BaseConfigurationOption> DemangleFunctionNames;
440 std::unique_ptr<BaseConfigurationOption> TargetRegex;
441 std::unique_ptr<BaseConfigurationOption> FunctionRegex;
442 std::unique_ptr<BaseConfigurationOption> HostEnabled;
443 std::unique_ptr<BaseConfigurationOption> GPUEnabled;
444
445 /// The map registered instrumentation opportunities. The map is indexed by
446 /// the instrumentation location kind and then by the opportunity name. Notice
447 /// that an instrumentation location may have more than one instrumentation
448 /// opportunity registered.
452
453 /// Utilities for allocating and building strings.
454 ///{
457 ///}
458};
459
460/// Base class for instrumentation opportunities. All opportunities should
461/// inherit from this class and implement the virtual class members.
464
465 /// Construct an opportunity with location \p IP.
467
468 /// The instrumentation location of the opportunity.
470
471 /// The list of possible arguments for the instrumentation runtime function.
472 /// The order within the array determines the order of arguments. Arguments
473 /// may be disabled and will not be passed to the function call.
475
476 /// Whether the opportunity is enabled.
477 bool Enabled = true;
478
479 /// A filter expression to be matched against runtime property values. If the
480 /// filter is non-empty, only instrumentations matching the filter will be
481 /// executed. The filter syntax supports:
482 /// - Integer comparisons: ==, !=, <, >, <=, >=
483 /// - String comparisons: ==, != (with quoted strings)
484 /// - String prefix check: startswith("prefix")
485 /// - Logical operators: &&, ||
486 /// Examples:
487 /// "sync_scope_id==3 && atomicity_ordering>0"
488 /// "name==\"foo\" || name.startswith(\"test_\")"
489 /// If a property value is dynamic (not a constant), the filter is assumed to
490 /// pass (true).
492
493 /// Helpers to cast values, pass them to the runtime, and replace them. To be
494 /// used as part of the getter/setter of a InstrumentationOpportunity.
495 ///{
496 LLVM_ABI static Value *forceCast(Value &V, Type &Ty,
500 return forceCast(V, Ty, IIRB);
501 }
502 LLVM_ABI static Value *replaceValue(Value &V, Value &NewV,
505 ///}
506
507 /// Instrument the value \p V using the configuration \p IConf, and
508 /// potentially, the caches \p ICaches.
509 virtual Value *instrument(Value *&V, bool &Changed,
512 InstrumentationCaches &ICaches) {
513 if (CB && !CB(*V))
514 return nullptr;
515
516 // Check if the filter matches before instrumenting
517 if (!evaluateFilter(*V, Changed, *this, IConf, IIRB))
518 return nullptr;
519
520 Changed = true;
521 const DataLayout &DL = IIRB.IRB.GetInsertBlock()->getDataLayout();
522 IRTCallDescription IRTCallDesc(*this, getRetTy(V->getContext()));
523 auto *CI = IRTCallDesc.createLLVMCall(V, IConf, IIRB, DL, ICaches);
524 return CI;
525 }
526
527 /// Get the return type for the instrumentation runtime function.
528 virtual Type *getRetTy(LLVMContext &Ctx) const { return nullptr; }
529
530 /// Get the name of the instrumentation opportunity.
531 virtual StringRef getName() const = 0;
532
533 /// Get all opcodes for this instrumentation opportunity. For non-instruction
534 /// opportunities, returns an empty array. For instruction opportunities,
535 /// returns an array of all opcodes this IO handles.
536 virtual ArrayRef<unsigned> getAllOpcodes() const { return {}; }
537
538 /// Get the location kind of the instrumentation opportunity.
540 return IP.getKind();
541 }
542
543 /// An optional callback that takes the value that is about to be
544 /// instrumented and can return false if it should be skipped.
545 ///{
546 using CallbackTy = std::function<bool(Value &)>;
547 CallbackTy CB = nullptr;
548 ///}
549
550 /// Add arguments available in all instrumentation opportunities.
552 bool PassId) {
553 const auto CB = IP.isPRE() ? getIdPre : getIdPost;
554 if (PassId) {
555 IRTArgs.push_back(
557 "A unique ID associated with the given instrumentor call",
558 IRTArg::NONE, CB, nullptr, true, true));
559 }
560 }
561
562 /// Get the opportunity identifier for the pre and post positions.
563 ///{
564 LLVM_ABI static Value *getIdPre(Value &V, Type &Ty,
567 LLVM_ABI static Value *getIdPost(Value &V, Type &Ty,
570 ///}
571
572 /// Compute the opportunity identifier for the current instrumentation epoch
573 /// \p CurrentEpoch. The identifiers are assigned consecutively as the epoch
574 /// advances. Epochs may have no identifier assigned (e.g., because no id was
575 /// requested). This function always returns the same identifier when called
576 /// multiple times with the same epoch.
577 static int32_t getIdFromEpoch(uint32_t CurrentEpoch) {
578 static DenseMap<uint32_t, int32_t> EpochIdMap;
579 static int32_t GlobalId = 0;
580 int32_t &EpochId = EpochIdMap[CurrentEpoch];
581 if (EpochId == 0)
582 EpochId = ++GlobalId;
583 return EpochId;
584 }
585};
586
587/// The base class that implements basic logic for any instruction
588/// instrumentation opportunity that inherits from InstructionIO.
614
615/// The common instrumentation opportunity class for instruction opportunities.
616/// Each instruction opportunity should inherit from this class and implement
617/// the virtual class members. If multiple opcodes are provided, all of them
618/// are instrumented using the same logic, and a name must be explicitly
619/// provided by overriding getName().
620template <unsigned... Opcodes> struct InstructionIO : public BaseInstructionIO {
621 virtual ~InstructionIO() {}
622
623 /// Construct an instruction opportunity.
625 : BaseInstructionIO(Kind) {
626 static_assert(sizeof...(Opcodes) >= 1,
627 "InstructionIO must have at least one opcode");
628 }
629
630 static constexpr std::array<unsigned, sizeof...(Opcodes)> OpcodesArray = {
631 Opcodes...};
632
633 /// Get all opcodes for this instrumentation opportunity (override).
634 ArrayRef<unsigned> getAllOpcodes() const override { return OpcodesArray; }
635
636 /// Get the number of opcodes.
637 static constexpr size_t getNumOpcodes() { return OpcodesArray.size(); }
638
639 /// Get the name of the instruction. For single-opcode IOs, this defaults to
640 /// the opcode name. For multi-opcode IOs, getName() MUST be overridden to
641 /// provide an explicit name identifying the whole group of opcodes.
642 virtual StringRef getName() const override {
643 // This method should not be called for multi-opcode IOs.
644 // Multi-opcode IOs must override getName().
645 assert(sizeof...(Opcodes) == 1 &&
646 "Multi-opcode InstructionIO must override getName() to provide an "
647 "explicit name instead of using the first opcode");
648 // Get the first opcode from the opcodes array.
650 }
651};
652
653/// The instrumentation opportunity for functions.
657
668
669 struct ConfigTy final : public BaseConfigTy<ConfigKind> {
670 std::function<bool(Argument &)> ArgFilter;
671
674
675 StringRef getName() const override { return "function"; }
676
679 ConfigTy *UserConfig = nullptr);
680
684 LLVM_ABI static Value *getFunctionName(Value &V, Type &Ty,
695 LLVM_ABI static Value *isMainFunction(Value &V, Type &Ty,
698
699 static void populate(InstrumentationConfig &IConf,
701 auto *PreIO =
703 PreIO->init(IConf, IIRB);
704 auto *PostIO =
706 PostIO->init(IConf, IIRB);
707 }
708};
709
710/// The instrumentation opportunity for alloca instructions.
711struct AllocaIO final : public InstructionIO<Instruction::Alloca> {
713
723
726
729 ConfigTy *UserConfig = nullptr);
730
731 LLVM_ABI static Value *getSize(Value &V, Type &Ty,
734 LLVM_ABI static Value *setSize(Value &V, Value &NewV,
737 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
740
741 static void populate(InstrumentationConfig &IConf,
743 auto *PreIO =
745 PreIO->init(IConf, IIRB);
746 auto *PostIO =
748 PostIO->init(IConf, IIRB);
749 }
750};
751
752struct UnreachableIO final : public InstructionIO<Instruction::Unreachable> {
754 : InstructionIO<Instruction::Unreachable>(
755 InstrumentationLocation::INSTRUCTION_PRE) {}
756
761
764
767 ConfigTy *UserConfig = nullptr);
768
769 static void populate(InstrumentationConfig &IConf,
771 auto *PreIO = IConf.allocate<UnreachableIO>();
772 PreIO->init(IConf, IIRB);
773 }
774};
775
776// Special instrumentation opportunity for base pointers of memory operations.
781 virtual ~BasePointerIO() {};
782
789
792
793 StringRef getName() const override { return "base_pointer_info"; }
794
797 ConfigTy *UserConfig = nullptr);
798
799 LLVM_ABI static Value *getPointerKind(Value &V, Type &Ty,
802
803 /// This is necessary to produce a return value that can be used by other IOs.
804 /// No replacement is actually happening.
805 static Value *setValueNoop(Value &V, Value &NewV,
808 return &NewV;
809 }
810
811 static void populate(InstrumentationConfig &IConf,
813 auto *BPIO = IConf.allocate<BasePointerIO>();
814 BPIO->init(IConf, IIRB);
815 }
816};
817
818// Module instrumentation opportunity.
822
829
832
833 StringRef getName() const override { return "module"; }
834
837 ConfigTy *UserConfig = nullptr);
838
839 LLVM_ABI static Value *getModuleName(Value &V, Type &Ty,
842 LLVM_ABI static Value *getTargetTriple(Value &V, Type &Ty,
845
846 static void populate(InstrumentationConfig &IConf,
849 PreIO->init(IConf, IIRB);
850 auto *PostIO =
852 PostIO->init(IConf, IIRB);
853 }
854};
855
856// Global variable instrumentation opportunity.
860
874
877
878 StringRef getName() const override { return "global"; }
879
882 ConfigTy *UserConfig = nullptr);
883
884 LLVM_ABI static Value *getAddress(Value &V, Type &Ty,
887 LLVM_ABI static Value *setAddress(Value &V, Value &NewV,
890 LLVM_ABI static Value *getAS(Value &V, Type &Ty, InstrumentationConfig &IConf,
892 LLVM_ABI static Value *getDeclaredSize(Value &V, Type &Ty,
895 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
898 LLVM_ABI static Value *getSymbolName(Value &V, Type &Ty,
901 LLVM_ABI static Value *getInitialValue(Value &V, Type &Ty,
904 LLVM_ABI static Value *isConstant(Value &V, Type &Ty,
907 LLVM_ABI static Value *isDefinition(Value &V, Type &Ty,
910
911 static void populate(InstrumentationConfig &IConf,
913 auto *PreIO =
915 PreIO->init(IConf, IIRB);
916 auto *PostIO =
918 PostIO->init(IConf, IIRB);
919 }
920};
921
922/// The instrumentation opportunity for store instructions.
923struct StoreIO : public InstructionIO<Instruction::Store> {
924 virtual ~StoreIO() {};
925
926 /// Construct a store instruction opportunity.
928
929 /// The selector of arguments for store opportunities.
930 ///{
947
950 ///}
951
952 /// Get the type of the stored value.
954 return IIRB.Int64Ty;
955 }
956
957 /// Initialize the store opportunity using the instrumentation config \p IConf
958 /// and the user config \p UserConfig.
961 ConfigTy *UserConfig = nullptr);
962
963 /// Getters and setters for the arguments of the instrumentation function for
964 /// the store opportunity.
965 ///{
966 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
969 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
972 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
978 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
981 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
984 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
987 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
990 LLVM_ABI static Value *getValueSubTypeId(Value &V, Type &Ty,
996 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
999 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1000 InstrumentationConfig &IConf,
1002 ///}
1003
1004 /// Create the store opportunities for pre and post positions. The
1005 /// opportunities are also initialized with the arguments for their
1006 /// instrumentation calls.
1009 auto *PreIO =
1011 PreIO->init(IConf, IIRB);
1012 auto *PostIO =
1014 PostIO->init(IConf, IIRB);
1015 }
1016};
1017
1018/// The instrumentation opportunity for load instructions.
1019struct LoadIO : public InstructionIO<Instruction::Load> {
1020 virtual ~LoadIO() {};
1021
1022 /// Construct a load opportunity.
1024
1025 /// The selector of arguments for load opportunities.
1026 ///{
1044
1047 ///}
1048
1049 /// Get the type of the loaded value.
1051 return IIRB.Int64Ty;
1052 }
1053
1054 /// Initialize the load opportunity using the instrumentation config \p IConf
1055 /// and the user config \p UserConfig.
1058 ConfigTy *UserConfig = nullptr);
1059
1060 /// Getters and setters for the arguments of the instrumentation function for
1061 /// the load opportunity.
1062 ///{
1063 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
1064 InstrumentationConfig &IConf,
1066 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
1067 InstrumentationConfig &IConf,
1069 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
1070 InstrumentationConfig &IConf,
1072 LLVM_ABI static Value *getBasePointerInfo(Value &V, Type &Ty,
1073 InstrumentationConfig &IConf,
1075 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
1076 InstrumentationConfig &IConf,
1078 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
1079 InstrumentationConfig &IConf,
1081 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
1082 InstrumentationConfig &IConf,
1084 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
1085 InstrumentationConfig &IConf,
1087 LLVM_ABI static Value *getValueSubTypeId(Value &V, Type &Ty,
1088 InstrumentationConfig &IConf,
1091 InstrumentationConfig &IConf,
1093 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
1094 InstrumentationConfig &IConf,
1096 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1097 InstrumentationConfig &IConf,
1099 ///}
1100
1101 /// Create the load opportunities for PRE and POST positions.
1104 auto *PreIO =
1106 PreIO->init(IConf, IIRB);
1107 auto *PostIO =
1109 PostIO->init(IConf, IIRB);
1110 }
1111};
1112
1113/// The instrumentation opportunity for type cast instructions.
1114/// This includes PtrToInt, IntToPtr, Trunc, ZExt, SExt, FPToUI, FPToSI,
1115/// UIToFP, SIToFP, FPTrunc, FPExt, AddrSpaceCast, and BitCast.
1116struct CastIO final
1117 : public InstructionIO<
1118 Instruction::PtrToInt, Instruction::IntToPtr, Instruction::Trunc,
1119 Instruction::ZExt, Instruction::SExt, Instruction::FPToUI,
1120 Instruction::FPToSI, Instruction::UIToFP, Instruction::SIToFP,
1121 Instruction::FPTrunc, Instruction::FPExt, Instruction::AddrSpaceCast,
1122 Instruction::BitCast> {
1124
1139
1142
1143 StringRef getName() const override { return "cast"; }
1144
1147 ConfigTy *UserConfig = nullptr);
1148
1149 LLVM_ABI static Value *getInput(Value &V, Type &Ty,
1150 InstrumentationConfig &IConf,
1152 LLVM_ABI static Value *getInputTypeId(Value &V, Type &Ty,
1153 InstrumentationConfig &IConf,
1155 LLVM_ABI static Value *getInputSubTypeId(Value &V, Type &Ty,
1156 InstrumentationConfig &IConf,
1158 LLVM_ABI static Value *getInputSize(Value &V, Type &Ty,
1159 InstrumentationConfig &IConf,
1161 LLVM_ABI static Value *getResultTypeId(Value &V, Type &Ty,
1162 InstrumentationConfig &IConf,
1164 LLVM_ABI static Value *getResultSubTypeId(Value &V, Type &Ty,
1165 InstrumentationConfig &IConf,
1167 LLVM_ABI static Value *getResultSize(Value &V, Type &Ty,
1168 InstrumentationConfig &IConf,
1170
1173 auto *PreIO =
1175 PreIO->init(IConf, IIRB);
1176 auto *PostIO =
1178 PostIO->init(IConf, IIRB);
1179 }
1180};
1181
1182/// Instrumentation opportunity for numeric operations. This includes Add, FAdd,
1183/// Sub, FSub, Mul, FMul, UDiv, FDiv, SDiv, URem, SRem, FRem, Shl, LShr, AShr,
1184/// And, Or, Xor, and FNeg.
1185struct NumericIO final
1186 : public InstructionIO<
1187 Instruction::Add, Instruction::FAdd, Instruction::Sub,
1188 Instruction::FSub, Instruction::Mul, Instruction::FMul,
1189 Instruction::UDiv, Instruction::FDiv, Instruction::SDiv,
1190 Instruction::URem, Instruction::SRem, Instruction::FRem,
1191 Instruction::Shl, Instruction::LShr, Instruction::AShr,
1192 Instruction::And, Instruction::Or, Instruction::Xor,
1193 Instruction::FNeg> {
1195
1209
1212
1213 StringRef getName() const override { return "numeric"; }
1214
1217 ConfigTy *UserConfig = nullptr);
1218
1219 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1220 InstrumentationConfig &IConf,
1222
1225 auto *PreIO =
1227 PreIO->init(IConf, IIRB);
1228 auto *PostIO =
1230 PostIO->init(IConf, IIRB);
1231 }
1232};
1233
1234struct CompareIO final
1235 : public InstructionIO<Instruction::ICmp, Instruction::FCmp> {
1237
1253
1256
1257 StringRef getName() const override { return "compare"; }
1258
1261 ConfigTy *UserConfig = nullptr);
1262
1263 LLVM_ABI static Value *getOperandTypeId(Value &V, Type &Ty,
1264 InstrumentationConfig &IConf,
1266 LLVM_ABI static Value *getOperandSize(Value &V, Type &Ty,
1267 InstrumentationConfig &IConf,
1269 LLVM_ABI static Value *getPredicate(Value &V, Type &Ty,
1270 InstrumentationConfig &IConf,
1272 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1273 InstrumentationConfig &IConf,
1275
1278 auto *PreIO =
1280 PreIO->init(IConf, IIRB);
1281 auto *PostIO =
1283 PostIO->init(IConf, IIRB);
1284 }
1285};
1286
1287} // namespace instrumentor
1288
1289/// The Instrumentor pass.
1290class InstrumentorPass : public RequiredPassInfoMixin<InstrumentorPass> {
1291 using InstrumentationConfig = instrumentor::InstrumentationConfig;
1292 using InstrumentorIRBuilderTy = instrumentor::InstrumentorIRBuilderTy;
1293
1294 /// File system to be used for read operations.
1296
1297 /// The configuration and IR builder provided by the user.
1298 InstrumentationConfig *UserIConf;
1299 InstrumentorIRBuilderTy *UserIIRB;
1300
1301 PreservedAnalyses run(Module &M, InstrumentationConfig &IConf,
1302 InstrumentorIRBuilderTy &IIRB, bool ReadConfig);
1303
1304public:
1305 /// Construct an instrumentor pass that will use the instrumentation
1306 /// configuration \p IC and the IR builder \p IIRB. If an IR builder is not
1307 /// provided, a default builder is used. When the configuration is not
1308 /// provided, it is read from the config file if available and otherwise a
1309 /// default configuration is used.
1311 InstrumentationConfig *IC = nullptr,
1312 InstrumentorIRBuilderTy *IIRB = nullptr);
1313
1315};
1316
1317} // end namespace llvm
1318
1319#endif // LLVM_TRANSFORMS_IPO_INSTRUMENTOR_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:215
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file defines an array type that can be indexed using scoped enum values.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This file defines the RefCountedBase, ThreadSafeRefCountedBase, and IntrusiveRefCntPtr classes.
This file implements a map that provides insertion order iteration.
ModuleAnalysisManager MAM
Basic Register Allocator
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This class represents a function call, abstracting a target machine's calling convention.
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Class to represent function types.
const char * getOpcodeName() const
LLVM_ABI InstrumentorPass(IntrusiveRefCntPtr< vfs::FileSystem > FS=nullptr, InstrumentationConfig *IC=nullptr, InstrumentorIRBuilderTy *IIRB=nullptr)
Construct an instrumentor pass that will use the instrumentation configuration IC and the IR builder ...
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A BumpPtrAllocator that allows only elements of a specific type to be allocated.
Definition Allocator.h:397
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition StringSaver.h:22
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
LLVM Value Representation.
Definition Value.h:75
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
std::function< Value *( Value &, Value &, InstrumentationConfig &, InstrumentorIRBuilderTy &)> SetterCallbackTy
LLVM_ABI bool evaluateFilter(Value &V, bool &Changed, InstrumentationOpportunity &IO, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
Evaluate the filter expression against the current instrumentation opportunity.
std::function< Value *( Value &, Type &, InstrumentationConfig &, InstrumentorIRBuilderTy &)> GetterCallbackTy
Callback type for getting/setting a value for a instrumented opportunity.
This is an optimization pass for GlobalISel generic memory operations.
Op::Description Desc
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:390
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
@ Enable
Enable colors.
Definition WithColor.h:47
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:860
A CRTP mix-in for passes that should not be skipped.
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
}
AllocaIO(InstrumentationLocation::KindTy Kind)
BaseConfigTy< ConfigKind > ConfigTy
static LLVM_ABI Value * getSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * setSize(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getAlignment(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
Boolean option bitset with a compile-time number of bits to store as many options as the enumeration ...
An option for the base configuration.
void setBool(bool B)
Set and get of the boolean value.
static LLVM_ABI std::unique_ptr< BaseConfigurationOption > createStringOption(InstrumentationConfig &IC, StringRef Name, StringRef Description, StringRef DefaultValue)
Create a string option with Name name, Description description and DefaultValue as string default val...
BaseConfigurationOption(StringRef Name, StringRef Desc, KindTy Kind)
}
KindTy
The possible types of options.
static LLVM_ABI std::unique_ptr< BaseConfigurationOption > createBoolOption(InstrumentationConfig &IC, StringRef Name, StringRef Description, bool DefaultValue)
Create a boolean option with Name name, Description description and DefaultValue as boolean default v...
static LLVM_ABI Value * getOpcode(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getRightOperand(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getSubTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getTypeSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
BaseInstructionIO(InstrumentationLocation::KindTy Kind)
static LLVM_ABI Value * getLeftOperand(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getPointerKind(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static Value * setValueNoop(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
This is necessary to produce a return value that can be used by other IOs.
StringRef getName() const override
Get the name of the instrumentation opportunity.
BaseConfigTy< ConfigKind > ConfigTy
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
CastIO {.
static LLVM_ABI Value * getResultTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getInputSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getResultSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getResultSubTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getInput(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getInputSubTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
BaseConfigTy< ConfigKind > ConfigTy
CastIO(InstrumentationLocation::KindTy Kind)
static LLVM_ABI Value * getInputTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
StringRef getName() const override
Get the name of the instruction.
static LLVM_ABI Value * getFlags(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getOperandSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getOperandTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
BaseConfigTy< ConfigKind > ConfigTy
StringRef getName() const override
Get the name of the instruction.
static LLVM_ABI Value * getPredicate(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
CompareIO(InstrumentationLocation::KindTy Kind)
std::function< bool(Argument &)> ArgFilter
llvm::instrumentor::FunctionIO::ConfigTy Config
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
StringRef getName() const override
Get the name of the instrumentation opportunity.
LLVM_ABI Value * setArguments(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getFunctionAddress(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * isMainFunction(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
FunctionIO(InstrumentationLocation::KindTy Kind)
LLVM_ABI Value * getArguments(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI Value * getNumArguments(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getFunctionName(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
FunctionIO {.
static LLVM_ABI Value * setAddress(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
static LLVM_ABI Value * getAS(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getAlignment(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getInitialValue(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * isDefinition(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getDeclaredSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
StringRef getName() const override
Get the name of the instrumentation opportunity.
static LLVM_ABI Value * getSymbolName(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getAddress(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
GlobalVarIO(InstrumentationLocation::KindTy Kind)
BaseConfigTy< ConfigKind > ConfigTy
static LLVM_ABI Value * isConstant(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
GetterCallbackTy GetterCB
The callback for getting the value of the argument.
StringRef Description
A string with the description of the argument.
unsigned Flags
The flags that describe the properties of the argument.
Type * Ty
The type of the argument.
IRTArg(Type *Ty, StringRef Name, StringRef Description, unsigned Flags, GetterCallbackTy GetterCB, SetterCallbackTy SetterCB=nullptr, bool Enabled=true, bool NoCache=false)
Construct an argument.
bool Enabled
Whether the argument is enabled and should be passed to the function call.
SetterCallbackTy SetterCB
The callback for consuming the output value of the argument.
StringRef Name
A string with the name of the argument.
bool NoCache
Whether the argument value can be cached between the PRE and POST calls.
IRArgFlagTy
Flags describing the possible properties of an argument.
Helper to represent an instrumentation runtime function that is related to an instrumentation opportu...
bool isReplacable(IRTArg &IRTA) const
Return whether the IRTA argument can be replaced.
LLVM_ABI IRTCallDescription(InstrumentationOpportunity &IO, Type *RetTy=nullptr)
Construct an instrumentation function description linked to the IO instrumentation opportunity and Re...
bool MightRequireIndirection
Whether any argument may require indirection.
LLVM_ABI std::pair< std::string, std::string > createCBodies() const
Create a string representation of the function definition in C.
LLVM_ABI CallInst * createLLVMCall(Value *&V, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, const DataLayout &DL, InstrumentationCaches &ICaches)
Create a call instruction that calls to the instrumentation function and passes the corresponding arg...
Type * RetTy
The return type of the instrumentation function.
InstrumentationOpportunity & IO
The instrumentation opportunity which it is linked to.
LLVM_ABI FunctionType * createLLVMSignature(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, const DataLayout &DL, bool ForceIndirection)
Create the type of the instrumentation function.
LLVM_ABI std::pair< std::string, std::string > createCSignature(const InstrumentationConfig &IConf) const
Create a string representation of the function declaration in C.
unsigned NumReplaceableArgs
The number of arguments that can be replaced.
bool RequiresIndirection
Whether the function requires indirection in some argument.
bool isPotentiallyIndirect(IRTArg &IRTA) const
Return whether the function may have any indirect argument.
ArrayRef< unsigned > getAllOpcodes() const override
Get all opcodes for this instrumentation opportunity (override).
InstructionIO(InstrumentationLocation::KindTy Kind)
Construct an instruction opportunity.
static constexpr std::array< unsigned, sizeof...(Opcodes)> OpcodesArray
static constexpr size_t getNumOpcodes()
Get the number of opcodes.
virtual StringRef getName() const override
Get the name of the instruction.
Helper that represent the caches for instrumentation call arguments.
The class that contains the configuration for the instrumentor.
virtual void populate(InstrumentorIRBuilderTy &IIRB)
Populate the instrumentation opportunities.
Constant * getGlobalString(StringRef S, InstrumentorIRBuilderTy &IIRB)
DenseMap< Value *, Value * > UnderlyingObjsMap
Map to remember underlying objects for pointers.
std::unique_ptr< BaseConfigurationOption > HostEnabled
std::unique_ptr< BaseConfigurationOption > DemangleFunctionNames
void init(InstrumentorIRBuilderTy &IIRB)
Initialize the config to a clean base state without loosing cached values that can be reused across c...
DenseMap< std::pair< Value *, Function * >, Value * > BasePointerInfoMap
Map to remember base pointer info for values in a specific function.
EnumeratedArray< MapVector< StringRef, InstrumentationOpportunity * >, InstrumentationLocation::KindTy > IChoices
The map registered instrumentation opportunities.
std::unique_ptr< BaseConfigurationOption > GPUEnabled
DenseMap< Constant *, GlobalVariable * > ConstantGlobalsCache
Mapping from constants to globals with the constant as initializer.
Value * getBasePointerInfo(Value &V, InstrumentorIRBuilderTy &IIRB)
Return the base pointer info for V.
BumpPtrAllocator StringAllocator
Utilities for allocating and building strings.
std::string getRTName(StringRef Prefix, StringRef Name, StringRef Suffix1="", StringRef Suffix2="") const
Get the instrumentation function name.
std::unique_ptr< BaseConfigurationOption > RuntimeStubsFile
StringRef getRTName() const
Get the runtime prefix for the instrumentation runtime functions.
void addBaseChoice(BaseConfigurationOption *BCO)
Add the base configuration option BCO into the list of base options.
static Ty * allocate(ArgsTy &&...Args)
Allocate an object of type Ty using a bump allocator and construct it with the Args arguments.
SmallVector< BaseConfigurationOption * > BaseConfigurationOptions
The list of enabled base configuration options.
InstrumentationConfig()
Construct an instrumentation configuration with the base options.
std::unique_ptr< BaseConfigurationOption > FunctionRegex
std::unique_ptr< BaseConfigurationOption > TargetRegex
std::unique_ptr< BaseConfigurationOption > RuntimePrefix
The base configuration options.
DenseMap< StringRef, Constant * > GlobalStringsMap
Mapping to remember global strings passed to the runtime.
Helper to represent an instrumentation location, which is composed of an instrumentation opportunity ...
KindTy getKind() const
Return the type and position.
InstrumentationLocation(KindTy Kind)
Construct an instrumentation location with the given kind.
static KindTy getKindFromStr(StringRef S)
Return the location kind described by a string.
static StringRef getKindStr(KindTy Kind)
Return the string representation given a location kind.
KindTy
The supported location kinds, which are composed of a opportunity type and position.
static bool isPRE(KindTy Kind)
Return whether a location kind is positioned before the event occurs.
bool isPRE() const
Return whether the instrumentation location is before the event occurs.
Base class for instrumentation opportunities.
InstrumentationLocation::KindTy getLocationKind() const
Get the location kind of the instrumentation opportunity.
bool Enabled
Whether the opportunity is enabled.
static LLVM_ABI Value * getIdPre(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
Get the opportunity identifier for the pre and post positions.
virtual ArrayRef< unsigned > getAllOpcodes() const
Get all opcodes for this instrumentation opportunity.
virtual Value * instrument(Value *&V, bool &Changed, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, InstrumentationCaches &ICaches)
}
static LLVM_ABI Value * forceCast(Value &V, Type &Ty, InstrumentorIRBuilderTy &IIRB)
Helpers to cast values, pass them to the runtime, and replace them.
static int32_t getIdFromEpoch(uint32_t CurrentEpoch)
}
std::function< bool(Value &)> CallbackTy
An optional callback that takes the value that is about to be instrumented and can return false if it...
static LLVM_ABI Value * getIdPost(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static Value * getValue(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * replaceValue(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
virtual StringRef getName() const =0
Get the name of the instrumentation opportunity.
InstrumentationLocation IP
The instrumentation location of the opportunity.
InstrumentationOpportunity(const InstrumentationLocation IP)
Construct an opportunity with location IP.
SmallVector< IRTArg > IRTArgs
The list of possible arguments for the instrumentation runtime function.
void addCommonArgs(InstrumentationConfig &IConf, LLVMContext &Ctx, bool PassId)
}
virtual Type * getRetTy(LLVMContext &Ctx) const
Get the return type for the instrumentation runtime function.
StringRef Filter
A filter expression to be matched against runtime property values.
An IR builder augmented with extra information for the instrumentor pass.
IRBuilder< ConstantFolder, IRBuilderCallbackInserter > IRB
The underlying IR builder with insertion callback.
static LLVM_ABI Value * getValueSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getSyncScopeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getAtomicityOrdering(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
virtual Type * getValueType(InstrumentorIRBuilderTy &IIRB) const
}
static LLVM_ABI Value * getValueSubTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getValue(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
ConfigKind
The selector of arguments for load opportunities.
LoadIO(InstrumentationLocation::KindTy Kind)
Construct a load opportunity.
static LLVM_ABI Value * getAlignment(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getPointer(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
Getters and setters for the arguments of the instrumentation function for the load opportunity.
static LLVM_ABI Value * isVolatile(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getBasePointerInfo(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * setPointer(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
BaseConfigTy< ConfigKind > ConfigTy
static LLVM_ABI Value * getPointerAS(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
}
static LLVM_ABI Value * getValueTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
Initialize the load opportunity using the instrumentation config IConf and the user config UserConfig...
static LLVM_ABI Value * getModuleName(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
ModuleIO(InstrumentationLocation::KindTy Kind)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getTargetTriple(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
BaseConfigTy< ConfigKind > ConfigTy
StringRef getName() const override
Get the name of the instrumentation opportunity.
StringRef getName() const override
Get the name of the instruction.
static LLVM_ABI Value * getFlags(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
}
NumericIO(InstrumentationLocation::KindTy Kind)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
BaseConfigTy< ConfigKind > ConfigTy
static LLVM_ABI Value * getPointer(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
Getters and setters for the arguments of the instrumentation function for the store opportunity.
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
}
static LLVM_ABI Value * getValueTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
virtual Type * getValueType(InstrumentorIRBuilderTy &IIRB) const
}
static LLVM_ABI Value * getSyncScopeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getPointerAS(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
ConfigKind
The selector of arguments for store opportunities.
static LLVM_ABI Value * getAlignment(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getValue(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * setPointer(Value &V, Value &NewV, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
StoreIO(InstrumentationLocation::KindTy Kind)
Construct a store instruction opportunity.
static LLVM_ABI Value * isVolatile(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getValueSize(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getValueSubTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
BaseConfigTy< ConfigKind > ConfigTy
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
Initialize the store opportunity using the instrumentation config IConf and the user config UserConfi...
static LLVM_ABI Value * getBasePointerInfo(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static LLVM_ABI Value * getAtomicityOrdering(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
UnreachableIO {.
BaseConfigTy< ConfigKind > ConfigTy
Helper union that holds any possible option type.