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);
160 case Type::TypeID::ArrayTyID:
161 case Type::TypeID::FixedVectorTyID:
162 case Type::TypeID::ScalableVectorTyID:
168 return getCI(&ReqTy, -1,
true);
173class InstrumentorImpl final {
178 : IConf(IConf), M(M), IIRB(IIRB) {}
186 InstChoicesPRE.clear();
187 InstChoicesPOST.clear();
188 ParsedFunctionRegex =
Regex();
193 bool shouldInstrumentTarget();
196 bool shouldInstrumentFunction(
Function &Fn);
204 bool instrumentFunction(
Function &Fn);
205 bool instrumentModule();
216 Regex ParsedFunctionRegex;
234 Twine(
"failed to parse ") + Name +
" regex: " + ErrMsg,
DS_Error));
242bool InstrumentorImpl::shouldInstrumentTarget() {
244 const bool IsGPU =
T.
isAMDGPU() ||
T.isNVPTX();
246 bool RegexMatches =
true;
249 RegexMatches = RX.
match(
T.str());
252 return ((IsGPU && IConf.
GPUEnabled->getBool()) ||
257bool InstrumentorImpl::shouldInstrumentFunction(Function &Fn) {
260 bool RegexMatches =
true;
261 if (ParsedFunctionRegex.
isValid())
267bool InstrumentorImpl::shouldInstrumentGlobalVariable(GlobalVariable &GV) {
272bool InstrumentorImpl::instrumentInstruction(Instruction &
I,
273 InstrumentationCaches &ICaches) {
284 if (
auto *IO = InstChoicesPRE.lookup(
I.getOpcode())) {
285 IIRB.
IRB.SetInsertPoint(&
I);
286 ensureDbgLoc(IIRB.
IRB);
287 IO->instrument(IPtr,
Changed, IConf, IIRB, ICaches);
290 if (
auto *IO = InstChoicesPOST.lookup(
I.getOpcode())) {
291 IIRB.
IRB.SetInsertPoint(
I.getNextNode());
292 ensureDbgLoc(IIRB.
IRB);
293 IO->instrument(IPtr,
Changed, IConf, IIRB, ICaches);
300bool InstrumentorImpl::instrumentFunction(Function &Fn) {
302 if (!shouldInstrumentFunction(Fn))
305 InstrumentationCaches ICaches;
307 ReversePostOrderTraversal<Function *> RPOT(&Fn);
308 for (
auto &It : RPOT) {
310 Changed |= instrumentInstruction(
I, ICaches);
312 auto *TI = It->getTerminator();
313 if (!TI->getNumSuccessors())
318 for (
auto &[Name, IO] :
325 IIRB.
IRB.SetInsertPoint(
326 cast<Function>(FPtr)->getEntryBlock().getFirstNonPHIOrDbgOrAlloca());
327 ensureDbgLoc(IIRB.
IRB);
328 IO->instrument(FPtr,
Changed, IConf, IIRB, ICaches);
332 for (
auto &[Name, IO] :
339 for (Instruction *FinalTI : FinalTIs) {
340 IIRB.
IRB.SetInsertPoint(FinalTI);
341 ensureDbgLoc(IIRB.
IRB);
342 IO->instrument(FPtr,
Changed, IConf, IIRB, ICaches);
349bool InstrumentorImpl::instrumentModule() {
352 for (GlobalVariable &GV : M.
globals()) {
355 GV.
getName() ==
"llvm.global_dtors" ||
356 GV.
getName() ==
"llvm.global_ctors")
361 auto CreateYtor = [&](
bool Ctor) {
364 IConf.
getRTName(Ctor ?
"ctor" :
"dtor",
""), M);
367 IIRB.
IRB.SetInsertPoint(EntryBB, EntryBB->begin());
368 ensureDbgLoc(IIRB.
IRB);
369 IIRB.
IRB.CreateRetVoid();
378 InstrumentationCaches ICaches;
380 Function *CtorFn =
nullptr, *DtorFn =
nullptr;
385 Function *&YtorFn = IsPRE ? CtorFn : DtorFn;
386 for (
auto &ChoiceIt : IConf.
IChoices[Loc]) {
387 auto *IO = ChoiceIt.second;
391 YtorFn = CreateYtor(IsPRE);
394 IIRB.
IRB.SetInsertPointPastAllocas(YtorFn);
395 ensureDbgLoc(IIRB.
IRB);
396 Value *YtorPtr = YtorFn;
401 IO->instrument(YtorPtr,
Changed, IConf, IIRB, ICaches);
409 Function *&YtorFn = IsPRE ? CtorFn : DtorFn;
410 for (
auto &ChoiceIt : IConf.
IChoices[Loc]) {
411 auto *IO = ChoiceIt.second;
415 YtorFn = CreateYtor(IsPRE);
418 for (GlobalVariable *GV : Globals) {
419 if (!shouldInstrumentGlobalVariable(*GV))
424 IIRB.
IRB.SetInsertPointPastAllocas(YtorFn);
425 ensureDbgLoc(IIRB.
IRB);
431 IO->instrument(GVPtr,
Changed, IConf, IIRB, ICaches);
440bool InstrumentorImpl::instrument() {
442 if (!shouldInstrumentTarget())
445 StringRef FunctionRegexStr = IConf.
FunctionRegex->getString();
446 ParsedFunctionRegex =
createRegex(FunctionRegexStr,
"function", IIRB.
Ctx);
449 auto RegisterForAllOpcodes = [](
auto &InstChoices,
450 InstrumentationOpportunity *IO) {
451 ArrayRef<unsigned> Opcodes = IO->getAllOpcodes();
453 for (
unsigned Opcode : Opcodes)
454 InstChoices[Opcode] = IO;
457 for (
auto &[Name, IO] :
460 RegisterForAllOpcodes(InstChoicesPRE, IO);
461 for (
auto &[Name, IO] :
464 RegisterForAllOpcodes(InstChoicesPOST, IO);
467 for (Function &Fn : M)
468 Changed |= instrumentFunction(Fn);
474 InstrumentationConfig *IC,
475 InstrumentorIRBuilderTy *IIRB)
476 : FS(FS), UserIConf(IC), UserIIRB(IIRB) {
485 InstrumentorImpl Impl(IConf, IIRB, M);
493 bool MultipleConfigs = ConfigFiles.size() > 1;
496 std::string ConfigFile =
497 ReadConfig && !ConfigFiles.empty() ? ConfigFiles[Idx] :
"";
508 ? OutputConfigFile +
"." + std::to_string(Idx)
515 }
while (++Idx < ConfigFiles.size());
524 std::unique_ptr<InstrumentationConfig> IConfInt(
525 !UserIConf ?
new InstrumentationConfig() :
nullptr);
526 std::unique_ptr<InstrumentorIRBuilderTy> IIRBInt(
527 !UserIIRB ?
new InstrumentorIRBuilderTy(M) :
nullptr);
529 auto *IConf = IConfInt ? IConfInt.get() : UserIConf;
530 auto *IIRB = IIRBInt ? IIRBInt.get() : UserIIRB;
532 auto PA = run(M, *IConf, *IIRB, !UserIConf);
538std::unique_ptr<BaseConfigurationOption>
544 BCO->setBool(DefaultValue);
549std::unique_ptr<BaseConfigurationOption>
556 BCO->setString(DefaultValue);
581 Twine(
"registered two instrumentation opportunities for the same "
592 Function *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
608 if (!BPIO || !BPIO->Enabled) {
610 "Base pointer info disabled but required, passing nullptr.",
617 std::optional<BasicBlock::iterator> IP =
618 BasePtrI->getInsertionPointAfterDef();
620 IIRB.
IRB.SetInsertPoint(*IP);
623 "Base pointer info could not be placed, passing nullptr.",
628 IIRB.
IRB.SetInsertPointPastAllocas(IIRB.
IRB.GetInsertBlock()->getParent());
633 ensureDbgLoc(IIRB.
IRB);
639 BPI = BPIO->instrument(Obj,
Changed, *
this, IIRB, ICaches);
660 if (V.getType()->isVoidTy())
662 return tryToCast(IIRB.
IRB, &V, &Ty,
663 IIRB.
IRB.GetInsertBlock()->getDataLayout());
669 if (V.getType()->isVoidTy())
672 auto *NewVCasted = &NewV;
675 IIRB.
IRB.SetInsertPoint(
I->getNextNode());
676 ensureDbgLoc(IIRB.
IRB);
677 NewVCasted = tryToCast(IIRB.
IRB, &NewV, V.
getType(), IIRB.
DL,
692 for (
auto &It :
IO.IRTArgs) {
695 NumReplaceableArgs += bool(It.Flags & IRTArg::REPLACABLE);
696 MightRequireIndirection |= It.Flags & IRTArg::POTENTIALLY_INDIRECT;
707 "Wrong indirection setting!");
710 for (
auto &It :
IO.IRTArgs) {
739 auto IP = IIRB.
IRB.GetInsertPoint();
742 for (
auto &It :
IO.IRTArgs) {
746 if (!Param || It.NoCache)
748 Param = It.GetterCB(*V, *It.Ty, IConf, IIRB);
751 if (Param->getType()->isVoidTy()) {
753 }
else if (Param->getType()->isAggregateType() ||
754 Param->getType()->isVectorTy() ||
755 DL.getTypeSizeInBits(Param->getType()) >
756 DL.getTypeSizeInBits(It.Ty)) {
759 Twine(
"indirection needed for ") + It.Name +
Twine(
" in ") +
761 Twine(
", but not indicated. Instrumentation is skipped"),
765 ForceIndirection =
true;
767 Param = tryToCast(IIRB.
IRB, Param, It.Ty,
DL);
772 if (ForceIndirection) {
773 Function *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
776 for (
auto &It :
IO.IRTArgs) {
784 auto *&CallParam = CallParams[
Offset++];
786 CallParams.
insert(&CallParam + 1, IIRB.
IRB.getInt32(
DL.getTypeStoreSize(
787 CallParam->getType())));
794 CallParam = CachedParam;
799 IIRB.
IRB.CreateStore(CallParam, AI);
800 CallParam = CachedParam = AI;
804 if (!ForceIndirection)
805 IIRB.
IRB.SetInsertPoint(IP);
806 ensureDbgLoc(IIRB.
IRB);
810 IConf.
getRTName(
IO.IP.isPRE() ?
"pre_" :
"post_",
IO.getName(),
811 ForceIndirection ?
"_ind" :
"");
812 auto FC = IIRB.
IRB.GetInsertBlock()->getModule()->getOrInsertFunction(
814 auto *CI = IIRB.
IRB.CreateCall(FC, CallParams);
817 for (
unsigned I = 0, E =
IO.IRTArgs.size();
I < E; ++
I) {
818 if (!
IO.IRTArgs[
I].Enabled)
823 Value *NewValue = FnTy->isVoidTy() || IsCustomReplaceable
828 if (ForceIndirection && !IsCustomReplaceable &&
833 NewValue = IIRB.
IRB.CreateLoad(V->getType(), Q);
835 V =
IO.IRTArgs[
I].SetterCB(*V, *NewValue, IConf, IIRB);
841 if constexpr (std::is_same<Ty, Use>::value)
842 return ValueOrUse.get();
844 return static_cast<Value *
>(&ValueOrUse);
847template <
typename Range>
850 auto *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
851 auto *I32Ty = IIRB.
IRB.getInt32Ty();
857 if (!V->getType()->isSized())
860 ConstantValues.
push_back(getCI(I32Ty, VSize));
861 Types.push_back(I32Ty);
862 ConstantValues.
push_back(getCI(I32Ty, V->getType()->getTypeID()));
863 Types.push_back(I32Ty);
864 if (
uint32_t MisAlign = VSize % 8) {
868 Types.push_back(V->getType());
891 for (
auto [Param, Idx] :
Values) {
892 auto *Ptr = IIRB.
IRB.CreateStructGEP(STy, AI, Idx);
893 IIRB.
IRB.CreateStore(Param, Ptr);
898template <
typename Range>
902 auto *Fn = IIRB.
IRB.GetInsertBlock()->getParent();
906 for (
const auto &[Idx, RE] :
enumerate(R)) {
908 if (!V->getType()->isSized())
911 auto VSize =
DL.getTypeAllocSize(V->getType());
912 auto Padding =
alignTo(VSize, 8) - VSize;
914 auto *Ptr = IIRB.
IRB.CreateConstInBoundsGEP1_32(IIRB.
Int8Ty, &Pack,
Offset);
915 auto *NewV = IIRB.
IRB.CreateLoad(V->getType(), Ptr);
925 return getCI(&Ty,
I.getOpcode());
932 auto &
DL =
I.getDataLayout();
933 return getCI(&Ty,
DL.getTypeStoreSize(V.getType()));
940 return I.getOperand(0);
947 if (
I.getNumOperands() > 1)
948 return I.getOperand(1);
955 return getCI(&Ty, V.getType()->getTypeID());
961 return getSubTypeID(*V.getType(), Ty);
968 using namespace std::placeholders;
982 "Number of function arguments (without varargs).",
IRTArg::NONE,
986 IIRB.
PtrTy,
"arguments",
"Description of the arguments.",
994 "Flag to indicate it is the main function.",
1024 return getCI(&Ty, std::distance(FRange.begin(), FRange.end()));
1040 auto CB = [&](
int Idx,
Value *ReplV) {
1059 return getCI(&Ty, Fn.
getName() ==
"main");
1083 IRTArg(IIRB.
PtrTy,
"address",
"The allocated memory address.",
1089 IIRB.
Int64Ty,
"size",
"The allocation size.",
1105 Value *SizeValue =
nullptr;
1111 SizeValue = IIRB.
IRB.CreatePtrToInt(
1112 IIRB.
IRB.CreateGEP(AI.getAllocatedType(), NullPtr,
1113 {IIRB.IRB.getInt32(1)}),
1116 if (AI.isArrayAllocation())
1117 SizeValue = IIRB.
IRB.CreateMul(
1118 SizeValue, IIRB.
IRB.CreateZExtOrBitCast(AI.getArraySize(), &Ty));
1126 auto *NewAI = IIRB.
IRB.CreateAlloca(IIRB.
IRB.getInt8Ty(),
1127 DL.getAllocaAddrSpace(), &NewV);
1128 NewAI->setAlignment(AI.getAlign());
1129 AI.replaceAllUsesWith(NewAI);
1148 IRTArg(IIRB.
PtrTy,
"pointer",
"The accessed pointer.",
1155 "The address space of the accessed pointer.",
1160 "The runtime provided base pointer info.",
1188 IIRB.
Int32Ty,
"value_sub_type_id",
1189 "The type id of the stored value (for arrays and vectors, or -1).",
1194 "The atomicity ordering of the store.",
1215 return SI.getPointerOperand();
1221 SI.setOperand(
SI.getPointerOperandIndex(), &NewV);
1228 return getCI(&Ty,
SI.getPointerAddressSpace());
1241 return SI.getValueOperand();
1247 auto &
DL =
SI.getDataLayout();
1248 return getCI(&Ty,
DL.getTypeStoreSize(
SI.getValueOperand()->getType()));
1254 return getCI(&Ty,
SI.getAlign().value());
1260 return getCI(&Ty,
SI.getValueOperand()->getType()->getTypeID());
1267 return getSubTypeID(*
SI.getValueOperand()->getType(), Ty);
1274 return getCI(&Ty,
uint64_t(
SI.getOrdering()));
1280 return getCI(&Ty,
uint64_t(
SI.getSyncScopeID()));
1286 return getCI(&Ty,
SI.isVolatile());
1296 IRTArg(IIRB.
PtrTy,
"pointer",
"The accessed pointer.",
1303 "The address space of the accessed pointer.",
1308 "The runtime provided base pointer info.",
1338 IIRB.
Int32Ty,
"value_sub_type_id",
1339 "The sub type id of the loaded value (for arrays and vectors, or -1).",
1344 "The atomicity ordering of the load.",
1365 return LI.getPointerOperand();
1371 LI.setOperand(LI.getPointerOperandIndex(), &NewV);
1378 return getCI(&Ty, LI.getPointerAddressSpace());
1396 auto &
DL = LI.getDataLayout();
1397 return getCI(&Ty,
DL.getTypeStoreSize(LI.getType()));
1403 return getCI(&Ty, LI.getAlign().value());
1409 return getCI(&Ty, LI.getType()->getTypeID());
1416 return getSubTypeID(*LI.getType(), Ty);
1423 return getCI(&Ty,
uint64_t(LI.getOrdering()));
1429 return getCI(&Ty,
uint64_t(LI.getSyncScopeID()));
1435 return getCI(&Ty, LI.isVolatile());
1444 "The base pointer in question.",
1448 IIRB.
Int32Ty,
"base_pointer_kind",
1449 "The base pointer kind (argument, global, instruction, unknown).",
1459 return getCI(&Ty, 0);
1461 return getCI(&Ty, 1);
1463 return getCI(&Ty, 2);
1464 return getCI(&Ty, 3);
1474 "The module/translation unit name.",
1505 IIRB.
PtrTy,
"address",
1506 "The address of the global (replaceable for definitions).",
1515 "The size of the declared type of the global.",
1526 IIRB.
Int64Ty,
"initial_value",
"The initial value of the global.",
1535 "Flag to indicate global definitions.",
1559 DL.getDefaultGlobalsAddressSpace());
1564 IIRB.
IRB.CreateStore(&NewV, ShadowGV);
1573 auto MakeInstForConst = [&](
Use &U) {
1579 I = CE->getAsInstruction();
1593 while (!Worklist.
empty()) {
1596 U->set(ReloadMap[
I->getFunction()]);
1599 if (
auto *CI = ConstToInstMap[*U]) {
1600 auto *CIClone = CI->clone();
1603 auto *BB =
PHI->getIncomingBlock(U->getOperandNo());
1604 CIClone->insertBefore(BB->getTerminator()->getIterator());
1606 CIClone->insertBefore(
I->getIterator());
1609 for (
auto &CICUse : CIClone->operands()) {
1617 while (!Worklist.
empty()) {
1619 if (!
Done.insert(U).second)
1621 MakeInstForConst(*U);
1632 if (
II->getIntrinsicID() == Intrinsic::eh_typeid_for)
1635 InsertConsts(
I, *U);
1638 for (
auto &It : ConstToInstMap)
1640 It.second->deleteValue();
1707 IIRB.
Int32Ty,
"input_sub_type_id",
1708 "The sub type id of the input value (for arrays and vectors, or -1).",
1727 IIRB.
Int32Ty,
"result_sub_type_id",
1728 "The sub type id of the result value (for arrays and vectors, or -1).",
1736 "The opcode of the cast instruction.",
1746 return CI.getOperand(0);
1752 return getCI(&Ty, CI.getSrcTy()->getTypeID());
1759 return getSubTypeID(*CI.getSrcTy(), Ty);
1765 auto &
DL = CI.getDataLayout();
1766 return getCI(&Ty,
DL.getTypeStoreSize(CI.getSrcTy()));
1772 return getCI(&Ty, CI.getDestTy()->getTypeID());
1779 return getSubTypeID(*CI.getDestTy(), Ty);
1785 auto &
DL = CI.getDataLayout();
1786 return getCI(&Ty,
DL.getTypeStoreSize(CI.getDestTy()));
1795 switch (
I.getOpcode()) {
1796 case Instruction::Add:
1797 case Instruction::Sub:
1798 case Instruction::Mul:
1799 case Instruction::Shl:
1800 if (
I.hasNoSignedWrap())
1802 if (
I.hasNoUnsignedWrap())
1805 case Instruction::FAdd:
1806 case Instruction::FSub:
1807 case Instruction::FMul:
1808 case Instruction::FDiv:
1809 case Instruction::FNeg:
1814 if (
I.hasNoSignedZeros())
1817 case Instruction::AShr:
1818 case Instruction::LShr:
1819 case Instruction::SDiv:
1820 case Instruction::UDiv:
1827 if (DI->isDisjoint())
1830 return getCI(&Ty, Flag);
1838 const auto ValArgOpts =
1848 "The operation's sub type id (for arrays and vectors, or -1).",
1858 "The operation's left operand.", ValArgOpts,
1862 "The operation's right operand. This value is "
1863 "poison for unary operations.",
1873 "A bitmask value signaling which instruction flags are present.",
1883 return getCI(&Ty,
I.getOperand(0)->getType()->getTypeID());
1890 auto &
DL =
I.getDataLayout();
1891 return getCI(&Ty,
DL.getTypeStoreSize(
I.getOperand(0)->getType()));
1897 return getCI(&Ty, CI->getPredicate());
1905 switch (
I.getOpcode()) {
1906 case Instruction::ICmp:
1910 case Instruction::FCmp:
1915 if (
I.hasNoSignedZeros())
1920 return getCI(&Ty, Flag);
1928 const auto OperandArgOpts =
1948 "The comparison's left operand.", OperandArgOpts,
1952 "The comparison's right operand.", OperandArgOpts,
1972 "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.
@ COMPARE_FLAG_HAS_NO_NANS
@ COMPARE_FLAG_HAS_NO_INFS
@ COMPARE_FLAG_HAS_NO_SIGNED_ZEROS
@ 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 constexpr Value * getValue(Ty &ValueOrUse)
static Value * createValuePack(const Range &R, 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 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 isVectorTy() const
True if this is an instance of VectorType.
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.
TypeID getTypeID() const
Return the type id for the type.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
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.
RelativeUniformCounterPtr Values
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
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 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)
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.
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
static LLVM_ABI Value * getInputTypeId(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
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
static LLVM_ABI Value * getPredicate(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
LLVM_ABI void init(InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB, ConfigTy *UserConfig=nullptr)
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 * getValueSubTypeId(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 * 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)
}
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)
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