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,
69 };
70
71 /// Construct an argument.
78
79 /// Whether the argument is enabled and should be passed to the function call.
80 bool Enabled;
81
82 /// The type of the argument.
84
85 /// A string with the name of the argument.
87
88 /// A string with the description of the argument.
90
91 /// The flags that describe the properties of the argument. Multiple flags may
92 /// be specified.
93 unsigned Flags;
94
95 /// The callback for getting the value of the argument.
97
98 /// The callback for consuming the output value of the argument.
100
101 /// Whether the argument value can be cached between the PRE and POST calls.
103};
104
105/// Helper to represent an instrumentation runtime function that is related to
106/// an instrumentation opportunity.
108 /// Construct an instrumentation function description linked to the \p IO
109 /// instrumentation opportunity and \p RetTy return type.
111 Type *RetTy = nullptr);
112
113 /// Create the type of the instrumentation function.
116 const DataLayout &DL,
117 bool ForceIndirection);
118
119 /// Create a call instruction that calls to the instrumentation function and
120 /// passes the corresponding arguments.
123 const DataLayout &DL,
124 InstrumentationCaches &ICaches);
125
126 /// Create a string representation of the function declaration in C. Two
127 /// strings are returned: the function definition with direct arguments and
128 /// the function with any indirect argument.
129 LLVM_ABI std::pair<std::string, std::string>
130 createCSignature(const InstrumentationConfig &IConf) const;
131
132 /// Create a string representation of the function definition in C. The
133 /// function body implements a stub and only prints the passed arguments. Two
134 /// strings are returned: the function definition with direct arguments and
135 /// the function with any indirect argument.
136 LLVM_ABI std::pair<std::string, std::string> createCBodies() const;
137
138 /// Return whether the \p IRTA argument can be replaced.
139 bool isReplacable(IRTArg &IRTA) const {
141 }
142
143 /// Return whether the function may have any indirect argument.
144 bool isPotentiallyIndirect(IRTArg &IRTA) const {
145 return ((IRTA.Flags & IRTArg::POTENTIALLY_INDIRECT) ||
147 }
148
149 /// Whether the function requires indirection in some argument.
151
152 /// Whether any argument may require indirection.
154
155 /// The number of arguments that can be replaced.
156 unsigned NumReplaceableArgs = 0;
157
158 /// The instrumentation opportunity which it is linked to.
160
161 /// The return type of the instrumentation function.
162 Type *RetTy = nullptr;
163};
164
165/// Helper to represent an instrumentation location, which is composed of an
166/// instrumentation opportunity type and a position.
168 /// The supported location kinds, which are composed of a opportunity type and
169 /// position. The PRE position indicates the instrumentation function call is
170 /// inserted before the instrumented event occurs. The POST position indicates
171 /// the instrumentation call is inserted after the event occurs. Some
172 /// opportunity types may only support one position.
187
188 /// Construct an instrumentation location with the given kind.
189 InstrumentationLocation(KindTy Kind) : Kind(Kind) {}
190
191 /// Return the type and position.
192 KindTy getKind() const { return Kind; }
193
194 /// Return the string representation given a location kind. This is the string
195 /// used in the configuration file.
197 switch (Kind) {
198 case MODULE_PRE:
199 return "module_pre";
200 case MODULE_POST:
201 return "module_post";
202 case GLOBAL_PRE:
203 return "global_pre";
204 case GLOBAL_POST:
205 return "global_post";
206 case FUNCTION_PRE:
207 return "function_pre";
208 case FUNCTION_POST:
209 return "function_post";
210 case BASIC_BLOCK_PRE:
211 return "basic_block_pre";
212 case BASIC_BLOCK_POST:
213 return "basic_block_post";
214 case INSTRUCTION_PRE:
215 return "instruction_pre";
216 case INSTRUCTION_POST:
217 return "instruction_post";
218 case SPECIAL_VALUE:
219 return "special_value";
220 }
221 llvm_unreachable("Invalid kind!");
222 }
223
224 /// Return the location kind described by a string.
226 return StringSwitch<KindTy>(S)
227 .Case("module_pre", MODULE_PRE)
228 .Case("module_post", MODULE_POST)
229 .Case("global_pre", GLOBAL_PRE)
230 .Case("global_post", GLOBAL_POST)
231 .Case("function_pre", FUNCTION_PRE)
232 .Case("function_post", FUNCTION_POST)
233 .Case("basic_block_pre", BASIC_BLOCK_PRE)
234 .Case("basic_block_post", BASIC_BLOCK_POST)
235 .Case("instruction_pre", INSTRUCTION_PRE)
236 .Case("instruction_post", INSTRUCTION_POST)
237 .Case("special_value", SPECIAL_VALUE)
238 .Default(Last);
239 }
240
241 /// Return whether a location kind is positioned before the event occurs.
242 static bool isPRE(KindTy Kind) {
243 switch (Kind) {
244 case MODULE_PRE:
245 case GLOBAL_PRE:
246 case FUNCTION_PRE:
247 case BASIC_BLOCK_PRE:
248 case INSTRUCTION_PRE:
249 return true;
250 case MODULE_POST:
251 case GLOBAL_POST:
252 case FUNCTION_POST:
253 case BASIC_BLOCK_POST:
254 case INSTRUCTION_POST:
255 case SPECIAL_VALUE:
256 return false;
257 }
258 llvm_unreachable("Invalid kind!");
259 }
260
261 /// Return whether the instrumentation location is before the event occurs.
262 bool isPRE() const { return isPRE(Kind); }
263
264private:
265 /// The kind (type and position) of the instrumentation location.
266 const KindTy Kind;
267};
268
269/// An option for the base configuration.
271 /// The possible types of options.
276
277 /// Create a boolean option with \p Name name, \p Description description and
278 /// \p DefaultValue as boolean default value.
279 LLVM_ABI static std::unique_ptr<BaseConfigurationOption>
281 StringRef Description, bool DefaultValue);
282
283 /// Create a string option with \p Name name, \p Description description and
284 /// \p DefaultValue as string default value.
285 LLVM_ABI static std::unique_ptr<BaseConfigurationOption>
287 StringRef Description, StringRef DefaultValue);
288
289 /// Helper union that holds any possible option type.
290 union ValueTy {
291 bool Bool;
293 };
294
295 /// Set and get of the boolean value. Only valid if it is a boolean option.
296 ///{
297 void setBool(bool B) {
298 assert(Kind == BOOLEAN && "Not a boolean!");
299 Value.Bool = B;
300 }
301 bool getBool() const {
302 assert(Kind == BOOLEAN && "Not a boolean!");
303 return Value.Bool;
304 }
305 ///}
306
307 /// Set and get the string value. Only valid if it is a boolean option.
308 ///{
310 assert(Kind == STRING && "Not a string!");
311 Value.String = S;
312 }
314 assert(Kind == STRING && "Not a string!");
315 return Value.String;
316 }
317 ///}
318
319 /// The information of the option.
320 ///{
325 ///}
326
327 /// Construct a base configuration option.
330};
331
332/// The class that contains the configuration for the instrumentor. It holds the
333/// information for each instrumented opportunity, including the base
334/// configuration options. Another class may inherit from this one to modify the
335/// default behavior.
338
339 /// Construct an instrumentation configuration with the base options.
341
342 /// Initialize the config to a clean base state without loosing cached values
343 /// that can be reused across configurations.
345 // Clear previous configurations but not the caches.
347 for (auto &Map : IChoices)
348 Map.clear();
349
351 *this, "runtime_prefix", "The runtime API prefix.", "__instrumentor_");
353 *this, "runtime_stubs_file",
354 "The file into which runtime stubs should be written.", "");
356 *this, "target_regex",
357 "Regular expression to be matched against the module target. "
358 "Only targets that match this regex will be instrumented.",
359 "");
361 *this, "function_regex",
362 "Regular expression to be matched against a function name. "
363 "Only functions that match this regex will be instrumented.",
364 "");
366 *this, "demangle_function_names",
367 "Demangle functions names passed to the runtime.", true);
369 *this, "host_enabled", "Instrument non-GPU targets", true);
371 *this, "gpu_enabled", "Instrument GPU targets", true);
372 populate(IIRB);
373 }
374
375 /// Populate the instrumentation opportunities.
376 virtual void populate(InstrumentorIRBuilderTy &IIRB);
377
378 /// Get the runtime prefix for the instrumentation runtime functions.
379 StringRef getRTName() const { return RuntimePrefix->getString(); }
380
381 /// Get the instrumentation function name.
382 std::string getRTName(StringRef Prefix, StringRef Name,
383 StringRef Suffix1 = "", StringRef Suffix2 = "") const {
384 return (getRTName() + Prefix + Name + Suffix1 + Suffix2).str();
385 }
386
387 /// Add the base configuration option \p BCO into the list of base options.
389 BaseConfigurationOptions.push_back(BCO);
390 }
391
392 /// Register instrumentation opportunity \p IO.
393 void addChoice(InstrumentationOpportunity &IO, LLVMContext &Ctx);
394
395 /// Allocate an object of type \p Ty using a bump allocator and construct it
396 /// with the \p Args arguments. The object may not be freed manually.
397 template <typename Ty, typename... ArgsTy>
398 static Ty *allocate(ArgsTy &&...Args) {
400 Ty *Obj = Allocator.Allocate();
401 new (Obj) Ty(std::forward<ArgsTy>(Args)...);
402 return Obj;
403 }
404
405 /// Map to remember underlying objects for pointers.
407
408 /// Map to remember base pointer info for values in a specific function.
410
411 /// Return the base pointer info for \p V.
413
414 /// Mapping to remember global strings passed to the runtime.
416
417 /// Mapping from constants to globals with the constant as initializer.
419
421 Constant *&V = GlobalStringsMap[SS.save(S)];
422 if (!V) {
423 auto &M = *IIRB.IRB.GetInsertBlock()->getModule();
424 V = IIRB.IRB.CreateGlobalString(
425 S, getRTName() + ".str",
426 M.getDataLayout().getDefaultGlobalsAddressSpace(), &M);
427 if (V->getType() != IIRB.IRB.getPtrTy())
428 V = ConstantExpr::getAddrSpaceCast(V, IIRB.IRB.getPtrTy());
429 }
430 return V;
431 }
432 /// The list of enabled base configuration options.
434
435 /// The base configuration options.
436 std::unique_ptr<BaseConfigurationOption> RuntimePrefix;
437 std::unique_ptr<BaseConfigurationOption> RuntimeStubsFile;
438 std::unique_ptr<BaseConfigurationOption> DemangleFunctionNames;
439 std::unique_ptr<BaseConfigurationOption> TargetRegex;
440 std::unique_ptr<BaseConfigurationOption> FunctionRegex;
441 std::unique_ptr<BaseConfigurationOption> HostEnabled;
442 std::unique_ptr<BaseConfigurationOption> GPUEnabled;
443
444 /// The map registered instrumentation opportunities. The map is indexed by
445 /// the instrumentation location kind and then by the opportunity name. Notice
446 /// that an instrumentation location may have more than one instrumentation
447 /// opportunity registered.
451
452 /// Utilities for allocating and building strings.
453 ///{
456 ///}
457};
458
459/// Base class for instrumentation opportunities. All opportunities should
460/// inherit from this class and implement the virtual class members.
463
464 /// Construct an opportunity with location \p IP.
466
467 /// The instrumentation location of the opportunity.
469
470 /// The list of possible arguments for the instrumentation runtime function.
471 /// The order within the array determines the order of arguments. Arguments
472 /// may be disabled and will not be passed to the function call.
474
475 /// Whether the opportunity is enabled.
476 bool Enabled = true;
477
478 /// A filter expression to be matched against runtime property values. If the
479 /// filter is non-empty, only instrumentations matching the filter will be
480 /// executed. The filter syntax supports:
481 /// - Integer comparisons: ==, !=, <, >, <=, >=
482 /// - String comparisons: ==, != (with quoted strings)
483 /// - String prefix check: startswith("prefix")
484 /// - Logical operators: &&, ||
485 /// Examples:
486 /// "sync_scope_id==3 && atomicity_ordering>0"
487 /// "name==\"foo\" || name.startswith(\"test_\")"
488 /// If a property value is dynamic (not a constant), the filter is assumed to
489 /// pass (true).
491
492 /// Helpers to cast values, pass them to the runtime, and replace them. To be
493 /// used as part of the getter/setter of a InstrumentationOpportunity.
494 ///{
495 LLVM_ABI static Value *forceCast(Value &V, Type &Ty,
499 return forceCast(V, Ty, IIRB);
500 }
501 LLVM_ABI static Value *replaceValue(Value &V, Value &NewV,
504 ///}
505
506 /// Instrument the value \p V using the configuration \p IConf, and
507 /// potentially, the caches \p ICaches.
508 virtual Value *instrument(Value *&V, bool &Changed,
511 InstrumentationCaches &ICaches) {
512 if (CB && !CB(*V))
513 return nullptr;
514
515 // Check if the filter matches before instrumenting
516 if (!evaluateFilter(*V, Changed, *this, IConf, IIRB))
517 return nullptr;
518
519 Changed = true;
520 const DataLayout &DL = IIRB.IRB.GetInsertBlock()->getDataLayout();
521 IRTCallDescription IRTCallDesc(*this, getRetTy(V->getContext()));
522 auto *CI = IRTCallDesc.createLLVMCall(V, IConf, IIRB, DL, ICaches);
523 return CI;
524 }
525
526 /// Get the return type for the instrumentation runtime function.
527 virtual Type *getRetTy(LLVMContext &Ctx) const { return nullptr; }
528
529 /// Get the name of the instrumentation opportunity.
530 virtual StringRef getName() const = 0;
531
532 /// Get all opcodes for this instrumentation opportunity. For non-instruction
533 /// opportunities, returns an empty array. For instruction opportunities,
534 /// returns an array of all opcodes this IO handles.
535 virtual ArrayRef<unsigned> getAllOpcodes() const { return {}; }
536
537 /// Get the location kind of the instrumentation opportunity.
539 return IP.getKind();
540 }
541
542 /// An optional callback that takes the value that is about to be
543 /// instrumented and can return false if it should be skipped.
544 ///{
545 using CallbackTy = std::function<bool(Value &)>;
546 CallbackTy CB = nullptr;
547 ///}
548
549 /// Add arguments available in all instrumentation opportunities.
551 bool PassId) {
552 const auto CB = IP.isPRE() ? getIdPre : getIdPost;
553 if (PassId) {
554 IRTArgs.push_back(
556 "A unique ID associated with the given instrumentor call",
557 IRTArg::NONE, CB, nullptr, true, true));
558 }
559 }
560
561 /// Get the opportunity identifier for the pre and post positions.
562 ///{
563 LLVM_ABI static Value *getIdPre(Value &V, Type &Ty,
566 LLVM_ABI static Value *getIdPost(Value &V, Type &Ty,
569 ///}
570
571 /// Compute the opportunity identifier for the current instrumentation epoch
572 /// \p CurrentEpoch. The identifiers are assigned consecutively as the epoch
573 /// advances. Epochs may have no identifier assigned (e.g., because no id was
574 /// requested). This function always returns the same identifier when called
575 /// multiple times with the same epoch.
576 static int32_t getIdFromEpoch(uint32_t CurrentEpoch) {
577 static DenseMap<uint32_t, int32_t> EpochIdMap;
578 static int32_t GlobalId = 0;
579 int32_t &EpochId = EpochIdMap[CurrentEpoch];
580 if (EpochId == 0)
581 EpochId = ++GlobalId;
582 return EpochId;
583 }
584};
585
586/// The base instrumentation opportunity class for instruction opportunities.
587/// Each instruction opportunity should inherit from this class and implement
588/// the virtual class members. If multiple opcodes are provided, all of them
589/// are instrumented using the same logic, and a name must be explicitly
590/// provided by overriding getName().
591template <unsigned... Opcodes>
593 virtual ~InstructionIO() {}
594
595 /// Construct an instruction opportunity.
598 static_assert(sizeof...(Opcodes) >= 1,
599 "InstructionIO must have at least one opcode");
600 }
601
602 static constexpr std::array<unsigned, sizeof...(Opcodes)> OpcodesArray = {
603 Opcodes...};
604
605 /// Get all opcodes for this instrumentation opportunity (override).
606 ArrayRef<unsigned> getAllOpcodes() const override { return OpcodesArray; }
607
608 /// Get the number of opcodes.
609 static constexpr size_t getNumOpcodes() { return OpcodesArray.size(); }
610
611 /// Get the name of the instruction. For single-opcode IOs, this defaults to
612 /// the opcode name. For multi-opcode IOs, getName() MUST be overridden to
613 /// provide an explicit name identifying the whole group of opcodes.
614 virtual StringRef getName() const override {
615 // This method should not be called for multi-opcode IOs.
616 // Multi-opcode IOs must override getName().
617 assert(sizeof...(Opcodes) == 1 &&
618 "Multi-opcode InstructionIO must override getName() to provide an "
619 "explicit name instead of using the first opcode");
620 // Get the first opcode from the opcodes array.
622 }
623};
624
625/// The instrumentation opportunity for functions.
629
640
641 struct ConfigTy final : public BaseConfigTy<ConfigKind> {
642 std::function<bool(Argument &)> ArgFilter;
643
646
647 StringRef getName() const override { return "function"; }
648
651 ConfigTy *UserConfig = nullptr);
652
656 LLVM_ABI static Value *getFunctionName(Value &V, Type &Ty,
667 LLVM_ABI static Value *isMainFunction(Value &V, Type &Ty,
670
671 static void populate(InstrumentationConfig &IConf,
673 auto *PreIO =
675 PreIO->init(IConf, IIRB);
676 auto *PostIO =
678 PostIO->init(IConf, IIRB);
679 }
680};
681
682/// The instrumentation opportunity for alloca instructions.
683struct AllocaIO final : public InstructionIO<Instruction::Alloca> {
685
695
698
701 ConfigTy *UserConfig = nullptr);
702
703 LLVM_ABI static Value *getSize(Value &V, Type &Ty,
706 LLVM_ABI static Value *setSize(Value &V, Value &NewV,
709 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
712
713 static void populate(InstrumentationConfig &IConf,
715 auto *PreIO =
717 PreIO->init(IConf, IIRB);
718 auto *PostIO =
720 PostIO->init(IConf, IIRB);
721 }
722};
723
724struct UnreachableIO final : public InstructionIO<Instruction::Unreachable> {
726 : InstructionIO<Instruction::Unreachable>(
727 InstrumentationLocation::INSTRUCTION_PRE) {}
728
733
736
739 ConfigTy *UserConfig = nullptr);
740
741 static void populate(InstrumentationConfig &IConf,
743 auto *PreIO = IConf.allocate<UnreachableIO>();
744 PreIO->init(IConf, IIRB);
745 }
746};
747
748// Special instrumentation opportunity for base pointers of memory operations.
753 virtual ~BasePointerIO() {};
754
761
764
765 StringRef getName() const override { return "base_pointer_info"; }
766
769 ConfigTy *UserConfig = nullptr);
770
771 LLVM_ABI static Value *getPointerKind(Value &V, Type &Ty,
774
775 /// This is necessary to produce a return value that can be used by other IOs.
776 /// No replacement is actually happening.
777 static Value *setValueNoop(Value &V, Value &NewV,
780 return &NewV;
781 }
782
783 static void populate(InstrumentationConfig &IConf,
785 auto *BPIO = IConf.allocate<BasePointerIO>();
786 BPIO->init(IConf, IIRB);
787 }
788};
789
790// Module instrumentation opportunity.
794
801
804
805 StringRef getName() const override { return "module"; }
806
809 ConfigTy *UserConfig = nullptr);
810
811 LLVM_ABI static Value *getModuleName(Value &V, Type &Ty,
814 LLVM_ABI static Value *getTargetTriple(Value &V, Type &Ty,
817
818 static void populate(InstrumentationConfig &IConf,
821 PreIO->init(IConf, IIRB);
822 auto *PostIO =
824 PostIO->init(IConf, IIRB);
825 }
826};
827
828// Global variable instrumentation opportunity.
832
846
849
850 StringRef getName() const override { return "global"; }
851
854 ConfigTy *UserConfig = nullptr);
855
856 LLVM_ABI static Value *getAddress(Value &V, Type &Ty,
859 LLVM_ABI static Value *setAddress(Value &V, Value &NewV,
862 LLVM_ABI static Value *getAS(Value &V, Type &Ty, InstrumentationConfig &IConf,
864 LLVM_ABI static Value *getDeclaredSize(Value &V, Type &Ty,
867 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
870 LLVM_ABI static Value *getSymbolName(Value &V, Type &Ty,
873 LLVM_ABI static Value *getInitialValue(Value &V, Type &Ty,
876 LLVM_ABI static Value *isConstant(Value &V, Type &Ty,
879 LLVM_ABI static Value *isDefinition(Value &V, Type &Ty,
882
883 static void populate(InstrumentationConfig &IConf,
885 auto *PreIO =
887 PreIO->init(IConf, IIRB);
888 auto *PostIO =
890 PostIO->init(IConf, IIRB);
891 }
892};
893
894/// The instrumentation opportunity for store instructions.
895struct StoreIO : public InstructionIO<Instruction::Store> {
896 virtual ~StoreIO() {};
897
898 /// Construct a store instruction opportunity.
900
901 /// The selector of arguments for store opportunities.
902 ///{
918
921 ///}
922
923 /// Get the type of the stored value.
925 return IIRB.Int64Ty;
926 }
927
928 /// Initialize the store opportunity using the instrumentation config \p IConf
929 /// and the user config \p UserConfig.
932 ConfigTy *UserConfig = nullptr);
933
934 /// Getters and setters for the arguments of the instrumentation function for
935 /// the store opportunity.
936 ///{
937 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
940 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
943 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
949 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
952 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
955 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
958 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
964 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
967 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
970 ///}
971
972 /// Create the store opportunities for pre and post positions. The
973 /// opportunities are also initialized with the arguments for their
974 /// instrumentation calls.
975 static void populate(InstrumentationConfig &IConf,
977 auto *PreIO =
979 PreIO->init(IConf, IIRB);
980 auto *PostIO =
982 PostIO->init(IConf, IIRB);
983 }
984};
985
986/// The instrumentation opportunity for load instructions.
987struct LoadIO : public InstructionIO<Instruction::Load> {
988 virtual ~LoadIO() {};
989
990 /// Construct a load opportunity.
992
993 /// The selector of arguments for load opportunities.
994 ///{
1011
1014 ///}
1015
1016 /// Get the type of the loaded value.
1018 return IIRB.Int64Ty;
1019 }
1020
1021 /// Initialize the load opportunity using the instrumentation config \p IConf
1022 /// and the user config \p UserConfig.
1025 ConfigTy *UserConfig = nullptr);
1026
1027 /// Getters and setters for the arguments of the instrumentation function for
1028 /// the load opportunity.
1029 ///{
1030 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
1031 InstrumentationConfig &IConf,
1033 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
1034 InstrumentationConfig &IConf,
1036 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
1037 InstrumentationConfig &IConf,
1039 LLVM_ABI static Value *getBasePointerInfo(Value &V, Type &Ty,
1040 InstrumentationConfig &IConf,
1042 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
1043 InstrumentationConfig &IConf,
1045 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
1046 InstrumentationConfig &IConf,
1048 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
1049 InstrumentationConfig &IConf,
1051 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
1052 InstrumentationConfig &IConf,
1055 InstrumentationConfig &IConf,
1057 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
1058 InstrumentationConfig &IConf,
1060 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1061 InstrumentationConfig &IConf,
1063 ///}
1064
1065 /// Create the load opportunities for PRE and POST positions.
1068 auto *PreIO =
1070 PreIO->init(IConf, IIRB);
1071 auto *PostIO =
1073 PostIO->init(IConf, IIRB);
1074 }
1075};
1076
1077/// The instrumentation opportunity for type cast instructions.
1078/// This includes PtrToInt, IntToPtr, Trunc, ZExt, SExt, FPToUI, FPToSI,
1079/// UIToFP, SIToFP, FPTrunc, FPExt, AddrSpaceCast, and BitCast.
1080struct CastIO final
1081 : public InstructionIO<
1082 Instruction::PtrToInt, Instruction::IntToPtr, Instruction::Trunc,
1083 Instruction::ZExt, Instruction::SExt, Instruction::FPToUI,
1084 Instruction::FPToSI, Instruction::UIToFP, Instruction::SIToFP,
1085 Instruction::FPTrunc, Instruction::FPExt, Instruction::AddrSpaceCast,
1086 Instruction::BitCast> {
1088
1101
1104
1105 StringRef getName() const override { return "cast"; }
1106
1109 ConfigTy *UserConfig = nullptr);
1110
1111 LLVM_ABI static Value *getInput(Value &V, Type &Ty,
1112 InstrumentationConfig &IConf,
1114 LLVM_ABI static Value *getInputTypeId(Value &V, Type &Ty,
1115 InstrumentationConfig &IConf,
1117 LLVM_ABI static Value *getInputSize(Value &V, Type &Ty,
1118 InstrumentationConfig &IConf,
1120 LLVM_ABI static Value *getResultTypeId(Value &V, Type &Ty,
1121 InstrumentationConfig &IConf,
1123 LLVM_ABI static Value *getResultSize(Value &V, Type &Ty,
1124 InstrumentationConfig &IConf,
1126
1129 auto *PreIO =
1131 PreIO->init(IConf, IIRB);
1132 auto *PostIO =
1134 PostIO->init(IConf, IIRB);
1135 }
1136};
1137
1138/// Instrumentation opportunity for numeric operations. This includes Add, FAdd,
1139/// Sub, FSub, Mul, FMul, UDiv, FDiv, SDiv, URem, SRem, FRem, Shl, LShr, AShr,
1140/// And, Or, Xor, and FNeg.
1141struct NumericIO final
1142 : public InstructionIO<
1143 Instruction::Add, Instruction::FAdd, Instruction::Sub,
1144 Instruction::FSub, Instruction::Mul, Instruction::FMul,
1145 Instruction::UDiv, Instruction::FDiv, Instruction::SDiv,
1146 Instruction::URem, Instruction::SRem, Instruction::FRem,
1147 Instruction::Shl, Instruction::LShr, Instruction::AShr,
1148 Instruction::And, Instruction::Or, Instruction::Xor,
1149 Instruction::FNeg> {
1151
1164
1167
1168 StringRef getName() const override { return "numeric"; }
1169
1172 ConfigTy *UserConfig = nullptr);
1173
1174 LLVM_ABI static Value *getLeft(Value &V, Type &Ty,
1175 InstrumentationConfig &IConf,
1177 LLVM_ABI static Value *getRight(Value &V, Type &Ty,
1178 InstrumentationConfig &IConf,
1180 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1181 InstrumentationConfig &IConf,
1183
1186 auto *PreIO =
1188 PreIO->init(IConf, IIRB);
1189 auto *PostIO =
1191 PostIO->init(IConf, IIRB);
1192 }
1193};
1194
1195} // namespace instrumentor
1196
1197/// The Instrumentor pass.
1198class InstrumentorPass : public RequiredPassInfoMixin<InstrumentorPass> {
1199 using InstrumentationConfig = instrumentor::InstrumentationConfig;
1200 using InstrumentorIRBuilderTy = instrumentor::InstrumentorIRBuilderTy;
1201
1202 /// File system to be used for read operations.
1204
1205 /// The configuration and IR builder provided by the user.
1206 InstrumentationConfig *UserIConf;
1207 InstrumentorIRBuilderTy *UserIIRB;
1208
1209 PreservedAnalyses run(Module &M, InstrumentationConfig &IConf,
1210 InstrumentorIRBuilderTy &IIRB, bool ReadConfig);
1211
1212public:
1213 /// Construct an instrumentor pass that will use the instrumentation
1214 /// configuration \p IC and the IR builder \p IIRB. If an IR builder is not
1215 /// provided, a default builder is used. When the configuration is not
1216 /// provided, it is read from the config file if available and otherwise a
1217 /// default configuration is used.
1219 InstrumentationConfig *IC = nullptr,
1220 InstrumentorIRBuilderTy *IIRB = nullptr);
1221
1223};
1224
1225} // end namespace llvm
1226
1227#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:213
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:390
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:1916
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
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 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 * getInput(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.
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 * 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)
static LLVM_ABI Value * getLeft(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
}
static LLVM_ABI Value * getRight(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
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)
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.