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);
373 populate(IIRB);
374 }
375
376 /// Populate the instrumentation opportunities.
377 virtual void populate(InstrumentorIRBuilderTy &IIRB);
378
379 /// Get the runtime prefix for the instrumentation runtime functions.
380 StringRef getRTName() const { return RuntimePrefix->getString(); }
381
382 /// Get the instrumentation function name.
383 std::string getRTName(StringRef Prefix, StringRef Name,
384 StringRef Suffix1 = "", StringRef Suffix2 = "") const {
385 return (getRTName() + Prefix + Name + Suffix1 + Suffix2).str();
386 }
387
388 /// Add the base configuration option \p BCO into the list of base options.
390 BaseConfigurationOptions.push_back(BCO);
391 }
392
393 /// Register instrumentation opportunity \p IO.
394 void addChoice(InstrumentationOpportunity &IO, LLVMContext &Ctx);
395
396 /// Allocate an object of type \p Ty using a bump allocator and construct it
397 /// with the \p Args arguments. The object may not be freed manually.
398 template <typename Ty, typename... ArgsTy>
399 static Ty *allocate(ArgsTy &&...Args) {
401 Ty *Obj = Allocator.Allocate();
402 new (Obj) Ty(std::forward<ArgsTy>(Args)...);
403 return Obj;
404 }
405
406 /// Map to remember underlying objects for pointers.
408
409 /// Map to remember base pointer info for values in a specific function.
411
412 /// Return the base pointer info for \p V.
414
415 /// Mapping to remember global strings passed to the runtime.
417
418 /// Mapping from constants to globals with the constant as initializer.
420
422 Constant *&V = GlobalStringsMap[SS.save(S)];
423 if (!V) {
424 auto &M = *IIRB.IRB.GetInsertBlock()->getModule();
425 V = IIRB.IRB.CreateGlobalString(
426 S, getRTName() + ".str",
427 M.getDataLayout().getDefaultGlobalsAddressSpace(), &M);
428 if (V->getType() != IIRB.IRB.getPtrTy())
429 V = ConstantExpr::getAddrSpaceCast(V, IIRB.IRB.getPtrTy());
430 }
431 return V;
432 }
433 /// The list of enabled base configuration options.
435
436 /// The base configuration options.
437 std::unique_ptr<BaseConfigurationOption> RuntimePrefix;
438 std::unique_ptr<BaseConfigurationOption> RuntimeStubsFile;
439 std::unique_ptr<BaseConfigurationOption> DemangleFunctionNames;
440 std::unique_ptr<BaseConfigurationOption> TargetRegex;
441 std::unique_ptr<BaseConfigurationOption> FunctionRegex;
442 std::unique_ptr<BaseConfigurationOption> HostEnabled;
443 std::unique_ptr<BaseConfigurationOption> GPUEnabled;
444
445 /// The map registered instrumentation opportunities. The map is indexed by
446 /// the instrumentation location kind and then by the opportunity name. Notice
447 /// that an instrumentation location may have more than one instrumentation
448 /// opportunity registered.
452
453 /// Utilities for allocating and building strings.
454 ///{
457 ///}
458};
459
460/// Base class for instrumentation opportunities. All opportunities should
461/// inherit from this class and implement the virtual class members.
464
465 /// Construct an opportunity with location \p IP.
467
468 /// The instrumentation location of the opportunity.
470
471 /// The list of possible arguments for the instrumentation runtime function.
472 /// The order within the array determines the order of arguments. Arguments
473 /// may be disabled and will not be passed to the function call.
475
476 /// Flag names and their integer bitmask values.
478
479 /// Whether the opportunity is enabled.
480 bool Enabled = true;
481
482 /// A filter expression to be matched against runtime property values. If the
483 /// filter is non-empty, only instrumentations matching the filter will be
484 /// executed. The filter syntax supports:
485 /// - Integer comparisons: ==, !=, <, >, <=, >=
486 /// - String comparisons: ==, != (with quoted strings)
487 /// - String prefix check: startswith("prefix")
488 /// - Logical operators: &&, ||
489 /// Examples:
490 /// "sync_scope_id==3 && atomicity_ordering>0"
491 /// "name==\"foo\" || name.startswith(\"test_\")"
492 /// If a property value is dynamic (not a constant), the filter is assumed to
493 /// pass (true).
495
496 /// Helpers to cast values, pass them to the runtime, and replace them. To be
497 /// used as part of the getter/setter of a InstrumentationOpportunity.
498 ///{
499 LLVM_ABI static Value *forceCast(Value &V, Type &Ty,
503 return forceCast(V, Ty, IIRB);
504 }
505 LLVM_ABI static Value *replaceValue(Value &V, Value &NewV,
508 ///}
509
510 /// Instrument the value \p V using the configuration \p IConf, and
511 /// potentially, the caches \p ICaches.
512 virtual Value *instrument(Value *&V, bool &Changed,
515 InstrumentationCaches &ICaches) {
516 if (CB && !CB(*V))
517 return nullptr;
518
519 // Check if the filter matches before instrumenting
520 if (!evaluateFilter(*V, Changed, *this, IConf, IIRB))
521 return nullptr;
522
523 Changed = true;
524 const DataLayout &DL = IIRB.IRB.GetInsertBlock()->getDataLayout();
525 IRTCallDescription IRTCallDesc(*this, getRetTy(V->getContext()));
526 auto *CI = IRTCallDesc.createLLVMCall(V, IConf, IIRB, DL, ICaches);
527 return CI;
528 }
529
530 /// Get the return type for the instrumentation runtime function.
531 virtual Type *getRetTy(LLVMContext &Ctx) const { return nullptr; }
532
533 /// Get the name of the instrumentation opportunity.
534 virtual StringRef getName() const = 0;
535
536 /// Get all opcodes for this instrumentation opportunity. For non-instruction
537 /// opportunities, returns an empty array. For instruction opportunities,
538 /// returns an array of all opcodes this IO handles.
539 virtual ArrayRef<unsigned> getAllOpcodes() const { return {}; }
540
541 /// Get the location kind of the instrumentation opportunity.
543 return IP.getKind();
544 }
545
546 /// An optional callback that takes the value that is about to be
547 /// instrumented and can return false if it should be skipped.
548 ///{
549 using CallbackTy = std::function<bool(Value &)>;
550 CallbackTy CB = nullptr;
551 ///}
552
553 /// Add arguments available in all instrumentation opportunities.
555 bool PassId) {
556 const auto CB = IP.isPRE() ? getIdPre : getIdPost;
557 if (PassId) {
558 IRTArgs.push_back(
560 "A unique ID associated with the given instrumentor call",
561 IRTArg::NONE, CB, nullptr, true, true));
562 }
563 }
564
565 /// Get the opportunity identifier for the pre and post positions.
566 ///{
567 LLVM_ABI static Value *getIdPre(Value &V, Type &Ty,
570 LLVM_ABI static Value *getIdPost(Value &V, Type &Ty,
573 ///}
574
575 /// Compute the opportunity identifier for the current instrumentation epoch
576 /// \p CurrentEpoch. The identifiers are assigned consecutively as the epoch
577 /// advances. Epochs may have no identifier assigned (e.g., because no id was
578 /// requested). This function always returns the same identifier when called
579 /// multiple times with the same epoch.
580 static int32_t getIdFromEpoch(uint32_t CurrentEpoch) {
581 static DenseMap<uint32_t, int32_t> EpochIdMap;
582 static int32_t GlobalId = 0;
583 int32_t &EpochId = EpochIdMap[CurrentEpoch];
584 if (EpochId == 0)
585 EpochId = ++GlobalId;
586 return EpochId;
587 }
588};
589
590/// The base class that implements basic logic for any instruction
591/// instrumentation opportunity that inherits from InstructionIO.
617
618/// The common instrumentation opportunity class for instruction opportunities.
619/// Each instruction opportunity should inherit from this class and implement
620/// the virtual class members. If multiple opcodes are provided, all of them
621/// are instrumented using the same logic, and a name must be explicitly
622/// provided by overriding getName().
623template <unsigned... Opcodes> struct InstructionIO : public BaseInstructionIO {
624 virtual ~InstructionIO() {}
625
626 /// Construct an instruction opportunity.
628 : BaseInstructionIO(Kind) {
629 static_assert(sizeof...(Opcodes) >= 1,
630 "InstructionIO must have at least one opcode");
631 }
632
633 static constexpr std::array<unsigned, sizeof...(Opcodes)> OpcodesArray = {
634 Opcodes...};
635
636 /// Get all opcodes for this instrumentation opportunity (override).
637 ArrayRef<unsigned> getAllOpcodes() const override { return OpcodesArray; }
638
639 /// Get the number of opcodes.
640 static constexpr size_t getNumOpcodes() { return OpcodesArray.size(); }
641
642 /// Get the name of the instruction. For single-opcode IOs, this defaults to
643 /// the opcode name. For multi-opcode IOs, getName() MUST be overridden to
644 /// provide an explicit name identifying the whole group of opcodes.
645 virtual StringRef getName() const override {
646 // This method should not be called for multi-opcode IOs.
647 // Multi-opcode IOs must override getName().
648 assert(sizeof...(Opcodes) == 1 &&
649 "Multi-opcode InstructionIO must override getName() to provide an "
650 "explicit name instead of using the first opcode");
651 // Get the first opcode from the opcodes array.
653 }
654};
655
656/// The instrumentation opportunity for functions.
660
671
672 struct ConfigTy final : public BaseConfigTy<ConfigKind> {
673 std::function<bool(Argument &)> ArgFilter;
674
677
678 StringRef getName() const override { return "function"; }
679
682 ConfigTy *UserConfig = nullptr);
683
687 LLVM_ABI static Value *getFunctionName(Value &V, Type &Ty,
698 LLVM_ABI static Value *isMainFunction(Value &V, Type &Ty,
701
702 static void populate(InstrumentationConfig &IConf,
704 auto *PreIO =
706 PreIO->init(IConf, IIRB);
707 auto *PostIO =
709 PostIO->init(IConf, IIRB);
710 }
711};
712
713/// The instrumentation opportunity for alloca instructions.
714struct AllocaIO final : public InstructionIO<Instruction::Alloca> {
716
726
729
732 ConfigTy *UserConfig = nullptr);
733
734 LLVM_ABI static Value *getSize(Value &V, Type &Ty,
737 LLVM_ABI static Value *setSize(Value &V, Value &NewV,
740 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
743
744 static void populate(InstrumentationConfig &IConf,
746 auto *PreIO =
748 PreIO->init(IConf, IIRB);
749 auto *PostIO =
751 PostIO->init(IConf, IIRB);
752 }
753};
754
755struct UnreachableIO final : public InstructionIO<Instruction::Unreachable> {
757 : InstructionIO<Instruction::Unreachable>(
758 InstrumentationLocation::INSTRUCTION_PRE) {}
759
764
767
770 ConfigTy *UserConfig = nullptr);
771
772 static void populate(InstrumentationConfig &IConf,
774 auto *PreIO = IConf.allocate<UnreachableIO>();
775 PreIO->init(IConf, IIRB);
776 }
777};
778
779// Special instrumentation opportunity for base pointers of memory operations.
784 virtual ~BasePointerIO() {};
785
792
795
796 StringRef getName() const override { return "base_pointer_info"; }
797
800 ConfigTy *UserConfig = nullptr);
801
802 LLVM_ABI static Value *getPointerKind(Value &V, Type &Ty,
805
806 /// This is necessary to produce a return value that can be used by other IOs.
807 /// No replacement is actually happening.
808 static Value *setValueNoop(Value &V, Value &NewV,
811 return &NewV;
812 }
813
814 static void populate(InstrumentationConfig &IConf,
816 auto *BPIO = IConf.allocate<BasePointerIO>();
817 BPIO->init(IConf, IIRB);
818 }
819};
820
821// Module instrumentation opportunity.
825
832
835
836 StringRef getName() const override { return "module"; }
837
840 ConfigTy *UserConfig = nullptr);
841
842 LLVM_ABI static Value *getModuleName(Value &V, Type &Ty,
845 LLVM_ABI static Value *getTargetTriple(Value &V, Type &Ty,
848
849 static void populate(InstrumentationConfig &IConf,
852 PreIO->init(IConf, IIRB);
853 auto *PostIO =
855 PostIO->init(IConf, IIRB);
856 }
857};
858
859// Global variable instrumentation opportunity.
863
877
880
881 StringRef getName() const override { return "global"; }
882
885 ConfigTy *UserConfig = nullptr);
886
887 LLVM_ABI static Value *getAddress(Value &V, Type &Ty,
890 LLVM_ABI static Value *setAddress(Value &V, Value &NewV,
893 LLVM_ABI static Value *getAS(Value &V, Type &Ty, InstrumentationConfig &IConf,
895 LLVM_ABI static Value *getDeclaredSize(Value &V, Type &Ty,
898 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
901 LLVM_ABI static Value *getSymbolName(Value &V, Type &Ty,
904 LLVM_ABI static Value *getInitialValue(Value &V, Type &Ty,
907 LLVM_ABI static Value *isConstant(Value &V, Type &Ty,
910 LLVM_ABI static Value *isDefinition(Value &V, Type &Ty,
913
914 static void populate(InstrumentationConfig &IConf,
916 auto *PreIO =
918 PreIO->init(IConf, IIRB);
919 auto *PostIO =
921 PostIO->init(IConf, IIRB);
922 }
923};
924
925/// The instrumentation opportunity for store instructions.
926struct StoreIO : public InstructionIO<Instruction::Store> {
927 virtual ~StoreIO() {};
928
929 /// Construct a store instruction opportunity.
931
932 /// The selector of arguments for store opportunities.
933 ///{
950
953 ///}
954
955 /// Get the type of the stored value.
957 return IIRB.Int64Ty;
958 }
959
960 /// Initialize the store opportunity using the instrumentation config \p IConf
961 /// and the user config \p UserConfig.
964 ConfigTy *UserConfig = nullptr);
965
966 /// Getters and setters for the arguments of the instrumentation function for
967 /// the store opportunity.
968 ///{
969 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
972 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
975 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
981 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
984 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
987 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
990 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
993 LLVM_ABI static Value *getValueSubTypeId(Value &V, Type &Ty,
999 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
1000 InstrumentationConfig &IConf,
1002 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1003 InstrumentationConfig &IConf,
1005 ///}
1006
1007 /// Create the store opportunities for pre and post positions. The
1008 /// opportunities are also initialized with the arguments for their
1009 /// instrumentation calls.
1012 auto *PreIO =
1014 PreIO->init(IConf, IIRB);
1015 auto *PostIO =
1017 PostIO->init(IConf, IIRB);
1018 }
1019};
1020
1021/// The instrumentation opportunity for load instructions.
1022struct LoadIO : public InstructionIO<Instruction::Load> {
1023 virtual ~LoadIO() {};
1024
1025 /// Construct a load opportunity.
1027
1028 /// The selector of arguments for load opportunities.
1029 ///{
1047
1050 ///}
1051
1052 /// Get the type of the loaded value.
1054 return IIRB.Int64Ty;
1055 }
1056
1057 /// Initialize the load opportunity using the instrumentation config \p IConf
1058 /// and the user config \p UserConfig.
1061 ConfigTy *UserConfig = nullptr);
1062
1063 /// Getters and setters for the arguments of the instrumentation function for
1064 /// the load opportunity.
1065 ///{
1066 LLVM_ABI static Value *getPointer(Value &V, Type &Ty,
1067 InstrumentationConfig &IConf,
1069 LLVM_ABI static Value *setPointer(Value &V, Value &NewV,
1070 InstrumentationConfig &IConf,
1072 LLVM_ABI static Value *getPointerAS(Value &V, Type &Ty,
1073 InstrumentationConfig &IConf,
1075 LLVM_ABI static Value *getBasePointerInfo(Value &V, Type &Ty,
1076 InstrumentationConfig &IConf,
1078 LLVM_ABI static Value *getValue(Value &V, Type &Ty,
1079 InstrumentationConfig &IConf,
1081 LLVM_ABI static Value *getValueSize(Value &V, Type &Ty,
1082 InstrumentationConfig &IConf,
1084 LLVM_ABI static Value *getAlignment(Value &V, Type &Ty,
1085 InstrumentationConfig &IConf,
1087 LLVM_ABI static Value *getValueTypeId(Value &V, Type &Ty,
1088 InstrumentationConfig &IConf,
1090 LLVM_ABI static Value *getValueSubTypeId(Value &V, Type &Ty,
1091 InstrumentationConfig &IConf,
1094 InstrumentationConfig &IConf,
1096 LLVM_ABI static Value *getSyncScopeId(Value &V, Type &Ty,
1097 InstrumentationConfig &IConf,
1099 LLVM_ABI static Value *isVolatile(Value &V, Type &Ty,
1100 InstrumentationConfig &IConf,
1102 ///}
1103
1104 /// Create the load opportunities for PRE and POST positions.
1107 auto *PreIO =
1109 PreIO->init(IConf, IIRB);
1110 auto *PostIO =
1112 PostIO->init(IConf, IIRB);
1113 }
1114};
1115
1116/// The instrumentation opportunity for type cast instructions.
1117/// This includes PtrToInt, IntToPtr, Trunc, ZExt, SExt, FPToUI, FPToSI,
1118/// UIToFP, SIToFP, FPTrunc, FPExt, AddrSpaceCast, and BitCast.
1119struct CastIO final
1120 : public InstructionIO<
1121 Instruction::PtrToInt, Instruction::IntToPtr, Instruction::Trunc,
1122 Instruction::ZExt, Instruction::SExt, Instruction::FPToUI,
1123 Instruction::FPToSI, Instruction::UIToFP, Instruction::SIToFP,
1124 Instruction::FPTrunc, Instruction::FPExt, Instruction::AddrSpaceCast,
1125 Instruction::BitCast> {
1127
1142
1145
1146 StringRef getName() const override { return "cast"; }
1147
1150 ConfigTy *UserConfig = nullptr);
1151
1152 LLVM_ABI static Value *getInput(Value &V, Type &Ty,
1153 InstrumentationConfig &IConf,
1155 LLVM_ABI static Value *getInputTypeId(Value &V, Type &Ty,
1156 InstrumentationConfig &IConf,
1158 LLVM_ABI static Value *getInputSubTypeId(Value &V, Type &Ty,
1159 InstrumentationConfig &IConf,
1161 LLVM_ABI static Value *getInputSize(Value &V, Type &Ty,
1162 InstrumentationConfig &IConf,
1164 LLVM_ABI static Value *getResultTypeId(Value &V, Type &Ty,
1165 InstrumentationConfig &IConf,
1167 LLVM_ABI static Value *getResultSubTypeId(Value &V, Type &Ty,
1168 InstrumentationConfig &IConf,
1170 LLVM_ABI static Value *getResultSize(Value &V, Type &Ty,
1171 InstrumentationConfig &IConf,
1173
1176 auto *PreIO =
1178 PreIO->init(IConf, IIRB);
1179 auto *PostIO =
1181 PostIO->init(IConf, IIRB);
1182 }
1183};
1184
1185/// Instrumentation opportunity for numeric operations. This includes Add, FAdd,
1186/// Sub, FSub, Mul, FMul, UDiv, FDiv, SDiv, URem, SRem, FRem, Shl, LShr, AShr,
1187/// And, Or, Xor, and FNeg.
1188struct NumericIO final
1189 : public InstructionIO<
1190 Instruction::Add, Instruction::FAdd, Instruction::Sub,
1191 Instruction::FSub, Instruction::Mul, Instruction::FMul,
1192 Instruction::UDiv, Instruction::FDiv, Instruction::SDiv,
1193 Instruction::URem, Instruction::SRem, Instruction::FRem,
1194 Instruction::Shl, Instruction::LShr, Instruction::AShr,
1195 Instruction::And, Instruction::Or, Instruction::Xor,
1196 Instruction::FNeg> {
1198
1212
1215
1216 StringRef getName() const override { return "numeric"; }
1217
1220 ConfigTy *UserConfig = nullptr);
1221 LLVM_ABI void addFlagNames();
1222
1223 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1224 InstrumentationConfig &IConf,
1226
1229 auto *PreIO =
1231 PreIO->init(IConf, IIRB);
1232 auto *PostIO =
1234 PostIO->init(IConf, IIRB);
1235 }
1236};
1237
1238struct CompareIO final
1239 : public InstructionIO<Instruction::ICmp, Instruction::FCmp> {
1241
1257
1260
1261 StringRef getName() const override { return "compare"; }
1262
1265 ConfigTy *UserConfig = nullptr);
1266 LLVM_ABI void addFlagNames();
1267
1268 LLVM_ABI static Value *getOperandTypeId(Value &V, Type &Ty,
1269 InstrumentationConfig &IConf,
1271 LLVM_ABI static Value *getOperandSize(Value &V, Type &Ty,
1272 InstrumentationConfig &IConf,
1274 LLVM_ABI static Value *getPredicate(Value &V, Type &Ty,
1275 InstrumentationConfig &IConf,
1277 LLVM_ABI static Value *getFlags(Value &V, Type &Ty,
1278 InstrumentationConfig &IConf,
1280
1283 auto *PreIO =
1285 PreIO->init(IConf, IIRB);
1286 auto *PostIO =
1288 PostIO->init(IConf, IIRB);
1289 }
1290};
1291
1292} // namespace instrumentor
1293
1294/// The Instrumentor pass.
1295class InstrumentorPass : public RequiredPassInfoMixin<InstrumentorPass> {
1296 using InstrumentationConfig = instrumentor::InstrumentationConfig;
1297 using InstrumentorIRBuilderTy = instrumentor::InstrumentorIRBuilderTy;
1298
1299 /// File system to be used for read operations.
1301
1302 /// The configuration and IR builder provided by the user.
1303 InstrumentationConfig *UserIConf;
1304 InstrumentorIRBuilderTy *UserIIRB;
1305
1306 PreservedAnalyses run(Module &M, InstrumentationConfig &IConf,
1307 InstrumentorIRBuilderTy &IIRB, bool ReadConfig);
1308
1309public:
1310 /// Construct an instrumentor pass that will use the instrumentation
1311 /// configuration \p IC and the IR builder \p IIRB. If an IR builder is not
1312 /// provided, a default builder is used. When the configuration is not
1313 /// provided, it is read from the config file if available and otherwise a
1314 /// default configuration is used.
1316 InstrumentationConfig *IC = nullptr,
1317 InstrumentorIRBuilderTy *IIRB = nullptr);
1318
1320};
1321
1322} // end namespace llvm
1323
1324#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.
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.