LLVM 24.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);
374 *this, "runtime_bitcode", "Link runtime bitcode", "");
376 *this, "inline_runtime", "Inline runtime function calls eagerly", true);
377 populate(IIRB);
378 }
379
380 /// Populate the instrumentation opportunities.
381 virtual void populate(InstrumentorIRBuilderTy &IIRB);
382
383 /// Get the runtime prefix for the instrumentation runtime functions.
384 StringRef getRTName() const { return RuntimePrefix->getString(); }
385
386 /// Get the instrumentation function name.
387 std::string getRTName(StringRef Prefix, StringRef Name,
388 StringRef Suffix1 = "", StringRef Suffix2 = "") const {
389 return (getRTName() + Prefix + Name + Suffix1 + Suffix2).str();
390 }
391
392 /// Add the base configuration option \p BCO into the list of base options.
394 BaseConfigurationOptions.push_back(BCO);
395 }
396
397 /// Register instrumentation opportunity \p IO.
398 void addChoice(InstrumentationOpportunity &IO, LLVMContext &Ctx);
399
400 /// Allocate an object of type \p Ty using a bump allocator and construct it
401 /// with the \p Args arguments. The object may not be freed manually.
402 template <typename Ty, typename... ArgsTy>
403 static Ty *allocate(ArgsTy &&...Args) {
405 Ty *Obj = Allocator.Allocate();
406 new (Obj) Ty(std::forward<ArgsTy>(Args)...);
407 return Obj;
408 }
409
410 /// Map to remember underlying objects for pointers.
412
413 /// Map to remember base pointer info for values in a specific function.
415
416 /// Return the base pointer info for \p V.
418
419 /// Mapping to remember global strings passed to the runtime.
421
422 /// Mapping from constants to globals with the constant as initializer.
424
426 Constant *&V = GlobalStringsMap[SS.save(S)];
427 if (!V) {
428 auto &M = *IIRB.IRB.GetInsertBlock()->getModule();
429 V = IIRB.IRB.CreateGlobalString(
430 S, getRTName() + ".str",
431 M.getDataLayout().getDefaultGlobalsAddressSpace(), &M);
432 if (V->getType() != IIRB.IRB.getPtrTy())
433 V = ConstantExpr::getAddrSpaceCast(V, IIRB.IRB.getPtrTy());
434 }
435 return V;
436 }
437 /// The list of enabled base configuration options.
439
440 /// The base configuration options.
441 std::unique_ptr<BaseConfigurationOption> RuntimePrefix;
442 std::unique_ptr<BaseConfigurationOption> RuntimeStubsFile;
443 std::unique_ptr<BaseConfigurationOption> DemangleFunctionNames;
444 std::unique_ptr<BaseConfigurationOption> TargetRegex;
445 std::unique_ptr<BaseConfigurationOption> FunctionRegex;
446 std::unique_ptr<BaseConfigurationOption> HostEnabled;
447 std::unique_ptr<BaseConfigurationOption> GPUEnabled;
448 std::unique_ptr<BaseConfigurationOption> RuntimeBitcode;
449 std::unique_ptr<BaseConfigurationOption> InlineRuntimeEagerly;
450
451 /// The map registered instrumentation opportunities. The map is indexed by
452 /// the instrumentation location kind and then by the opportunity name. Notice
453 /// that an instrumentation location may have more than one instrumentation
454 /// opportunity registered.
458
459 /// Utilities for allocating and building strings.
460 ///{
463 ///}
464};
465
466/// Base class for instrumentation opportunities. All opportunities should
467/// inherit from this class and implement the virtual class members.
470
471 /// Construct an opportunity with location \p IP.
473
474 /// The instrumentation location of the opportunity.
476
477 /// The list of possible arguments for the instrumentation runtime function.
478 /// The order within the array determines the order of arguments. Arguments
479 /// may be disabled and will not be passed to the function call.
481
482 /// Flag names and their integer bitmask values.
484
485 /// Whether the opportunity is enabled.
486 bool Enabled = true;
487
488 /// A filter expression to be matched against runtime property values. If the
489 /// filter is non-empty, only instrumentations matching the filter will be
490 /// executed. The filter syntax supports:
491 /// - Integer comparisons: ==, !=, <, >, <=, >=
492 /// - String comparisons: ==, != (with quoted strings)
493 /// - String prefix check: startswith("prefix")
494 /// - Logical operators: &&, ||
495 /// Examples:
496 /// "sync_scope_id==3 && atomicity_ordering>0"
497 /// "name==\"foo\" || name.startswith(\"test_\")"
498 /// If a property value is dynamic (not a constant), the filter is assumed to
499 /// pass (true).
501
502 /// Helpers to cast values, pass them to the runtime, and replace them. To be
503 /// used as part of the getter/setter of a InstrumentationOpportunity.
504 ///{
505 LLVM_ABI static Value *forceCast(Value &V, Type &Ty,
509 return forceCast(V, Ty, IIRB);
510 }
511 LLVM_ABI static Value *replaceValue(Value &V, Value &NewV,
514 ///}
515
516 /// Instrument the value \p V using the configuration \p IConf, and
517 /// potentially, the caches \p ICaches.
518 virtual Value *instrument(Value *&V, bool &Changed,
521 InstrumentationCaches &ICaches) {
522 if (CB && !CB(*V))
523 return nullptr;
524
525 // Check if the filter matches before instrumenting
526 if (!evaluateFilter(*V, Changed, *this, IConf, IIRB))
527 return nullptr;
528
529 Changed = true;
530 const DataLayout &DL = IIRB.IRB.GetInsertBlock()->getDataLayout();
531 IRTCallDescription IRTCallDesc(*this, getRetTy(V->getContext()));
532 auto *CI = IRTCallDesc.createLLVMCall(V, IConf, IIRB, DL, ICaches);
533 return CI;
534 }
535
536 /// Get the return type for the instrumentation runtime function.
537 virtual Type *getRetTy(LLVMContext &Ctx) const { return nullptr; }
538
539 /// Get the name of the instrumentation opportunity.
540 virtual StringRef getName() const = 0;
541
542 /// Get all opcodes for this instrumentation opportunity. For non-instruction
543 /// opportunities, returns an empty array. For instruction opportunities,
544 /// returns an array of all opcodes this IO handles.
545 virtual ArrayRef<unsigned> getAllOpcodes() const { return {}; }
546
547 /// Get the location kind of the instrumentation opportunity.
549 return IP.getKind();
550 }
551
552 /// An optional callback that takes the value that is about to be
553 /// instrumented and can return false if it should be skipped.
554 ///{
555 using CallbackTy = std::function<bool(Value &)>;
556 CallbackTy CB = nullptr;
557 ///}
558
559 /// Add arguments available in all instrumentation opportunities.
561 bool PassId) {
562 const auto CB = IP.isPRE() ? getIdPre : getIdPost;
563 if (PassId) {
564 IRTArgs.push_back(
566 "A unique ID associated with the given instrumentor call",
567 IRTArg::NONE, CB, nullptr, true, true));
568 }
569 }
570
571 /// Get the opportunity identifier for the pre and post positions.
572 ///{
573 LLVM_ABI static Value *getIdPre(Value &V, Type &Ty,
576 LLVM_ABI static Value *getIdPost(Value &V, Type &Ty,
579 ///}
580
581 /// Compute the opportunity identifier for the current instrumentation epoch
582 /// \p CurrentEpoch. The identifiers are assigned consecutively as the epoch
583 /// advances. Epochs may have no identifier assigned (e.g., because no id was
584 /// requested). This function always returns the same identifier when called
585 /// multiple times with the same epoch.
586 static int32_t getIdFromEpoch(uint32_t CurrentEpoch) {
587 static DenseMap<uint32_t, int32_t> EpochIdMap;
588 static int32_t GlobalId = 0;
589 int32_t &EpochId = EpochIdMap[CurrentEpoch];
590 if (EpochId == 0)
591 EpochId = ++GlobalId;
592 return EpochId;
593 }
594};
595
596/// The base class that implements basic logic for any instruction
597/// instrumentation opportunity that inherits from InstructionIO.
623
624/// The common instrumentation opportunity class for instruction opportunities.
625/// Each instruction opportunity should inherit from this class and implement
626/// the virtual class members. If multiple opcodes are provided, all of them
627/// are instrumented using the same logic, and a name must be explicitly
628/// provided by overriding getName().
629template <unsigned... Opcodes> struct InstructionIO : public BaseInstructionIO {
630 virtual ~InstructionIO() {}
631
632 /// Construct an instruction opportunity.
634 : BaseInstructionIO(Kind) {
635 static_assert(sizeof...(Opcodes) >= 1,
636 "InstructionIO must have at least one opcode");
637 }
638
639 static constexpr std::array<unsigned, sizeof...(Opcodes)> OpcodesArray = {
640 Opcodes...};
641
642 /// Get all opcodes for this instrumentation opportunity (override).
643 ArrayRef<unsigned> getAllOpcodes() const override { return OpcodesArray; }
644
645 /// Get the number of opcodes.
646 static constexpr size_t getNumOpcodes() { return OpcodesArray.size(); }
647
648 /// Get the name of the instruction. For single-opcode IOs, this defaults to
649 /// the opcode name. For multi-opcode IOs, getName() MUST be overridden to
650 /// provide an explicit name identifying the whole group of opcodes.
651 virtual StringRef getName() const override {
652 // This method should not be called for multi-opcode IOs.
653 // Multi-opcode IOs must override getName().
654 assert(sizeof...(Opcodes) == 1 &&
655 "Multi-opcode InstructionIO must override getName() to provide an "
656 "explicit name instead of using the first opcode");
657 // Get the first opcode from the opcodes array.
659 }
660};
661
662/// The instrumentation opportunity for functions.
666
677
678 struct ConfigTy final : public BaseConfigTy<ConfigKind> {
679 std::function<bool(Argument &)> ArgFilter;
680
683
684 StringRef getName() const override { return "function"; }
685
688 ConfigTy *UserConfig = nullptr);
689
693 LLVM_ABI static Value *getFunctionName(Value &V, Type &Ty,
704 LLVM_ABI static Value *isMainFunction(Value &V, Type &Ty,
707
708 static void populate(InstrumentationConfig &IConf,
710 auto *PreIO =
712 PreIO->init(IConf, IIRB);
713 auto *PostIO =
715 PostIO->init(IConf, IIRB);
716 }
717};
718
719/// The instrumentation opportunity for alloca instructions.
720struct AllocaIO final : public InstructionIO<Instruction::Alloca> {
722
732
735
738 ConfigTy *UserConfig = nullptr);
739
740 LLVM_ABI static Value *getSize(Value &V, Type &Ty,
743 LLVM_ABI static Value *setSize(Value &V, Value &NewV,
746 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
749
750 static void populate(InstrumentationConfig &IConf,
752 auto *PreIO =
754 PreIO->init(IConf, IIRB);
755 auto *PostIO =
757 PostIO->init(IConf, IIRB);
758 }
759};
760
761struct UnreachableIO final : public InstructionIO<Instruction::Unreachable> {
763 : InstructionIO<Instruction::Unreachable>(
764 InstrumentationLocation::INSTRUCTION_PRE) {}
765
770
773
776 ConfigTy *UserConfig = nullptr);
777
778 static void populate(InstrumentationConfig &IConf,
780 auto *PreIO = IConf.allocate<UnreachableIO>();
781 PreIO->init(IConf, IIRB);
782 }
783};
784
785// Special instrumentation opportunity for base pointers of memory operations.
790 virtual ~BasePointerIO() {};
791
798
801
802 StringRef getName() const override { return "base_pointer_info"; }
803
806 ConfigTy *UserConfig = nullptr);
807
808 LLVM_ABI static Value *getPointerKind(Value &V, Type &Ty,
811
812 /// This is necessary to produce a return value that can be used by other IOs.
813 /// No replacement is actually happening.
814 static Value *setValueNoop(Value &V, Value &NewV,
817 return &NewV;
818 }
819
820 static void populate(InstrumentationConfig &IConf,
822 auto *BPIO = IConf.allocate<BasePointerIO>();
823 BPIO->init(IConf, IIRB);
824 }
825};
826
827// Module instrumentation opportunity.
831
838
841
842 StringRef getName() const override { return "module"; }
843
846 ConfigTy *UserConfig = nullptr);
847
848 LLVM_ABI static Value *getModuleName(Value &V, Type &Ty,
851 LLVM_ABI static Value *getTargetTriple(Value &V, Type &Ty,
854
855 static void populate(InstrumentationConfig &IConf,
858 PreIO->init(IConf, IIRB);
859 auto *PostIO =
861 PostIO->init(IConf, IIRB);
862 }
863};
864
865// Global variable instrumentation opportunity.
869
883
886
887 StringRef getName() const override { return "global"; }
888
891 ConfigTy *UserConfig = nullptr);
892
893 LLVM_ABI static Value *getAddress(Value &V, Type &Ty,
896 LLVM_ABI static Value *setAddress(Value &V, Value &NewV,
899 LLVM_ABI static Value *getAS(Value &V, Type &Ty, InstrumentationConfig &IConf,
901 LLVM_ABI static Value *getDeclaredSize(Value &V, Type &Ty,
904 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
907 LLVM_ABI static Value *getSymbolName(Value &V, Type &Ty,
910 LLVM_ABI static Value *getInitialValue(Value &V, Type &Ty,
913 LLVM_ABI static Value *isConstant(Value &V, Type &Ty,
916 LLVM_ABI static Value *isDefinition(Value &V, Type &Ty,
919
920 static void populate(InstrumentationConfig &IConf,
922 auto *PreIO =
924 PreIO->init(IConf, IIRB);
925 auto *PostIO =
927 PostIO->init(IConf, IIRB);
928 }
929};
930
931/// The instrumentation opportunity for store instructions.
932struct StoreIO : public InstructionIO<Instruction::Store> {
933 virtual ~StoreIO() {};
934
935 /// Construct a store instruction opportunity.
937
938 /// The selector of arguments for store opportunities.
939 ///{
956
959 ///}
960
961 /// Get the type of the stored value.
963 return IIRB.Int64Ty;
964 }
965
966 /// Initialize the store opportunity using the instrumentation config \p IConf
967 /// and the user config \p UserConfig.
970 ConfigTy *UserConfig = nullptr);
971
972 /// Getters and setters for the arguments of the instrumentation function for
973 /// the store opportunity.
974 ///{
975 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
978 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
981 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
987 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
990 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
993 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
996 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
999 LLVM_ABI static Value *getValueSubTypeId(Value &V, Type &Ty,
1000 InstrumentationConfig &IConf,
1003 InstrumentationConfig &IConf,
1005 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
1006 InstrumentationConfig &IConf,
1008 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1009 InstrumentationConfig &IConf,
1011 ///}
1012
1013 /// Create the store opportunities for pre and post positions. The
1014 /// opportunities are also initialized with the arguments for their
1015 /// instrumentation calls.
1018 auto *PreIO =
1020 PreIO->init(IConf, IIRB);
1021 auto *PostIO =
1023 PostIO->init(IConf, IIRB);
1024 }
1025};
1026
1027/// The instrumentation opportunity for load instructions.
1028struct LoadIO : public InstructionIO<Instruction::Load> {
1029 virtual ~LoadIO() {};
1030
1031 /// Construct a load opportunity.
1033
1034 /// The selector of arguments for load opportunities.
1035 ///{
1053
1056 ///}
1057
1058 /// Get the type of the loaded value.
1060 return IIRB.Int64Ty;
1061 }
1062
1063 /// Initialize the load opportunity using the instrumentation config \p IConf
1064 /// and the user config \p UserConfig.
1067 ConfigTy *UserConfig = nullptr);
1068
1069 /// Getters and setters for the arguments of the instrumentation function for
1070 /// the load opportunity.
1071 ///{
1072 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
1073 InstrumentationConfig &IConf,
1075 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
1076 InstrumentationConfig &IConf,
1078 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
1079 InstrumentationConfig &IConf,
1081 LLVM_ABI static Value *getBasePointerInfo(Value &V, Type &Ty,
1082 InstrumentationConfig &IConf,
1084 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
1085 InstrumentationConfig &IConf,
1087 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
1088 InstrumentationConfig &IConf,
1090 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
1091 InstrumentationConfig &IConf,
1093 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
1094 InstrumentationConfig &IConf,
1096 LLVM_ABI static Value *getValueSubTypeId(Value &V, Type &Ty,
1097 InstrumentationConfig &IConf,
1100 InstrumentationConfig &IConf,
1102 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
1103 InstrumentationConfig &IConf,
1105 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1106 InstrumentationConfig &IConf,
1108 ///}
1109
1110 /// Create the load opportunities for PRE and POST positions.
1113 auto *PreIO =
1115 PreIO->init(IConf, IIRB);
1116 auto *PostIO =
1118 PostIO->init(IConf, IIRB);
1119 }
1120};
1121
1122/// The instrumentation opportunity for type cast instructions.
1123/// This includes PtrToInt, IntToPtr, Trunc, ZExt, SExt, FPToUI, FPToSI,
1124/// UIToFP, SIToFP, FPTrunc, FPExt, AddrSpaceCast, and BitCast.
1125struct CastIO final
1126 : public InstructionIO<
1127 Instruction::PtrToInt, Instruction::IntToPtr, Instruction::Trunc,
1128 Instruction::ZExt, Instruction::SExt, Instruction::FPToUI,
1129 Instruction::FPToSI, Instruction::UIToFP, Instruction::SIToFP,
1130 Instruction::FPTrunc, Instruction::FPExt, Instruction::AddrSpaceCast,
1131 Instruction::BitCast> {
1133
1148
1151
1152 StringRef getName() const override { return "cast"; }
1153
1156 ConfigTy *UserConfig = nullptr);
1157
1158 LLVM_ABI static Value *getInput(Value &V, Type &Ty,
1159 InstrumentationConfig &IConf,
1161 LLVM_ABI static Value *getInputTypeId(Value &V, Type &Ty,
1162 InstrumentationConfig &IConf,
1164 LLVM_ABI static Value *getInputSubTypeId(Value &V, Type &Ty,
1165 InstrumentationConfig &IConf,
1167 LLVM_ABI static Value *getInputSize(Value &V, Type &Ty,
1168 InstrumentationConfig &IConf,
1170 LLVM_ABI static Value *getResultTypeId(Value &V, Type &Ty,
1171 InstrumentationConfig &IConf,
1173 LLVM_ABI static Value *getResultSubTypeId(Value &V, Type &Ty,
1174 InstrumentationConfig &IConf,
1176 LLVM_ABI static Value *getResultSize(Value &V, Type &Ty,
1177 InstrumentationConfig &IConf,
1179
1182 auto *PreIO =
1184 PreIO->init(IConf, IIRB);
1185 auto *PostIO =
1187 PostIO->init(IConf, IIRB);
1188 }
1189};
1190
1191/// Instrumentation opportunity for numeric operations. This includes Add, FAdd,
1192/// Sub, FSub, Mul, FMul, UDiv, FDiv, SDiv, URem, SRem, FRem, Shl, LShr, AShr,
1193/// And, Or, Xor, and FNeg.
1194struct NumericIO final
1195 : public InstructionIO<
1196 Instruction::Add, Instruction::FAdd, Instruction::Sub,
1197 Instruction::FSub, Instruction::Mul, Instruction::FMul,
1198 Instruction::UDiv, Instruction::FDiv, Instruction::SDiv,
1199 Instruction::URem, Instruction::SRem, Instruction::FRem,
1200 Instruction::Shl, Instruction::LShr, Instruction::AShr,
1201 Instruction::And, Instruction::Or, Instruction::Xor,
1202 Instruction::FNeg> {
1204
1218
1221
1222 StringRef getName() const override { return "numeric"; }
1223
1226 ConfigTy *UserConfig = nullptr);
1227 LLVM_ABI void addFlagNames();
1228
1229 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1230 InstrumentationConfig &IConf,
1232
1235 auto *PreIO =
1237 PreIO->init(IConf, IIRB);
1238 auto *PostIO =
1240 PostIO->init(IConf, IIRB);
1241 }
1242};
1243
1244struct CompareIO final
1245 : public InstructionIO<Instruction::ICmp, Instruction::FCmp> {
1247
1263
1266
1267 StringRef getName() const override { return "compare"; }
1268
1271 ConfigTy *UserConfig = nullptr);
1272 LLVM_ABI void addFlagNames();
1273
1274 LLVM_ABI static Value *getOperandTypeId(Value &V, Type &Ty,
1275 InstrumentationConfig &IConf,
1277 LLVM_ABI static Value *getOperandSize(Value &V, Type &Ty,
1278 InstrumentationConfig &IConf,
1280 LLVM_ABI static Value *getPredicate(Value &V, Type &Ty,
1281 InstrumentationConfig &IConf,
1283 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1284 InstrumentationConfig &IConf,
1286
1289 auto *PreIO =
1291 PreIO->init(IConf, IIRB);
1292 auto *PostIO =
1294 PostIO->init(IConf, IIRB);
1295 }
1296};
1297
1298} // namespace instrumentor
1299
1300/// The Instrumentor pass.
1301class InstrumentorPass : public RequiredPassInfoMixin<InstrumentorPass> {
1302 using InstrumentationConfig = instrumentor::InstrumentationConfig;
1303 using InstrumentorIRBuilderTy = instrumentor::InstrumentorIRBuilderTy;
1304
1305 /// File system to be used for read operations.
1307
1308 /// The configuration and IR builder provided by the user.
1309 InstrumentationConfig *UserIConf;
1310 InstrumentorIRBuilderTy *UserIIRB;
1311
1312 PreservedAnalyses run(Module &M, InstrumentationConfig &IConf,
1313 InstrumentorIRBuilderTy &IIRB, bool ReadConfig);
1314
1315public:
1316 /// Construct an instrumentor pass that will use the instrumentation
1317 /// configuration \p IC and the IR builder \p IIRB. If an IR builder is not
1318 /// provided, a default builder is used. When the configuration is not
1319 /// provided, it is read from the config file if available and otherwise a
1320 /// default configuration is used.
1322 InstrumentationConfig *IC = nullptr,
1323 InstrumentorIRBuilderTy *IIRB = nullptr);
1324
1326};
1327
1328} // end namespace llvm
1329
1330#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
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:128
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:878
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.
std::unique_ptr< BaseConfigurationOption > InlineRuntimeEagerly
std::unique_ptr< BaseConfigurationOption > RuntimeBitcode
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)
StringMap< int32_t > FlagNames
Flag names and their integer bitmask values.
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.