[Clang][CodeGen] Emit !alloc_token for new expressions (#162099)
For new expressions, the allocated type is syntactically known and we can trivially emit the !alloc_token metadata. A subsequent change will wire up the AllocToken pass and introduce appropriate tests. --- This change is part of the following series: 1. https://github.com/llvm/llvm-project/pull/160131 2. https://github.com/llvm/llvm-project/pull/156838 3. https://github.com/llvm/llvm-project/pull/162098 4. https://github.com/llvm/llvm-project/pull/162099 5. https://github.com/llvm/llvm-project/pull/156839 6. https://github.com/llvm/llvm-project/pull/156840 7. https://github.com/llvm/llvm-project/pull/156841 8. https://github.com/llvm/llvm-project/pull/156842
This commit is contained in:
parent
d0d18a80e5
commit
631719d0d9
@ -1272,6 +1272,23 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
|
||||
EmitCheck(std::make_pair(Check, CheckKind), CheckHandler, StaticData, Index);
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitAllocToken(llvm::CallBase *CB, QualType AllocType) {
|
||||
assert(SanOpts.has(SanitizerKind::AllocToken) &&
|
||||
"Only needed with -fsanitize=alloc-token");
|
||||
|
||||
PrintingPolicy Policy(CGM.getContext().getLangOpts());
|
||||
Policy.SuppressTagKeyword = true;
|
||||
Policy.FullyQualifiedName = true;
|
||||
SmallString<64> TypeName;
|
||||
llvm::raw_svector_ostream TypeNameOS(TypeName);
|
||||
AllocType.getCanonicalType().print(TypeNameOS, Policy);
|
||||
auto *TypeMDS = llvm::MDString::get(CGM.getLLVMContext(), TypeNameOS.str());
|
||||
|
||||
// Format: !{<type-name>}
|
||||
auto *MDN = llvm::MDNode::get(CGM.getLLVMContext(), {TypeMDS});
|
||||
CB->setMetadata(llvm::LLVMContext::MD_alloc_token, MDN);
|
||||
}
|
||||
|
||||
CodeGenFunction::ComplexPairTy CodeGenFunction::
|
||||
EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
|
||||
bool isInc, bool isPre) {
|
||||
|
||||
@ -1655,11 +1655,16 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||
RValue RV =
|
||||
EmitNewDeleteCall(*this, allocator, allocatorType, allocatorArgs);
|
||||
|
||||
// Set !heapallocsite metadata on the call to operator new.
|
||||
if (getDebugInfo())
|
||||
if (auto *newCall = dyn_cast<llvm::CallBase>(RV.getScalarVal()))
|
||||
getDebugInfo()->addHeapAllocSiteMetadata(newCall, allocType,
|
||||
E->getExprLoc());
|
||||
if (auto *newCall = dyn_cast<llvm::CallBase>(RV.getScalarVal())) {
|
||||
if (auto *CGDI = getDebugInfo()) {
|
||||
// Set !heapallocsite metadata on the call to operator new.
|
||||
CGDI->addHeapAllocSiteMetadata(newCall, allocType, E->getExprLoc());
|
||||
}
|
||||
if (SanOpts.has(SanitizerKind::AllocToken)) {
|
||||
// Set !alloc_token metadata.
|
||||
EmitAllocToken(newCall, allocType);
|
||||
}
|
||||
}
|
||||
|
||||
// If this was a call to a global replaceable allocation function that does
|
||||
// not take an alignment argument, the allocator is known to produce
|
||||
|
||||
@ -3348,6 +3348,9 @@ public:
|
||||
SanitizerAnnotateDebugInfo(ArrayRef<SanitizerKind::SanitizerOrdinal> Ordinals,
|
||||
SanitizerHandler Handler);
|
||||
|
||||
/// Emit additional metadata used by the AllocToken instrumentation.
|
||||
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType);
|
||||
|
||||
llvm::Value *GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FD,
|
||||
const FieldDecl *CountDecl);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user