59#include <system_error>
65#define DEBUG_TYPE "instrumentor"
71 "instrumentor-write-config-file",
73 "Write the instrumentor configuration into the specified JSON file"),
78 ConfigFiles(
"instrumentor-read-config-files",
79 cl::desc(
"Read the instrumentor configuration from the "
80 "specified JSON files (comma separated)"),
86 "instrumentor-read-config-paths-file",
87 cl::desc(
"Read the instrumentor configuration file "
88 "paths from the specified file (newline separated)"),
93template <
typename IRBuilderTy>
void ensureDbgLoc(IRBuilderTy &IRB) {
94 if (IRB.getCurrentDebugLocation())
96 auto *BB = IRB.GetInsertBlock();
97 if (
auto *SP = BB->getParent()->getSubprogram())
98 IRB.SetCurrentDebugLocation(
DILocation::get(BB->getContext(), 0, 0, SP));
104template <
typename IRBTy>
106 bool AllowTruncate =
false) {
109 Type *VTy = V->getType();
114 TypeSize RequestedSize =
DL.getTypeSizeInBits(Ty);
115 TypeSize ValueSize =
DL.getTypeSizeInBits(VTy);
116 bool ShouldTruncate = RequestedSize < ValueSize;
117 if (ShouldTruncate && !AllowTruncate)
119 if (ShouldTruncate && AllowTruncate) {
123 IntV = IRB.CreateBitCast(V, IRB.getIntNTy(ValueSize));
124 return tryToCast(IRB,
125 IRB.CreateIntCast(IntV, IRB.getIntNTy(RequestedSize),
127 Ty,
DL, AllowTruncate);
130 return IRB.CreatePointerBitCastOrAddrSpaceCast(V, Ty);
132 return IRB.CreateIntCast(V, Ty,
false);
136 return tryToCast(IRB, IRB.CreateBitCast(V, IRB.getIntNTy(ValueSize)), Ty,
141 if (VTy->
isIntegerTy() && Ty->isFloatingPointTy()) {
142 if (ValueSize == RequestedSize)
143 return IRB.CreateBitCast(V, Ty);
146 IRB.CreateIntCast(V, IRB.getIntNTy(RequestedSize),
false),
147 Ty,
DL, AllowTruncate);
149 return IRB.CreateBitOrPointerCast(V, Ty);
153template <
typename Ty>
155 return ConstantInt::get(
IT, Val, IsSigned);
160class InstrumentorImpl final {
165 : IConf(IConf), M(M), IIRB(IIRB) {}
173 InstChoicesPRE.clear();
174 InstChoicesPOST.clear();
175 ParsedFunctionRegex =
Regex();
180 bool shouldInstrumentTarget();
183 bool shouldInstrumentFunction(
Function &Fn);
191 bool instrumentFunction(
Function &Fn);
192 bool instrumentModule();
203 Regex ParsedFunctionRegex;
221 Twine(
"failed to parse ") + Name +
" regex: " + ErrMsg,
DS_Error));
229bool InstrumentorImpl::shouldInstrumentTarget() {
231 const bool IsGPU =
T.
isAMDGPU() ||
T.isNVPTX();
233 bool RegexMatches =
true;
236 RegexMatches = RX.
match(
T.str());
239 return ((IsGPU && IConf.
GPUEnabled->getBool()) ||
244bool InstrumentorImpl::shouldInstrumentFunction(Function &Fn) {
247 bool RegexMatches =
true;
248 if (ParsedFunctionRegex.
isValid())
254bool InstrumentorImpl::shouldInstrumentGlobalVariable(GlobalVariable &GV) {
259bool InstrumentorImpl::instrumentInstruction(Instruction &
I,
260 InstrumentationCaches &ICaches) {
271 if (
auto *IO = InstChoicesPRE.lookup(
I.getOpcode())) {
272 IIRB.
IRB.SetInsertPoint(&
I);
273 ensureDbgLoc(IIRB.
IRB);
274 IO->instrument(IPtr,
Changed, IConf, IIRB, ICaches);
277 if (
auto *IO = InstChoicesPOST.lookup(
I.getOpcode())) {
278 IIRB.
IRB.SetInsertPoint(
I.getNextNode());
279 ensureDbgLoc(IIRB.
IRB);
280 IO->instrument(IPtr,
Changed, IConf, IIRB, ICaches);
287bool InstrumentorImpl::instrumentFunction(Function &Fn) {
289 if (!shouldInstrumentFunction(Fn))
292 InstrumentationCaches ICaches;
294 ReversePostOrderTraversal<Function *> RPOT(&Fn);
295 for (
auto &It : RPOT) {
297 Changed |= instrumentInstruction(
I, ICaches);
299 auto *TI = It->getTerminator();
300 if (!TI->getNumSuccessors())
305 for (
auto &[Name, IO] :
312 IIRB.
IRB.SetInsertPoint(
313 cast<Function>(FPtr)->getEntryBlock().getFirstNonPHIOrDbgOrAlloca());
314 ensureDbgLoc(IIRB.
IRB);
315 IO->instrument(FPtr,
Changed, IConf, IIRB, ICaches);
319 for (
auto &[Name, IO] :
326 for (Instruction *FinalTI : FinalTIs) {
327 IIRB.
IRB.SetInsertPoint(FinalTI);
328 ensureDbgLoc(IIRB.
IRB);
329 IO->instrument(FPtr,
Changed, IConf, IIRB, ICaches);
336bool InstrumentorImpl::instrumentModule() {
339 for (GlobalVariable &GV : M.
globals()) {
342 GV.
getName() ==
"llvm.global_dtors" ||
343 GV.
getName() ==
"llvm.global_ctors")
348 auto CreateYtor = [&](
bool Ctor) {
351 IConf.
getRTName(Ctor ?
"ctor" :
"dtor",
""), M);
354 IIRB.
IRB.SetInsertPoint(EntryBB, EntryBB->begin());
355 ensureDbgLoc(IIRB.
IRB);
356 IIRB.
IRB.CreateRetVoid();
365 InstrumentationCaches ICaches;
367 Function *CtorFn =
nullptr, *DtorFn =
nullptr;
372 Function *&YtorFn = IsPRE ? CtorFn : DtorFn;
373 for (
auto &ChoiceIt : IConf.
IChoices[Loc]) {
374 auto *IO = ChoiceIt.second;
378 YtorFn = CreateYtor(IsPRE);
381 IIRB.
IRB.SetInsertPointPastAllocas(YtorFn);
382 ensureDbgLoc(IIRB.
IRB);
383 Value *YtorPtr = YtorFn;
388 IO->instrument(YtorPtr,
Changed, IConf, IIRB, ICaches);
396 Function *&YtorFn = IsPRE ? CtorFn : DtorFn;
397 for (
auto &ChoiceIt : IConf.
IChoices[Loc]) {
398 auto *IO = ChoiceIt.second;
402 YtorFn = CreateYtor(IsPRE);
405 for (GlobalVariable *GV : Globals) {
406 if (!shouldInstrumentGlobalVariable(*GV))
411 IIRB.
IRB.SetInsertPointPastAllocas(YtorFn);
412 ensureDbgLoc(IIRB.
IRB);
418 IO->instrument(GVPtr,
Changed, IConf, IIRB, ICaches);
427bool InstrumentorImpl::instrument() {
429 if (!shouldInstrumentTarget())
432 StringRef FunctionRegexStr = IConf.
FunctionRegex->getString();
433 ParsedFunctionRegex =
createRegex(FunctionRegexStr,
"function", IIRB.
Ctx);
436 auto RegisterForAllOpcodes = [](
auto &InstChoices,
437 InstrumentationOpportunity *IO) {
438 ArrayRef<unsigned> Opcodes = IO->getAllOpcodes();
440 for (
unsigned Opcode : Opcodes)
441 InstChoices[Opcode] = IO;
444 for (
auto &[Name, IO] :
447 RegisterForAllOpcodes(InstChoicesPRE, IO);
448 for (
auto &[Name, IO] :
451 RegisterForAllOpcodes(InstChoicesPOST, IO);
454 for (Function &Fn : M)
455 Changed |= instrumentFunction(Fn);
461 InstrumentationConfig *IC,
462 InstrumentorIRBuilderTy *IIRB)
463 : FS(FS), UserIConf(IC), UserIIRB(IIRB) {
472 InstrumentorImpl Impl(IConf, IIRB, M);
480 bool MultipleConfigs = ConfigFiles.size() > 1;
483 std::string ConfigFile =
484 ReadConfig && !ConfigFiles.empty() ? ConfigFiles[Idx] :
"";
495 ? OutputConfigFile +
"." + std::to_string(Idx)
502 }
while (++Idx < ConfigFiles.size());
511 std::unique_ptr<InstrumentationConfig> IConfInt(
512 !UserIConf ?
new InstrumentationConfig() :
nullptr);
513 std::unique_ptr<InstrumentorIRBuilderTy> IIRBInt(
514 !UserIIRB ?
new InstrumentorIRBuilderTy(M) :
nullptr);
516 auto *IConf = IConfInt ? IConfInt.get() : UserIConf;
517 auto *IIRB = IIRBInt ? IIRBInt.get() : UserIIRB;
519 auto PA = run(M, *IConf, *IIRB, !UserIConf);
525std::unique_ptr<BaseConfigurationOption>
531 BCO->setBool(DefaultValue);
536std::unique_ptr<BaseConfigurationOption>
543 BCO->setString(DefaultValue);
567 Twine(
"registered two instrumentation opportunities for the same "
578 Function *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
594 if (!BPIO || !BPIO->Enabled) {
596 "Base pointer info disabled but required, passing nullptr.",
603 std::optional<BasicBlock::iterator> IP =
604 BasePtrI->getInsertionPointAfterDef();
606 IIRB.
IRB.SetInsertPoint(*IP);
609 "Base pointer info could not be placed, passing nullptr.",
614 IIRB.
IRB.SetInsertPointPastAllocas(IIRB.
IRB.GetInsertBlock()->getParent());
619 ensureDbgLoc(IIRB.
IRB);
625 BPI = BPIO->instrument(Obj,
Changed, *
this, IIRB, ICaches);
646 if (V.getType()->isVoidTy())
648 return tryToCast(IIRB.
IRB, &V, &Ty,
649 IIRB.
IRB.GetInsertBlock()->getDataLayout());
655 if (V.getType()->isVoidTy())
658 auto *NewVCasted = &NewV;
661 IIRB.
IRB.SetInsertPoint(
I->getNextNode());
662 ensureDbgLoc(IIRB.
IRB);
663 NewVCasted = tryToCast(IIRB.
IRB, &NewV, V.
getType(), IIRB.
DL,
678 for (
auto &It :
IO.IRTArgs) {
681 NumReplaceableArgs += bool(It.Flags & IRTArg::REPLACABLE);
682 MightRequireIndirection |= It.Flags & IRTArg::POTENTIALLY_INDIRECT;
693 "Wrong indirection setting!");
696 for (
auto &It :
IO.IRTArgs) {
725 auto IP = IIRB.
IRB.GetInsertPoint();
728 for (
auto &It :
IO.IRTArgs) {
732 if (!Param || It.NoCache)
734 Param = It.GetterCB(*V, *It.Ty, IConf, IIRB);
737 if (Param->getType()->isVoidTy()) {
739 }
else if (Param->getType()->isAggregateType() ||
740 DL.getTypeSizeInBits(Param->getType()) >
741 DL.getTypeSizeInBits(It.Ty)) {
744 Twine(
"indirection needed for ") + It.Name +
Twine(
" in ") +
746 Twine(
", but not indicated. Instrumentation is skipped"),
750 ForceIndirection =
true;
752 Param = tryToCast(IIRB.
IRB, Param, It.Ty,
DL);
757 if (ForceIndirection) {
758 Function *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
761 for (
auto &It :
IO.IRTArgs) {
769 auto *&CallParam = CallParams[
Offset++];
771 CallParams.
insert(&CallParam + 1, IIRB.
IRB.getInt32(
DL.getTypeStoreSize(
772 CallParam->getType())));
779 CallParam = CachedParam;
784 IIRB.
IRB.CreateStore(CallParam, AI);
785 CallParam = CachedParam = AI;
789 if (!ForceIndirection)
790 IIRB.
IRB.SetInsertPoint(IP);
791 ensureDbgLoc(IIRB.
IRB);
795 IConf.
getRTName(
IO.IP.isPRE() ?
"pre_" :
"post_",
IO.getName(),
796 ForceIndirection ?
"_ind" :
"");
797 auto FC = IIRB.
IRB.GetInsertBlock()->getModule()->getOrInsertFunction(
799 auto *CI = IIRB.
IRB.CreateCall(FC, CallParams);
802 for (
unsigned I = 0, E =
IO.IRTArgs.size();
I < E; ++
I) {
803 if (!
IO.IRTArgs[
I].Enabled)
808 Value *NewValue = FnTy->isVoidTy() || IsCustomReplaceable
813 if (ForceIndirection && !IsCustomReplaceable &&
818 NewValue = IIRB.
IRB.CreateLoad(V->getType(), Q);
820 V =
IO.IRTArgs[
I].SetterCB(*V, *NewValue, IConf, IIRB);
826 if constexpr (std::is_same<Ty, Use>::value)
827 return ValueOrUse.get();
829 return static_cast<Value *
>(&ValueOrUse);
832template <
typename Range>
835 auto *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
836 auto *I32Ty = IIRB.
IRB.getInt32Ty();
842 if (!V->getType()->isSized())
845 ConstantValues.
push_back(getCI(I32Ty, VSize));
846 Types.push_back(I32Ty);
847 ConstantValues.
push_back(getCI(I32Ty, V->getType()->getTypeID()));
848 Types.push_back(I32Ty);
849 if (
uint32_t MisAlign = VSize % 8) {
853 Types.push_back(V->getType());
876 for (
auto [Param, Idx] : Values) {
877 auto *Ptr = IIRB.
IRB.CreateStructGEP(STy, AI, Idx);
878 IIRB.
IRB.CreateStore(Param, Ptr);
883template <
typename Range>
887 auto *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
891 for (
const auto &[Idx, RE] :
enumerate(R)) {
893 if (!V->getType()->isSized())
896 auto VSize =
DL.getTypeAllocSize(V->getType());
897 auto Padding =
alignTo(VSize, 8) - VSize;
899 auto *Ptr = IIRB.
IRB.CreateConstInBoundsGEP1_32(IIRB.
Int8Ty, &Pack,
Offset);
900 auto *NewV = IIRB.
IRB.CreateLoad(V->getType(), Ptr);
910 using namespace std::placeholders;
924 "Number of function arguments (without varargs).",
IRTArg::NONE,
928 IIRB.
PtrTy,
"arguments",
"Description of the arguments.",
936 "Flag to indicate it is the main function.",
966 return getCI(&Ty, std::distance(FRange.begin(), FRange.end()));
982 auto CB = [&](
int Idx,
Value *ReplV) {
1001 return getCI(&Ty, Fn.
getName() ==
"main");
1007 return getCI(&Ty,
I.getOpcode());
1012 return getCI(&Ty, V.getType()->getTypeID());
1018 auto &
DL =
I.getDataLayout();
1019 return getCI(&Ty,
DL.getTypeStoreSize(V.getType()));
1043 IRTArg(IIRB.
PtrTy,
"address",
"The allocated memory address.",
1049 IIRB.
Int64Ty,
"size",
"The allocation size.",
1065 Value *SizeValue =
nullptr;
1071 SizeValue = IIRB.
IRB.CreatePtrToInt(
1072 IIRB.
IRB.CreateGEP(AI.getAllocatedType(), NullPtr,
1073 {IIRB.IRB.getInt32(1)}),
1076 if (AI.isArrayAllocation())
1077 SizeValue = IIRB.
IRB.CreateMul(
1078 SizeValue, IIRB.
IRB.CreateZExtOrBitCast(AI.getArraySize(), &Ty));
1086 auto *NewAI = IIRB.
IRB.CreateAlloca(IIRB.
IRB.getInt8Ty(),
1087 DL.getAllocaAddrSpace(), &NewV);
1088 NewAI->setAlignment(AI.getAlign());
1089 AI.replaceAllUsesWith(NewAI);
1108 IRTArg(IIRB.
PtrTy,
"pointer",
"The accessed pointer.",
1115 "The address space of the accessed pointer.",
1120 "The runtime provided base pointer info.",
1148 "The atomicity ordering of the store.",
1169 return SI.getPointerOperand();
1175 SI.setOperand(
SI.getPointerOperandIndex(), &NewV);
1182 return getCI(&Ty,
SI.getPointerAddressSpace());
1195 return SI.getValueOperand();
1201 auto &
DL =
SI.getDataLayout();
1202 return getCI(&Ty,
DL.getTypeStoreSize(
SI.getValueOperand()->getType()));
1208 return getCI(&Ty,
SI.getAlign().value());
1214 return getCI(&Ty,
SI.getValueOperand()->getType()->getTypeID());
1221 return getCI(&Ty,
uint64_t(
SI.getOrdering()));
1227 return getCI(&Ty,
uint64_t(
SI.getSyncScopeID()));
1233 return getCI(&Ty,
SI.isVolatile());
1243 IRTArg(IIRB.
PtrTy,
"pointer",
"The accessed pointer.",
1250 "The address space of the accessed pointer.",
1255 "The runtime provided base pointer info.",
1285 "The atomicity ordering of the load.",
1306 return LI.getPointerOperand();
1312 LI.setOperand(LI.getPointerOperandIndex(), &NewV);
1319 return getCI(&Ty, LI.getPointerAddressSpace());
1337 auto &
DL = LI.getDataLayout();
1338 return getCI(&Ty,
DL.getTypeStoreSize(LI.getType()));
1344 return getCI(&Ty, LI.getAlign().value());
1350 return getCI(&Ty, LI.getType()->getTypeID());
1357 return getCI(&Ty,
uint64_t(LI.getOrdering()));
1363 return getCI(&Ty,
uint64_t(LI.getSyncScopeID()));
1369 return getCI(&Ty, LI.isVolatile());
1378 "The base pointer in question.",
1382 IIRB.
Int32Ty,
"base_pointer_kind",
1383 "The base pointer kind (argument, global, instruction, unknown).",
1393 return getCI(&Ty, 0);
1395 return getCI(&Ty, 1);
1397 return getCI(&Ty, 2);
1398 return getCI(&Ty, 3);
1408 "The module/translation unit name.",
1439 IIRB.
PtrTy,
"address",
1440 "The address of the global (replaceable for definitions).",
1449 "The size of the declared type of the global.",
1460 IIRB.
Int64Ty,
"initial_value",
"The initial value of the global.",
1469 "Flag to indicate global definitions.",
1493 DL.getDefaultGlobalsAddressSpace());
1498 IIRB.
IRB.CreateStore(&NewV, ShadowGV);
1507 auto MakeInstForConst = [&](
Use &U) {
1513 I = CE->getAsInstruction();
1527 while (!Worklist.
empty()) {
1530 U->set(ReloadMap[
I->getFunction()]);
1533 if (
auto *CI = ConstToInstMap[*U]) {
1534 auto *CIClone = CI->clone();
1537 auto *BB =
PHI->getIncomingBlock(U->getOperandNo());
1538 CIClone->insertBefore(BB->getTerminator()->getIterator());
1540 CIClone->insertBefore(
I->getIterator());
1543 for (
auto &CICUse : CIClone->operands()) {
1551 while (!Worklist.
empty()) {
1553 if (!
Done.insert(U).second)
1555 MakeInstForConst(*U);
1566 if (
II->getIntrinsicID() == Intrinsic::eh_typeid_for)
1569 InsertConsts(
I, *U);
1572 for (
auto &It : ConstToInstMap)
1574 It.second->deleteValue();
1654 "The opcode of the cast instruction.",
1664 return CI.getOperand(0);
1670 return getCI(&Ty, CI.getSrcTy()->getTypeID());
1676 auto &
DL = CI.getDataLayout();
1677 return getCI(&Ty,
DL.getTypeStoreSize(CI.getSrcTy()));
1683 return getCI(&Ty, CI.getDestTy()->getTypeID());
1689 auto &
DL = CI.getDataLayout();
1690 return getCI(&Ty,
DL.getTypeStoreSize(CI.getDestTy()));
1697 return I.getOperand(0);
1703 if (
I.getNumOperands() > 1)
1704 return I.getOperand(1);
1714 switch (
I.getOpcode()) {
1715 case Instruction::Add:
1716 case Instruction::Sub:
1717 case Instruction::Mul:
1718 case Instruction::Shl:
1719 if (
I.hasNoSignedWrap())
1721 if (
I.hasNoUnsignedWrap())
1724 case Instruction::FAdd:
1725 case Instruction::FSub:
1726 case Instruction::FMul:
1727 case Instruction::FDiv:
1728 case Instruction::FNeg:
1733 if (
I.hasNoSignedZeros())
1736 case Instruction::AShr:
1737 case Instruction::LShr:
1738 case Instruction::SDiv:
1739 case Instruction::UDiv:
1746 if (DI->isDisjoint())
1749 return getCI(&Ty, Flag);
1757 const auto ValArgOpts =
1772 "The operation's left operand.", ValArgOpts,
1776 "The operation's right operand. This value is "
1777 "poison for unary operations.",
1787 "A bitmask value signaling which instruction flags are present.",
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
This file contains the declarations for the subclasses of Constant, which represent the different fla...
post inline ee instrument
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
@ NUMERIC_FLAG_NO_SIGNED_WRAP
@ NUMERIC_FLAG_NO_UNSIGNED_WRAP
@ NUMERIC_FLAG_HAS_NO_SIGNED_ZEROS
@ NUMERIC_FLAG_HAS_NO_INFS
@ NUMERIC_FLAG_HAS_NO_NANS
@ NUMERIC_FLAG_IS_DISJOINT
static void readValuePack(const Range &R, Value &Pack, InstrumentorIRBuilderTy &IIRB, function_ref< void(int, Value *)> SetterCB)
static Value * getTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static constexpr Value * getValue(Ty &ValueOrUse)
static Value * createValuePack(const Range &R, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static Value * getOpcode(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
static Regex createRegex(StringRef Str, StringRef Name, LLVMContext &Ctx)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
ModuleAnalysisManager MAM
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
Defines the virtual file system interface vfs::FileSystem.
static unsigned getSize(unsigned Kind)
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI const_iterator getFirstNonPHIOrDbgOrAlloca() const
Returns an iterator to the first instruction in this block that is not a PHINode, a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
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)
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
LLVM_ABI TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Diagnostic information for IR instrumentation reporting.
Class to represent function types.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
const BasicBlock & getEntryBlock() const
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
iterator_range< arg_iterator > args()
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Argument * getArg(unsigned i) const
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
StringRef getSection() const
Get the custom section of this global if it has one.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LinkageTypes getLinkage() const
ThreadLocalMode getThreadLocalMode() const
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ InternalLinkage
Rename collisions when linking (static functions).
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
uint64_t getAlignment() const
FIXME: Remove this function once transition to Align is over.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
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.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
An instruction for reading from memory.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
size_t global_size() const
StringRef getName() const
Get a short "name" for the module.
iterator_range< global_iterator > globals()
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
LLVM_ABI bool isValid(std::string &Error) const
isValid - returns the error encountered during regex compilation, if any.
LLVM_ABI bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void reserve(size_type N)
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Class to represent struct types.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
const std::string & getTriple() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isAggregateType() const
Return true if the type is an aggregate type.
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isIntegerTy() const
True if this is an instance of IntegerType.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI bool replaceUsesWithIf(Value *New, llvm::function_ref< bool(Use &U)> ShouldReplace)
Go through the uses list for this definition and make each use point to "V" if the callback ShouldRep...
iterator_range< use_iterator > uses()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
constexpr ScalarTy getFixedValue() const
constexpr bool isFixed() const
Returns true if the quantity is not scaled by vscale.
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
LLVM_ABI void writeConfigToJSON(InstrumentationConfig &IConf, StringRef OutputFile, LLVMContext &Ctx)
Write the configuration in /p IConf to the file with path OutputFile.
LLVM_ABI bool readConfigPathsFile(StringRef InputFile, cl::list< std::string > &Configs, LLVMContext &Ctx, vfs::FileSystem &FS)
Read the configuration paths from the file with path InputFile into Configs.
LLVM_ABI bool readConfigFromJSON(InstrumentationConfig &IConf, StringRef InputFile, LLVMContext &Ctx, vfs::FileSystem &FS)
Read the configuration from the file with path InputFile into /p IConf.
LLVM_ABI void printRuntimeStub(const InstrumentationConfig &IConf, StringRef StubRuntimeName, LLVMContext &Ctx)
Print a runtime stub file with the implementation of the instrumentation runtime functions correspond...
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI const Value * getUnderlyingObjectAggressive(const Value *V)
Like getUnderlyingObject(), but will try harder to find a single underlying object.
LLVM_ABI void appendToGlobalCtors(Module &M, Function *F, int Priority, Constant *Data=nullptr)
Append F to the list of global ctors of module M with the given Priority.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
LLVM_ABI void appendToGlobalDtors(Module &M, Function *F, int Priority, Constant *Data=nullptr)
Same as appendToGlobalCtors(), but for global dtors.
DEMANGLE_ABI std::string demangle(std::string_view MangledName)
Attempt to demangle a string using different demangling schemes.
LLVM_ABI bool verifyModule(const Module &M, raw_ostream *OS=nullptr, bool *BrokenDebugInfo=nullptr)
Check a module for errors.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
}
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)
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...
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.
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
static LLVM_ABI Value * getInputTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
llvm::instrumentor::FunctionIO::ConfigTy Config
static void populate(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
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)
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)
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)
BaseConfigTy< ConfigKind > ConfigTy
static LLVM_ABI Value * isConstant(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
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 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.
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.
Helper that represent the caches for instrumentation call arguments.
DenseMap< std::tuple< unsigned, StringRef, StringRef >, Value * > DirectArgCache
A cache for direct and indirect arguments.
DenseMap< std::tuple< unsigned, StringRef, StringRef >, Value * > IndirectArgCache
The class that contains the configuration for the instrumentor.
virtual void populate(InstrumentorIRBuilderTy &IIRB)
Populate the instrumentation opportunities.
void addChoice(InstrumentationOpportunity &IO, LLVMContext &Ctx)
Register instrumentation opportunity IO.
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.
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.
std::unique_ptr< BaseConfigurationOption > FunctionRegex
std::unique_ptr< BaseConfigurationOption > TargetRegex
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.
static LLVM_ABI Value * getIdPre(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
Get the opportunity identifier for the pre and post positions.
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)
}
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.
SmallVector< IRTArg > IRTArgs
The list of possible arguments for the instrumentation runtime function.
void addCommonArgs(InstrumentationConfig &IConf, LLVMContext &Ctx, bool PassId)
}
An IR builder augmented with extra information for the instrumentor pass.
IRBuilder< ConstantFolder, IRBuilderCallbackInserter > IRB
The underlying IR builder with insertion callback.
unsigned Epoch
The current epoch number.
AllocaInst * getAlloca(Function *Fn, Type *Ty, bool MatchType=false)
Get a temporary alloca to communicate (large) values with the runtime.
void returnAllocas()
Return the temporary allocas.
DenseMap< Instruction *, unsigned > NewInsts
A mapping from instrumentation instructions to the epoch they have been created.
void eraseLater(Instruction *I)
Save instruction I to be erased later.
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)
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)
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
static LLVM_ABI Value * getFlags(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
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)
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)
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