LLVM 22.0.0git
AllocToken.cpp
Go to the documentation of this file.
1//===- AllocToken.cpp - Allocation token instrumentation ------------------===//
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// This file implements AllocToken, an instrumentation pass that
10// replaces allocation calls with token-enabled versions.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/Statistic.h"
20#include "llvm/ADT/StringRef.h"
24#include "llvm/IR/Analysis.h"
25#include "llvm/IR/Attributes.h"
26#include "llvm/IR/Constants.h"
28#include "llvm/IR/Function.h"
29#include "llvm/IR/GlobalValue.h"
30#include "llvm/IR/IRBuilder.h"
32#include "llvm/IR/InstrTypes.h"
35#include "llvm/IR/Metadata.h"
36#include "llvm/IR/Module.h"
37#include "llvm/IR/PassManager.h"
38#include "llvm/IR/Type.h"
47#include <cassert>
48#include <cstddef>
49#include <cstdint>
50#include <limits>
51#include <memory>
52#include <optional>
53#include <string>
54#include <utility>
55#include <variant>
56
57using namespace llvm;
59
60#define DEBUG_TYPE "alloc-token"
61
62namespace {
63
64//===--- Command-line options ---------------------------------------------===//
65
66cl::opt<std::string> ClFuncPrefix("alloc-token-prefix",
67 cl::desc("The allocation function prefix"),
68 cl::Hidden, cl::init("__alloc_token_"));
69
71 ClMaxTokens("alloc-token-max",
72 cl::desc("Maximum number of tokens (0 = target SIZE_MAX)"),
74
76 ClFastABI("alloc-token-fast-abi",
77 cl::desc("The token ID is encoded in the function name"),
78 cl::Hidden, cl::init(false));
79
80// Instrument libcalls only by default - compatible allocators only need to take
81// care of providing standard allocation functions. With extended coverage, also
82// instrument non-libcall allocation function calls with !alloc_token
83// metadata.
85 ClExtended("alloc-token-extended",
86 cl::desc("Extend coverage to custom allocation functions"),
87 cl::Hidden, cl::init(false));
88
89// C++ defines ::operator new (and variants) as replaceable (vs. standard
90// library versions), which are nobuiltin, and are therefore not covered by
91// isAllocationFn(). Cover by default, as users of AllocToken are already
92// required to provide token-aware allocation functions (no defaults).
93cl::opt<bool> ClCoverReplaceableNew("alloc-token-cover-replaceable-new",
94 cl::desc("Cover replaceable operator new"),
95 cl::Hidden, cl::init(true));
96
97cl::opt<uint64_t> ClFallbackToken(
98 "alloc-token-fallback",
99 cl::desc("The default fallback token where none could be determined"),
100 cl::Hidden, cl::init(0));
101
102//===--- Statistics -------------------------------------------------------===//
103
104STATISTIC(NumFunctionsModified, "Functions modified");
105STATISTIC(NumAllocationsInstrumented, "Allocations instrumented");
106
107//===----------------------------------------------------------------------===//
108
109/// Returns the !alloc_token metadata if available.
110///
111/// Expected format is: !{<type-name>, <contains-pointer>}
112MDNode *getAllocTokenMetadata(const CallBase &CB) {
113 MDNode *Ret = nullptr;
114 if (auto *II = dyn_cast<IntrinsicInst>(&CB);
115 II && II->getIntrinsicID() == Intrinsic::alloc_token_id) {
116 auto *MDV = cast<MetadataAsValue>(II->getArgOperand(0));
117 Ret = cast<MDNode>(MDV->getMetadata());
118 // If the intrinsic has an empty MDNode, type inference failed.
119 if (Ret->getNumOperands() == 0)
120 return nullptr;
121 } else {
122 Ret = CB.getMetadata(LLVMContext::MD_alloc_token);
123 if (!Ret)
124 return nullptr;
125 }
126 assert(Ret->getNumOperands() == 2 && "bad !alloc_token");
129 return Ret;
130}
131
132bool containsPointer(const MDNode *MD) {
134 auto *CI = cast<ConstantInt>(C->getValue());
135 return CI->getValue().getBoolValue();
136}
137
138class ModeBase {
139public:
140 explicit ModeBase(const IntegerType &TokenTy, uint64_t MaxTokens)
141 : MaxTokens(MaxTokens ? MaxTokens : TokenTy.getBitMask()) {
142 assert(MaxTokens <= TokenTy.getBitMask());
143 }
144
145protected:
146 uint64_t boundedToken(uint64_t Val) const {
147 assert(MaxTokens != 0);
148 return Val % MaxTokens;
149 }
150
151 const uint64_t MaxTokens;
152};
153
154/// Implementation for TokenMode::Increment.
155class IncrementMode : public ModeBase {
156public:
157 using ModeBase::ModeBase;
158
159 uint64_t operator()(const CallBase &CB, OptimizationRemarkEmitter &) {
160 return boundedToken(Counter++);
161 }
162
163private:
164 uint64_t Counter = 0;
165};
166
167/// Implementation for TokenMode::Random.
168class RandomMode : public ModeBase {
169public:
170 RandomMode(const IntegerType &TokenTy, uint64_t MaxTokens,
171 std::unique_ptr<RandomNumberGenerator> RNG)
172 : ModeBase(TokenTy, MaxTokens), RNG(std::move(RNG)) {}
173 uint64_t operator()(const CallBase &CB, OptimizationRemarkEmitter &) {
174 return boundedToken((*RNG)());
175 }
176
177private:
178 std::unique_ptr<RandomNumberGenerator> RNG;
179};
180
181/// Implementation for TokenMode::TypeHash. The implementation ensures
182/// hashes are stable across different compiler invocations. Uses SipHash as the
183/// hash function.
184class TypeHashMode : public ModeBase {
185public:
186 using ModeBase::ModeBase;
187
188 uint64_t operator()(const CallBase &CB, OptimizationRemarkEmitter &ORE) {
189
190 if (MDNode *N = getAllocTokenMetadata(CB)) {
191 MDString *S = cast<MDString>(N->getOperand(0));
192 AllocTokenMetadata Metadata{S->getString(), containsPointer(N)};
193 if (auto Token = getAllocToken(TokenMode::TypeHash, Metadata, MaxTokens))
194 return *Token;
195 }
196 // Fallback.
197 remarkNoMetadata(CB, ORE);
198 return ClFallbackToken;
199 }
200
201protected:
202 /// Remark that there was no precise type information.
203 static void remarkNoMetadata(const CallBase &CB,
205 ORE.emit([&] {
206 ore::NV FuncNV("Function", CB.getParent()->getParent());
207 const Function *Callee = CB.getCalledFunction();
208 ore::NV CalleeNV("Callee", Callee ? Callee->getName() : "<unknown>");
209 return OptimizationRemark(DEBUG_TYPE, "NoAllocToken", &CB)
210 << "Call to '" << CalleeNV << "' in '" << FuncNV
211 << "' without source-level type token";
212 });
213 }
214};
215
216/// Implementation for TokenMode::TypeHashPointerSplit.
217class TypeHashPointerSplitMode : public TypeHashMode {
218public:
219 using TypeHashMode::TypeHashMode;
220
221 uint64_t operator()(const CallBase &CB, OptimizationRemarkEmitter &ORE) {
222 if (MDNode *N = getAllocTokenMetadata(CB)) {
223 MDString *S = cast<MDString>(N->getOperand(0));
224 AllocTokenMetadata Metadata{S->getString(), containsPointer(N)};
226 MaxTokens))
227 return *Token;
228 }
229 // Pick the fallback token (ClFallbackToken), which by default is 0, meaning
230 // it'll fall into the pointer-less bucket. Override by setting
231 // -alloc-token-fallback if that is the wrong choice.
232 remarkNoMetadata(CB, ORE);
233 return ClFallbackToken;
234 }
235};
236
237// Apply opt overrides and module flags.
238static AllocTokenOptions resolveOptions(AllocTokenOptions Opts,
239 const Module &M) {
240 auto IntModuleFlagOrNull = [&](StringRef Key) {
241 return mdconst::extract_or_null<ConstantInt>(M.getModuleFlag(Key));
242 };
243
244 if (auto *S = dyn_cast_or_null<MDString>(M.getModuleFlag("alloc-token-mode")))
245 if (auto Mode = getAllocTokenModeFromString(S->getString()))
246 Opts.Mode = *Mode;
247 if (auto *Val = IntModuleFlagOrNull("alloc-token-max"))
248 Opts.MaxTokens = Val->getZExtValue();
249 if (auto *Val = IntModuleFlagOrNull("alloc-token-fast-abi"))
250 Opts.FastABI |= Val->isOne();
251 if (auto *Val = IntModuleFlagOrNull("alloc-token-extended"))
252 Opts.Extended |= Val->isOne();
253
254 // Allow overriding options from command line options.
255 if (ClMaxTokens.getNumOccurrences())
256 Opts.MaxTokens = ClMaxTokens;
257 if (ClFastABI.getNumOccurrences())
258 Opts.FastABI = ClFastABI;
259 if (ClExtended.getNumOccurrences())
260 Opts.Extended = ClExtended;
261
262 return Opts;
263}
264
265class AllocToken {
266public:
267 explicit AllocToken(AllocTokenOptions Opts, Module &M,
269 : Options(resolveOptions(std::move(Opts), M)), Mod(M),
270 FAM(MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager()),
271 Mode(IncrementMode(*IntPtrTy, Options.MaxTokens)) {
272 switch (Options.Mode) {
274 break;
276 Mode.emplace<RandomMode>(*IntPtrTy, Options.MaxTokens,
277 M.createRNG(DEBUG_TYPE));
278 break;
280 Mode.emplace<TypeHashMode>(*IntPtrTy, Options.MaxTokens);
281 break;
283 Mode.emplace<TypeHashPointerSplitMode>(*IntPtrTy, Options.MaxTokens);
284 break;
285 }
286 }
287
288 bool instrumentFunction(Function &F);
289
290private:
291 /// Returns the LibFunc (or NotLibFunc) if this call should be instrumented.
292 std::optional<LibFunc>
293 shouldInstrumentCall(const CallBase &CB, const TargetLibraryInfo &TLI) const;
294
295 /// Returns true for functions that are eligible for instrumentation.
296 static bool isInstrumentableLibFunc(LibFunc Func, const CallBase &CB,
297 const TargetLibraryInfo &TLI);
298
299 /// Returns true for isAllocationFn() functions that we should ignore.
300 static bool ignoreInstrumentableLibFunc(LibFunc Func);
301
302 /// Replace a call/invoke with a call/invoke to the allocation function
303 /// with token ID.
304 bool replaceAllocationCall(CallBase *CB, LibFunc Func,
306 const TargetLibraryInfo &TLI);
307
308 /// Return replacement function for a LibFunc that takes a token ID.
309 FunctionCallee getTokenAllocFunction(const CallBase &CB, uint64_t TokenID,
310 LibFunc OriginalFunc);
311
312 /// Lower alloc_token_* intrinsics.
313 void replaceIntrinsicInst(IntrinsicInst *II, OptimizationRemarkEmitter &ORE);
314
315 /// Return the token ID from metadata in the call.
317 return std::visit([&](auto &&Mode) { return Mode(CB, ORE); }, Mode);
318 }
319
321 Module &Mod;
322 IntegerType *IntPtrTy = Mod.getDataLayout().getIntPtrType(Mod.getContext());
324 // Cache for replacement functions.
326 // Selected mode.
327 std::variant<IncrementMode, RandomMode, TypeHashMode,
328 TypeHashPointerSplitMode>
329 Mode;
330};
331
332bool AllocToken::instrumentFunction(Function &F) {
333 // Do not apply any instrumentation for naked functions.
334 if (F.hasFnAttribute(Attribute::Naked))
335 return false;
336 // Don't touch available_externally functions, their actual body is elsewhere.
337 if (F.getLinkage() == GlobalValue::AvailableExternallyLinkage)
338 return false;
339
341 SmallVector<IntrinsicInst *, 4> IntrinsicInsts;
342
343 // Only instrument functions that have the sanitize_alloc_token attribute.
344 const bool InstrumentFunction =
345 F.hasFnAttribute(Attribute::SanitizeAllocToken) &&
346 !F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation);
347
348 // Get TLI only when required.
349 const TargetLibraryInfo *TLI =
350 InstrumentFunction ? &FAM.getResult<TargetLibraryAnalysis>(F) : nullptr;
351
352 // Collect all allocation calls to avoid iterator invalidation.
353 for (Instruction &I : instructions(F)) {
354 // Collect all alloc_token_* intrinsics.
355 if (auto *II = dyn_cast<IntrinsicInst>(&I);
356 II && II->getIntrinsicID() == Intrinsic::alloc_token_id) {
357 IntrinsicInsts.emplace_back(II);
358 continue;
359 }
360
361 if (!InstrumentFunction)
362 continue;
363
364 auto *CB = dyn_cast<CallBase>(&I);
365 if (!CB)
366 continue;
367 if (std::optional<LibFunc> Func = shouldInstrumentCall(*CB, *TLI))
368 AllocCalls.emplace_back(CB, Func.value());
369 }
370
371 // Return early to avoid unnecessarily instantiating the ORE.
372 if (AllocCalls.empty() && IntrinsicInsts.empty())
373 return false;
374
375 auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
376 bool Modified = false;
377
378 for (auto &[CB, Func] : AllocCalls)
379 Modified |= replaceAllocationCall(CB, Func, ORE, *TLI);
380
381 for (auto *II : IntrinsicInsts) {
382 replaceIntrinsicInst(II, ORE);
383 Modified = true;
384 }
385
386 if (Modified)
387 NumFunctionsModified++;
388
389 return Modified;
390}
391
392std::optional<LibFunc>
393AllocToken::shouldInstrumentCall(const CallBase &CB,
394 const TargetLibraryInfo &TLI) const {
395 const Function *Callee = CB.getCalledFunction();
396 if (!Callee)
397 return std::nullopt;
398
399 // Ignore nobuiltin of the CallBase, so that we can cover nobuiltin libcalls
400 // if requested via isInstrumentableLibFunc(). Note that isAllocationFn() is
401 // returning false for nobuiltin calls.
402 LibFunc Func;
403 if (TLI.getLibFunc(*Callee, Func)) {
404 if (isInstrumentableLibFunc(Func, CB, TLI))
405 return Func;
406 } else if (Options.Extended && CB.getMetadata(LLVMContext::MD_alloc_token)) {
407 return NotLibFunc;
408 }
409
410 return std::nullopt;
411}
412
413bool AllocToken::isInstrumentableLibFunc(LibFunc Func, const CallBase &CB,
414 const TargetLibraryInfo &TLI) {
415 if (ignoreInstrumentableLibFunc(Func))
416 return false;
417
418 if (isAllocationFn(&CB, &TLI))
419 return true;
420
421 switch (Func) {
422 // These libfuncs don't return normal pointers, and are therefore not handled
423 // by isAllocationFn().
424 case LibFunc_posix_memalign:
425 case LibFunc_size_returning_new:
426 case LibFunc_size_returning_new_hot_cold:
427 case LibFunc_size_returning_new_aligned:
428 case LibFunc_size_returning_new_aligned_hot_cold:
429 return true;
430
431 // See comment above ClCoverReplaceableNew.
432 case LibFunc_Znwj:
433 case LibFunc_ZnwjRKSt9nothrow_t:
434 case LibFunc_ZnwjSt11align_val_t:
435 case LibFunc_ZnwjSt11align_val_tRKSt9nothrow_t:
436 case LibFunc_Znwm:
437 case LibFunc_Znwm12__hot_cold_t:
438 case LibFunc_ZnwmRKSt9nothrow_t:
439 case LibFunc_ZnwmRKSt9nothrow_t12__hot_cold_t:
440 case LibFunc_ZnwmSt11align_val_t:
441 case LibFunc_ZnwmSt11align_val_t12__hot_cold_t:
442 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t:
443 case LibFunc_ZnwmSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
444 case LibFunc_Znaj:
445 case LibFunc_ZnajRKSt9nothrow_t:
446 case LibFunc_ZnajSt11align_val_t:
447 case LibFunc_ZnajSt11align_val_tRKSt9nothrow_t:
448 case LibFunc_Znam:
449 case LibFunc_Znam12__hot_cold_t:
450 case LibFunc_ZnamRKSt9nothrow_t:
451 case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t:
452 case LibFunc_ZnamSt11align_val_t:
453 case LibFunc_ZnamSt11align_val_t12__hot_cold_t:
454 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t:
455 case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t:
456 return ClCoverReplaceableNew;
457
458 default:
459 return false;
460 }
461}
462
463bool AllocToken::ignoreInstrumentableLibFunc(LibFunc Func) {
464 switch (Func) {
465 case LibFunc_strdup:
466 case LibFunc_dunder_strdup:
467 case LibFunc_strndup:
468 case LibFunc_dunder_strndup:
469 return true;
470 default:
471 return false;
472 }
473}
474
475bool AllocToken::replaceAllocationCall(CallBase *CB, LibFunc Func,
477 const TargetLibraryInfo &TLI) {
478 uint64_t TokenID = getToken(*CB, ORE);
479
480 FunctionCallee TokenAlloc = getTokenAllocFunction(*CB, TokenID, Func);
481 if (!TokenAlloc)
482 return false;
483 NumAllocationsInstrumented++;
484
485 if (Options.FastABI) {
486 assert(TokenAlloc.getFunctionType()->getNumParams() == CB->arg_size());
487 CB->setCalledFunction(TokenAlloc);
488 return true;
489 }
490
491 IRBuilder<> IRB(CB);
492 // Original args.
493 SmallVector<Value *, 4> NewArgs{CB->args()};
494 // Add token ID, truncated to IntPtrTy width.
495 NewArgs.push_back(ConstantInt::get(IntPtrTy, TokenID));
496 assert(TokenAlloc.getFunctionType()->getNumParams() == NewArgs.size());
497
498 // Preserve invoke vs call semantics for exception handling.
499 CallBase *NewCall;
500 if (auto *II = dyn_cast<InvokeInst>(CB)) {
501 NewCall = IRB.CreateInvoke(TokenAlloc, II->getNormalDest(),
502 II->getUnwindDest(), NewArgs);
503 } else {
504 NewCall = IRB.CreateCall(TokenAlloc, NewArgs);
505 cast<CallInst>(NewCall)->setTailCall(CB->isTailCall());
506 }
507 NewCall->setCallingConv(CB->getCallingConv());
508 NewCall->copyMetadata(*CB);
509 NewCall->setAttributes(CB->getAttributes());
510
511 // Replace all uses and delete the old call.
512 CB->replaceAllUsesWith(NewCall);
513 CB->eraseFromParent();
514 return true;
515}
516
517FunctionCallee AllocToken::getTokenAllocFunction(const CallBase &CB,
518 uint64_t TokenID,
519 LibFunc OriginalFunc) {
520 std::optional<std::pair<LibFunc, uint64_t>> Key;
521 if (OriginalFunc != NotLibFunc) {
522 Key = std::make_pair(OriginalFunc, Options.FastABI ? TokenID : 0);
523 auto It = TokenAllocFunctions.find(*Key);
524 if (It != TokenAllocFunctions.end())
525 return It->second;
526 }
527
528 const Function *Callee = CB.getCalledFunction();
529 if (!Callee)
530 return FunctionCallee();
531 const FunctionType *OldFTy = Callee->getFunctionType();
532 if (OldFTy->isVarArg())
533 return FunctionCallee();
534 // Copy params, and append token ID type.
535 Type *RetTy = OldFTy->getReturnType();
536 SmallVector<Type *, 4> NewParams{OldFTy->params()};
537 std::string TokenAllocName = ClFuncPrefix;
538 if (Options.FastABI)
539 TokenAllocName += utostr(TokenID) + "_";
540 else
541 NewParams.push_back(IntPtrTy); // token ID
542 TokenAllocName += Callee->getName();
543 FunctionType *NewFTy = FunctionType::get(RetTy, NewParams, false);
544 FunctionCallee TokenAlloc = Mod.getOrInsertFunction(TokenAllocName, NewFTy);
545 if (Function *F = dyn_cast<Function>(TokenAlloc.getCallee()))
546 F->copyAttributesFrom(Callee); // preserve attrs
547
548 if (Key.has_value())
549 TokenAllocFunctions[*Key] = TokenAlloc;
550 return TokenAlloc;
551}
552
553void AllocToken::replaceIntrinsicInst(IntrinsicInst *II,
555 assert(II->getIntrinsicID() == Intrinsic::alloc_token_id);
556
557 uint64_t TokenID = getToken(*II, ORE);
558 Value *V = ConstantInt::get(IntPtrTy, TokenID);
559 II->replaceAllUsesWith(V);
560 II->eraseFromParent();
561}
562
563} // namespace
564
567
569 AllocToken Pass(Options, M, MAM);
570 bool Modified = false;
571
572 for (Function &F : M) {
573 if (F.empty())
574 continue; // declaration
575 Modified |= Pass.instrumentFunction(F);
576 }
577
580}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
#define DEBUG_TYPE
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
static LVOptions Options
Definition LVOptions.cpp:25
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
print mir2vec MIR2Vec Vocabulary Printer Pass
Definition MIR2Vec.cpp:593
This file contains the declarations for metadata subclasses.
uint64_t IntrinsicInst * II
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
This file contains some functions that are useful when dealing with strings.
AllocTokenMode TokenMode
LLVM_ABI AllocTokenPass(AllocTokenOptions Opts={})
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM)
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setCallingConv(CallingConv::ID CC)
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
CallingConv::ID getCallingConv() const
void setAttributes(AttributeList A)
Set the attributes for this call.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
void setCalledFunction(Function *Fn)
Sets the function called, including updating the function type.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
void setTailCall(bool IsTc=true)
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
FunctionType * getFunctionType()
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
InvokeInst * CreateInvoke(FunctionType *Ty, Value *Callee, BasicBlock *NormalDest, BasicBlock *UnwindDest, ArrayRef< Value * > Args, ArrayRef< OperandBundleDef > OpBundles, const Twine &Name="")
Create an invoke instruction.
Definition IRBuilder.h:1235
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2511
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2788
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
Class to represent integer types.
uint64_t getBitMask() const
Return a bitmask with ones set for all of the bits that can be set by an unsigned version of this typ...
A wrapper class for inspecting calls to intrinsic functions.
Metadata node.
Definition Metadata.h:1078
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1442
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1448
A single uniqued string.
Definition Metadata.h:721
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:618
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for applied optimization remarks.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
bool getLibFunc(StringRef funcName, LibFunc &F) const
Searches for a particular function name.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:546
int getNumOccurrences() const
const ParentTy * getParent() const
Definition ilist_node.h:34
Pass manager infrastructure for declaring and invalidating analyses.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
Definition Metadata.h:682
DiagnosticInfoOptimizationBase::Argument NV
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::optional< uint64_t > getAllocToken(AllocTokenMode Mode, const AllocTokenMetadata &Metadata, uint64_t MaxTokens)
Calculates stable allocation token ID.
LLVM_ABI std::pair< StringRef, StringRef > getToken(StringRef Source, StringRef Delimiters=" \t\n\v\f\r")
getToken - This function extracts one token from source, ignoring any leading characters that appear ...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
std::string utostr(uint64_t X, bool isNeg=false)
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
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:1867
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isAllocationFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates or reallocates memory (eith...
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
AllocTokenMode
Modes for generating allocation token IDs.
Definition AllocToken.h:24
@ TypeHash
Token ID based on allocated type hash.
Definition AllocToken.h:32
@ Random
Simple mode that returns a statically-assigned random token ID.
Definition AllocToken.h:29
@ Increment
Incrementally increasing token ID.
Definition AllocToken.h:26
@ TypeHashPointerSplit
Token ID based on allocated type hash, where the top half ID-space is reserved for types that contain...
Definition AllocToken.h:37
LLVM_ABI std::optional< AllocTokenMode > getAllocTokenModeFromString(StringRef Name)
Returns the AllocTokenMode from its canonical string name; if an invalid name was provided returns nu...
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:867
#define N
Metadata about an allocation used to generate a token ID.
Definition AllocToken.h:53
AllocTokenMode Mode
Definition AllocToken.h:27