LLVM 22.0.0git
Function.cpp
Go to the documentation of this file.
1//===- Function.cpp - Implement the Global object classes -----------------===//
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 the Function class for the IR library.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/IR/Function.h"
15#include "llvm/ADT/ArrayRef.h"
16#include "llvm/ADT/BitVector.h"
17#include "llvm/ADT/DenseSet.h"
18#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/Argument.h"
24#include "llvm/IR/Attributes.h"
25#include "llvm/IR/BasicBlock.h"
26#include "llvm/IR/Constant.h"
28#include "llvm/IR/Constants.h"
30#include "llvm/IR/GlobalValue.h"
32#include "llvm/IR/Instruction.h"
34#include "llvm/IR/Intrinsics.h"
35#include "llvm/IR/LLVMContext.h"
36#include "llvm/IR/MDBuilder.h"
37#include "llvm/IR/Metadata.h"
38#include "llvm/IR/Module.h"
39#include "llvm/IR/Operator.h"
42#include "llvm/IR/Type.h"
43#include "llvm/IR/Use.h"
44#include "llvm/IR/User.h"
45#include "llvm/IR/Value.h"
51#include "llvm/Support/ModRef.h"
52#include <cassert>
53#include <cstddef>
54#include <cstdint>
55#include <cstring>
56#include <string>
57
58using namespace llvm;
60
61// Explicit instantiations of SymbolTableListTraits since some of the methods
62// are not in the public header file...
64
66 "non-global-value-max-name-size", cl::Hidden, cl::init(1024),
67 cl::desc("Maximum size for the name of non-global values."));
68
70 validateBlockNumbers();
71
72 NextBlockNum = 0;
73 for (auto &BB : *this)
74 BB.Number = NextBlockNum++;
75 BlockNumEpoch++;
76}
77
78void Function::validateBlockNumbers() const {
79#ifndef NDEBUG
80 BitVector Numbers(NextBlockNum);
81 for (const auto &BB : *this) {
82 unsigned Num = BB.getNumber();
83 assert(Num < NextBlockNum && "out of range block number");
84 assert(!Numbers[Num] && "duplicate block numbers");
85 Numbers.set(Num);
86 }
87#endif
88}
89
91 for (auto &BB : *this) {
92 BB.convertToNewDbgValues();
93 }
94}
95
97 for (auto &BB : *this) {
98 BB.convertFromNewDbgValues();
99 }
100}
101
102//===----------------------------------------------------------------------===//
103// Argument Implementation
104//===----------------------------------------------------------------------===//
105
106Argument::Argument(Type *Ty, const Twine &Name, Function *Par, unsigned ArgNo)
107 : Value(Ty, Value::ArgumentVal), Parent(Par), ArgNo(ArgNo) {
108 setName(Name);
109}
110
111void Argument::setParent(Function *parent) {
112 Parent = parent;
113}
114
115bool Argument::hasNonNullAttr(bool AllowUndefOrPoison) const {
116 if (!getType()->isPointerTy()) return false;
117 if (getParent()->hasParamAttribute(getArgNo(), Attribute::NonNull) &&
118 (AllowUndefOrPoison ||
119 getParent()->hasParamAttribute(getArgNo(), Attribute::NoUndef)))
120 return true;
121 else if (getDereferenceableBytes() > 0 &&
124 return true;
125 return false;
126}
127
128bool Argument::hasByValAttr() const {
129 if (!getType()->isPointerTy()) return false;
130 return hasAttribute(Attribute::ByVal);
131}
132
134 if (!getType()->isPointerTy())
135 return false;
136 return hasAttribute(Attribute::DeadOnReturn);
137}
138
139bool Argument::hasByRefAttr() const {
140 if (!getType()->isPointerTy())
141 return false;
142 return hasAttribute(Attribute::ByRef);
143}
144
145bool Argument::hasSwiftSelfAttr() const {
146 return getParent()->hasParamAttribute(getArgNo(), Attribute::SwiftSelf);
147}
148
149bool Argument::hasSwiftErrorAttr() const {
150 return getParent()->hasParamAttribute(getArgNo(), Attribute::SwiftError);
151}
152
153bool Argument::hasInAllocaAttr() const {
154 if (!getType()->isPointerTy()) return false;
155 return hasAttribute(Attribute::InAlloca);
156}
157
159 if (!getType()->isPointerTy())
160 return false;
161 return hasAttribute(Attribute::Preallocated);
162}
163
165 if (!getType()->isPointerTy()) return false;
166 AttributeList Attrs = getParent()->getAttributes();
167 return Attrs.hasParamAttr(getArgNo(), Attribute::ByVal) ||
168 Attrs.hasParamAttr(getArgNo(), Attribute::InAlloca) ||
169 Attrs.hasParamAttr(getArgNo(), Attribute::Preallocated);
170}
171
173 if (!getType()->isPointerTy())
174 return false;
175 AttributeList Attrs = getParent()->getAttributes();
176 return Attrs.hasParamAttr(getArgNo(), Attribute::ByVal) ||
177 Attrs.hasParamAttr(getArgNo(), Attribute::StructRet) ||
178 Attrs.hasParamAttr(getArgNo(), Attribute::InAlloca) ||
179 Attrs.hasParamAttr(getArgNo(), Attribute::Preallocated) ||
180 Attrs.hasParamAttr(getArgNo(), Attribute::ByRef);
181}
182
183/// For a byval, sret, inalloca, or preallocated parameter, get the in-memory
184/// parameter type.
185static Type *getMemoryParamAllocType(AttributeSet ParamAttrs) {
186 // FIXME: All the type carrying attributes are mutually exclusive, so there
187 // should be a single query to get the stored type that handles any of them.
188 if (Type *ByValTy = ParamAttrs.getByValType())
189 return ByValTy;
190 if (Type *ByRefTy = ParamAttrs.getByRefType())
191 return ByRefTy;
192 if (Type *PreAllocTy = ParamAttrs.getPreallocatedType())
193 return PreAllocTy;
194 if (Type *InAllocaTy = ParamAttrs.getInAllocaType())
195 return InAllocaTy;
196 if (Type *SRetTy = ParamAttrs.getStructRetType())
197 return SRetTy;
198
199 return nullptr;
200}
201
203 AttributeSet ParamAttrs =
204 getParent()->getAttributes().getParamAttrs(getArgNo());
205 if (Type *MemTy = getMemoryParamAllocType(ParamAttrs))
206 return DL.getTypeAllocSize(MemTy);
207 return 0;
208}
209
211 AttributeSet ParamAttrs =
212 getParent()->getAttributes().getParamAttrs(getArgNo());
213 return getMemoryParamAllocType(ParamAttrs);
214}
215
217 assert(getType()->isPointerTy() && "Only pointers have alignments");
218 return getParent()->getParamAlign(getArgNo());
219}
220
222 return getParent()->getParamStackAlign(getArgNo());
223}
224
225Type *Argument::getParamByValType() const {
226 assert(getType()->isPointerTy() && "Only pointers have byval types");
227 return getParent()->getParamByValType(getArgNo());
228}
229
231 assert(getType()->isPointerTy() && "Only pointers have sret types");
232 return getParent()->getParamStructRetType(getArgNo());
233}
234
235Type *Argument::getParamByRefType() const {
236 assert(getType()->isPointerTy() && "Only pointers have byref types");
237 return getParent()->getParamByRefType(getArgNo());
238}
239
240Type *Argument::getParamInAllocaType() const {
241 assert(getType()->isPointerTy() && "Only pointers have inalloca types");
242 return getParent()->getParamInAllocaType(getArgNo());
243}
244
247 "Only pointers have dereferenceable bytes");
248 return getParent()->getParamDereferenceableBytes(getArgNo());
249}
250
253 "Only pointers have dereferenceable bytes");
254 return getParent()->getParamDereferenceableOrNullBytes(getArgNo());
255}
256
257FPClassTest Argument::getNoFPClass() const {
258 return getParent()->getParamNoFPClass(getArgNo());
259}
260
261std::optional<ConstantRange> Argument::getRange() const {
262 const Attribute RangeAttr = getAttribute(llvm::Attribute::Range);
263 if (RangeAttr.isValid())
264 return RangeAttr.getRange();
265 return std::nullopt;
266}
267
268bool Argument::hasNestAttr() const {
269 if (!getType()->isPointerTy()) return false;
270 return hasAttribute(Attribute::Nest);
271}
272
273bool Argument::hasNoAliasAttr() const {
274 if (!getType()->isPointerTy()) return false;
275 return hasAttribute(Attribute::NoAlias);
276}
277
278bool Argument::hasNoCaptureAttr() const {
279 if (!getType()->isPointerTy()) return false;
280 return capturesNothing(getAttributes().getCaptureInfo());
281}
282
283bool Argument::hasNoFreeAttr() const {
284 if (!getType()->isPointerTy()) return false;
285 return hasAttribute(Attribute::NoFree);
286}
287
288bool Argument::hasStructRetAttr() const {
289 if (!getType()->isPointerTy()) return false;
290 return hasAttribute(Attribute::StructRet);
291}
292
293bool Argument::hasInRegAttr() const {
294 return hasAttribute(Attribute::InReg);
295}
296
297bool Argument::hasReturnedAttr() const {
298 return hasAttribute(Attribute::Returned);
299}
300
301bool Argument::hasZExtAttr() const {
302 return hasAttribute(Attribute::ZExt);
303}
304
305bool Argument::hasSExtAttr() const {
306 return hasAttribute(Attribute::SExt);
307}
308
309bool Argument::onlyReadsMemory() const {
310 AttributeList Attrs = getParent()->getAttributes();
311 return Attrs.hasParamAttr(getArgNo(), Attribute::ReadOnly) ||
312 Attrs.hasParamAttr(getArgNo(), Attribute::ReadNone);
313}
314
315void Argument::addAttrs(AttrBuilder &B) {
316 AttributeList AL = getParent()->getAttributes();
317 AL = AL.addParamAttributes(Parent->getContext(), getArgNo(), B);
318 getParent()->setAttributes(AL);
319}
320
322 getParent()->addParamAttr(getArgNo(), Kind);
323}
324
325void Argument::addAttr(Attribute Attr) {
326 getParent()->addParamAttr(getArgNo(), Attr);
327}
328
330 getParent()->removeParamAttr(getArgNo(), Kind);
331}
332
333void Argument::removeAttrs(const AttributeMask &AM) {
334 AttributeList AL = getParent()->getAttributes();
335 AL = AL.removeParamAttributes(Parent->getContext(), getArgNo(), AM);
336 getParent()->setAttributes(AL);
337}
338
340 return getParent()->hasParamAttribute(getArgNo(), Kind);
341}
342
343bool Argument::hasAttribute(StringRef Kind) const {
344 return getParent()->hasParamAttribute(getArgNo(), Kind);
345}
346
347Attribute Argument::getAttribute(Attribute::AttrKind Kind) const {
348 return getParent()->getParamAttribute(getArgNo(), Kind);
349}
350
352 return getParent()->getAttributes().getParamAttrs(getArgNo());
353}
354
355//===----------------------------------------------------------------------===//
356// Helper Methods in Function
357//===----------------------------------------------------------------------===//
358
360 return getType()->getContext();
361}
362
363const DataLayout &Function::getDataLayout() const {
364 return getParent()->getDataLayout();
365}
366
367unsigned Function::getInstructionCount() const {
368 unsigned NumInstrs = 0;
369 for (const BasicBlock &BB : BasicBlocks)
370 NumInstrs += std::distance(BB.instructionsWithoutDebug().begin(),
371 BB.instructionsWithoutDebug().end());
372 return NumInstrs;
373}
374
376 const Twine &N, Module &M) {
377 return Create(Ty, Linkage, M.getDataLayout().getProgramAddressSpace(), N, &M);
378}
379
381 LinkageTypes Linkage,
382 unsigned AddrSpace, const Twine &N,
383 Module *M) {
384 auto *F = new (AllocMarker) Function(Ty, Linkage, AddrSpace, N, M);
385 AttrBuilder B(F->getContext());
386 UWTableKind UWTable = M->getUwtable();
387 if (UWTable != UWTableKind::None)
388 B.addUWTableAttr(UWTable);
389 switch (M->getFramePointer()) {
391 // 0 ("none") is the default.
392 break;
394 B.addAttribute("frame-pointer", "reserved");
395 break;
397 B.addAttribute("frame-pointer", "non-leaf");
398 break;
400 B.addAttribute("frame-pointer", "non-leaf-no-reserve");
401 break;
403 B.addAttribute("frame-pointer", "all");
404 break;
405 }
406 if (M->getModuleFlag("function_return_thunk_extern"))
407 B.addAttribute(Attribute::FnRetThunkExtern);
408 StringRef DefaultCPU = F->getContext().getDefaultTargetCPU();
409 if (!DefaultCPU.empty())
410 B.addAttribute("target-cpu", DefaultCPU);
411 StringRef DefaultFeatures = F->getContext().getDefaultTargetFeatures();
412 if (!DefaultFeatures.empty())
413 B.addAttribute("target-features", DefaultFeatures);
414
415 // Check if the module attribute is present and not zero.
416 auto isModuleAttributeSet = [&](const StringRef &ModAttr) -> bool {
417 const auto *Attr =
418 mdconst::extract_or_null<ConstantInt>(M->getModuleFlag(ModAttr));
419 return Attr && !Attr->isZero();
420 };
421
422 auto AddAttributeIfSet = [&](const StringRef &ModAttr) {
423 if (isModuleAttributeSet(ModAttr))
424 B.addAttribute(ModAttr);
425 };
426
427 StringRef SignType = "none";
428 if (isModuleAttributeSet("sign-return-address"))
429 SignType = "non-leaf";
430 if (isModuleAttributeSet("sign-return-address-all"))
431 SignType = "all";
432 if (SignType != "none") {
433 B.addAttribute("sign-return-address", SignType);
434 B.addAttribute("sign-return-address-key",
435 isModuleAttributeSet("sign-return-address-with-bkey")
436 ? "b_key"
437 : "a_key");
438 }
439 AddAttributeIfSet("branch-target-enforcement");
440 AddAttributeIfSet("branch-protection-pauth-lr");
441 AddAttributeIfSet("guarded-control-stack");
442
443 F->addFnAttrs(B);
444 return F;
445}
446
448 getParent()->getFunctionList().remove(getIterator());
449}
450
452 getParent()->getFunctionList().erase(getIterator());
453}
454
456 Function::iterator FromBeginIt,
457 Function::iterator FromEndIt) {
458#ifdef EXPENSIVE_CHECKS
459 // Check that FromBeginIt is before FromEndIt.
460 auto FromFEnd = FromF->end();
461 for (auto It = FromBeginIt; It != FromEndIt; ++It)
462 assert(It != FromFEnd && "FromBeginIt not before FromEndIt!");
463#endif // EXPENSIVE_CHECKS
464 BasicBlocks.splice(ToIt, FromF->BasicBlocks, FromBeginIt, FromEndIt);
465}
466
468 Function::iterator ToIt) {
469 return BasicBlocks.erase(FromIt, ToIt);
470}
471
472//===----------------------------------------------------------------------===//
473// Function Implementation
474//===----------------------------------------------------------------------===//
475
476static unsigned computeAddrSpace(unsigned AddrSpace, Module *M) {
477 // If AS == -1 and we are passed a valid module pointer we place the function
478 // in the program address space. Otherwise we default to AS0.
479 if (AddrSpace == static_cast<unsigned>(-1))
480 return M ? M->getDataLayout().getProgramAddressSpace() : 0;
481 return AddrSpace;
482}
483
484Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace,
485 const Twine &name, Module *ParentModule)
486 : GlobalObject(Ty, Value::FunctionVal, AllocMarker, Linkage, name,
487 computeAddrSpace(AddrSpace, ParentModule)),
488 NumArgs(Ty->getNumParams()) {
489 assert(FunctionType::isValidReturnType(getReturnType()) &&
490 "invalid return type");
491 setGlobalObjectSubClassData(0);
492
493 // We only need a symbol table for a function if the context keeps value names
494 if (!getContext().shouldDiscardValueNames())
495 SymTab = std::make_unique<ValueSymbolTable>(NonGlobalValueMaxNameSize);
496
497 // If the function has arguments, mark them as lazily built.
498 if (Ty->getNumParams())
499 setValueSubclassData(1); // Set the "has lazy arguments" bit.
500
501 if (ParentModule) {
502 ParentModule->getFunctionList().push_back(this);
503 }
504
505 HasLLVMReservedName = getName().starts_with("llvm.");
506 // Ensure intrinsics have the right parameter attributes.
507 // Note, the IntID field will have been set in Value::setName if this function
508 // name is a valid intrinsic ID.
509 if (IntID) {
510 // Don't set the attributes if the intrinsic signature is invalid. This
511 // case will either be auto-upgraded or fail verification.
512 SmallVector<Type *> OverloadTys;
513 if (!Intrinsic::getIntrinsicSignature(IntID, Ty, OverloadTys))
514 return;
515
516 setAttributes(Intrinsic::getAttributes(getContext(), IntID, Ty));
517 }
518}
519
521 validateBlockNumbers();
522
523 dropAllReferences(); // After this it is safe to delete instructions.
524
525 // Delete all of the method arguments and unlink from symbol table...
526 if (Arguments)
527 clearArguments();
528
529 // Remove the function from the on-the-side GC table.
530 clearGC();
531}
532
533void Function::BuildLazyArguments() const {
534 // Create the arguments vector, all arguments start out unnamed.
535 auto *FT = getFunctionType();
536 if (NumArgs > 0) {
537 Arguments = std::allocator<Argument>().allocate(NumArgs);
538 for (unsigned i = 0, e = NumArgs; i != e; ++i) {
539 Type *ArgTy = FT->getParamType(i);
540 assert(!ArgTy->isVoidTy() && "Cannot have void typed arguments!");
541 new (Arguments + i) Argument(ArgTy, "", const_cast<Function *>(this), i);
542 }
543 }
544
545 // Clear the lazy arguments bit.
546 unsigned SDC = getSubclassDataFromValue();
547 SDC &= ~(1 << 0);
548 const_cast<Function*>(this)->setValueSubclassData(SDC);
549 assert(!hasLazyArguments());
550}
551
553 return MutableArrayRef<Argument>(Args, Count);
554}
555
558}
559
560void Function::clearArguments() {
561 for (Argument &A : makeArgArray(Arguments, NumArgs)) {
562 A.setName("");
563 A.~Argument();
564 }
565 std::allocator<Argument>().deallocate(Arguments, NumArgs);
566 Arguments = nullptr;
567}
568
570 assert(isDeclaration() && "Expected no references to current arguments");
571
572 // Drop the current arguments, if any, and set the lazy argument bit.
573 if (!hasLazyArguments()) {
575 [](const Argument &A) { return A.use_empty(); }) &&
576 "Expected arguments to be unused in declaration");
577 clearArguments();
578 setValueSubclassData(getSubclassDataFromValue() | (1 << 0));
579 }
580
581 // Nothing to steal if Src has lazy arguments.
582 if (Src.hasLazyArguments())
583 return;
584
585 // Steal arguments from Src, and fix the lazy argument bits.
586 assert(arg_size() == Src.arg_size());
587 Arguments = Src.Arguments;
588 Src.Arguments = nullptr;
589 for (Argument &A : makeArgArray(Arguments, NumArgs)) {
590 // FIXME: This does the work of transferNodesFromList inefficiently.
592 if (A.hasName())
593 Name = A.getName();
594 if (!Name.empty())
595 A.setName("");
596 A.setParent(this);
597 if (!Name.empty())
598 A.setName(Name);
599 }
600
601 setValueSubclassData(getSubclassDataFromValue() & ~(1 << 0));
602 assert(!hasLazyArguments());
603 Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0));
604}
605
606void Function::deleteBodyImpl(bool ShouldDrop) {
607 setIsMaterializable(false);
608
609 for (BasicBlock &BB : *this)
611
612 // Delete all basic blocks. They are now unused, except possibly by
613 // blockaddresses, but BasicBlock's destructor takes care of those.
614 while (!BasicBlocks.empty())
615 BasicBlocks.begin()->eraseFromParent();
616
617 if (getNumOperands()) {
618 if (ShouldDrop) {
619 // Drop uses of any optional data (real or placeholder).
621 setNumHungOffUseOperands(0);
622 } else {
623 // The code needs to match Function::allocHungoffUselist().
625 Op<0>().set(CPN);
626 Op<1>().set(CPN);
627 Op<2>().set(CPN);
628 }
629 setValueSubclassData(getSubclassDataFromValue() & ~0xe);
630 }
631
632 // Metadata is stored in a side-table.
633 clearMetadata();
634}
635
636void Function::addAttributeAtIndex(unsigned i, Attribute Attr) {
637 AttributeSets = AttributeSets.addAttributeAtIndex(getContext(), i, Attr);
638}
639
641 AttributeSets = AttributeSets.addFnAttribute(getContext(), Kind);
642}
643
645 AttributeSets = AttributeSets.addFnAttribute(getContext(), Kind, Val);
646}
647
648void Function::addFnAttr(Attribute Attr) {
649 AttributeSets = AttributeSets.addFnAttribute(getContext(), Attr);
650}
651
652void Function::addFnAttrs(const AttrBuilder &Attrs) {
653 AttributeSets = AttributeSets.addFnAttributes(getContext(), Attrs);
654}
655
657 AttributeSets = AttributeSets.addRetAttribute(getContext(), Kind);
658}
659
660void Function::addRetAttr(Attribute Attr) {
661 AttributeSets = AttributeSets.addRetAttribute(getContext(), Attr);
662}
663
664void Function::addRetAttrs(const AttrBuilder &Attrs) {
665 AttributeSets = AttributeSets.addRetAttributes(getContext(), Attrs);
666}
667
668void Function::addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
669 AttributeSets = AttributeSets.addParamAttribute(getContext(), ArgNo, Kind);
670}
671
672void Function::addParamAttr(unsigned ArgNo, Attribute Attr) {
673 AttributeSets = AttributeSets.addParamAttribute(getContext(), ArgNo, Attr);
674}
675
676void Function::addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs) {
677 AttributeSets = AttributeSets.addParamAttributes(getContext(), ArgNo, Attrs);
678}
679
681 AttributeSets = AttributeSets.removeAttributeAtIndex(getContext(), i, Kind);
682}
683
684void Function::removeAttributeAtIndex(unsigned i, StringRef Kind) {
685 AttributeSets = AttributeSets.removeAttributeAtIndex(getContext(), i, Kind);
686}
687
689 AttributeSets = AttributeSets.removeFnAttribute(getContext(), Kind);
690}
691
693 AttributeSets = AttributeSets.removeFnAttribute(getContext(), Kind);
694}
695
697 AttributeSets = AttributeSets.removeFnAttributes(getContext(), AM);
698}
699
701 AttributeSets = AttributeSets.removeRetAttribute(getContext(), Kind);
702}
703
705 AttributeSets = AttributeSets.removeRetAttribute(getContext(), Kind);
706}
707
708void Function::removeRetAttrs(const AttributeMask &Attrs) {
709 AttributeSets = AttributeSets.removeRetAttributes(getContext(), Attrs);
710}
711
712void Function::removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
713 AttributeSets = AttributeSets.removeParamAttribute(getContext(), ArgNo, Kind);
714}
715
716void Function::removeParamAttr(unsigned ArgNo, StringRef Kind) {
717 AttributeSets = AttributeSets.removeParamAttribute(getContext(), ArgNo, Kind);
718}
719
720void Function::removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs) {
721 AttributeSets =
722 AttributeSets.removeParamAttributes(getContext(), ArgNo, Attrs);
723}
724
725void Function::addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes) {
726 AttributeSets =
727 AttributeSets.addDereferenceableParamAttr(getContext(), ArgNo, Bytes);
728}
729
731 return AttributeSets.hasFnAttr(Kind);
732}
733
734bool Function::hasFnAttribute(StringRef Kind) const {
735 return AttributeSets.hasFnAttr(Kind);
736}
737
739 return AttributeSets.hasRetAttr(Kind);
740}
741
742bool Function::hasParamAttribute(unsigned ArgNo,
743 Attribute::AttrKind Kind) const {
744 return AttributeSets.hasParamAttr(ArgNo, Kind);
745}
746
747bool Function::hasParamAttribute(unsigned ArgNo, StringRef Kind) const {
748 return AttributeSets.hasParamAttr(ArgNo, Kind);
749}
750
751Attribute Function::getAttributeAtIndex(unsigned i,
752 Attribute::AttrKind Kind) const {
753 return AttributeSets.getAttributeAtIndex(i, Kind);
754}
755
756Attribute Function::getAttributeAtIndex(unsigned i, StringRef Kind) const {
757 return AttributeSets.getAttributeAtIndex(i, Kind);
758}
759
760bool Function::hasAttributeAtIndex(unsigned Idx,
761 Attribute::AttrKind Kind) const {
762 return AttributeSets.hasAttributeAtIndex(Idx, Kind);
763}
764
765Attribute Function::getFnAttribute(Attribute::AttrKind Kind) const {
766 return AttributeSets.getFnAttr(Kind);
767}
768
769Attribute Function::getFnAttribute(StringRef Kind) const {
770 return AttributeSets.getFnAttr(Kind);
771}
772
774 return AttributeSets.getRetAttr(Kind);
775}
776
778 uint64_t Default) const {
779 Attribute A = getFnAttribute(Name);
781 if (A.isStringAttribute()) {
782 StringRef Str = A.getValueAsString();
783 if (Str.getAsInteger(0, Result))
784 getContext().emitError("cannot parse integer attribute " + Name);
785 }
786
787 return Result;
788}
789
790/// gets the specified attribute from the list of attributes.
791Attribute Function::getParamAttribute(unsigned ArgNo,
792 Attribute::AttrKind Kind) const {
793 return AttributeSets.getParamAttr(ArgNo, Kind);
794}
795
797 uint64_t Bytes) {
798 AttributeSets = AttributeSets.addDereferenceableOrNullParamAttr(getContext(),
799 ArgNo, Bytes);
800}
801
803 AttributeSets = AttributeSets.addRangeRetAttr(getContext(), CR);
804}
805
807 if (&FPType == &APFloat::IEEEsingle()) {
808 DenormalMode Mode = getDenormalModeF32Raw();
809 // If the f32 variant of the attribute isn't specified, try to use the
810 // generic one.
811 if (Mode.isValid())
812 return Mode;
813 }
814
815 return getDenormalModeRaw();
816}
817
819 Attribute Attr = getFnAttribute("denormal-fp-math");
820 StringRef Val = Attr.getValueAsString();
821 return parseDenormalFPAttribute(Val);
822}
823
825 Attribute Attr = getFnAttribute("denormal-fp-math-f32");
826 if (Attr.isValid()) {
827 StringRef Val = Attr.getValueAsString();
828 return parseDenormalFPAttribute(Val);
829 }
830
832}
833
834const std::string &Function::getGC() const {
835 assert(hasGC() && "Function has no collector");
836 return getContext().getGC(*this);
837}
838
839void Function::setGC(std::string Str) {
840 setValueSubclassDataBit(14, !Str.empty());
841 getContext().setGC(*this, std::move(Str));
842}
843
844void Function::clearGC() {
845 if (!hasGC())
846 return;
847 getContext().deleteGC(*this);
848 setValueSubclassDataBit(14, false);
849}
850
852 return hasFnAttribute(Attribute::StackProtect) ||
853 hasFnAttribute(Attribute::StackProtectStrong) ||
854 hasFnAttribute(Attribute::StackProtectReq);
855}
856
857/// Copy all additional attributes (those not needed to create a Function) from
858/// the Function Src to this one.
859void Function::copyAttributesFrom(const Function *Src) {
861 setCallingConv(Src->getCallingConv());
862 setAttributes(Src->getAttributes());
863 if (Src->hasGC())
864 setGC(Src->getGC());
865 else
866 clearGC();
867 if (Src->hasPersonalityFn())
868 setPersonalityFn(Src->getPersonalityFn());
869 if (Src->hasPrefixData())
870 setPrefixData(Src->getPrefixData());
871 if (Src->hasPrologueData())
872 setPrologueData(Src->getPrologueData());
873}
874
876 return getAttributes().getMemoryEffects();
877}
880}
881
882/// Determine if the function does not access memory.
884 return getMemoryEffects().doesNotAccessMemory();
885}
888}
889
890/// Determine if the function does not access or only reads memory.
891bool Function::onlyReadsMemory() const {
892 return getMemoryEffects().onlyReadsMemory();
893}
895 setMemoryEffects(getMemoryEffects() & MemoryEffects::readOnly());
896}
897
898/// Determine if the function does not access or only writes memory.
899bool Function::onlyWritesMemory() const {
900 return getMemoryEffects().onlyWritesMemory();
901}
903 setMemoryEffects(getMemoryEffects() & MemoryEffects::writeOnly());
904}
905
906/// Determine if the call can access memory only using pointers based
907/// on its arguments.
909 return getMemoryEffects().onlyAccessesArgPointees();
910}
912 setMemoryEffects(getMemoryEffects() & MemoryEffects::argMemOnly());
913}
914
915/// Determine if the function may only access memory that is
916/// inaccessible from the IR.
918 return getMemoryEffects().onlyAccessesInaccessibleMem();
919}
922}
923
924/// Determine if the function may only access memory that is
925/// either inaccessible from the IR or pointed to by its arguments.
927 return getMemoryEffects().onlyAccessesInaccessibleOrArgMem();
928}
930 setMemoryEffects(getMemoryEffects() &
932}
933
934bool Function::isTargetIntrinsic() const {
935 return Intrinsic::isTargetIntrinsic(IntID);
936}
937
939 LibFuncCache = UnknownLibFunc;
941 if (!Name.starts_with("llvm.")) {
942 HasLLVMReservedName = false;
944 return;
945 }
946 HasLLVMReservedName = true;
947 IntID = Intrinsic::lookupIntrinsicID(Name);
948}
949
950/// hasAddressTaken - returns true if there are any uses of this function
951/// other than direct calls or invokes to it. Optionally ignores callback
952/// uses, assume like pointer annotation calls, and references in llvm.used
953/// and llvm.compiler.used variables.
954bool Function::hasAddressTaken(const User **PutOffender,
955 bool IgnoreCallbackUses,
956 bool IgnoreAssumeLikeCalls, bool IgnoreLLVMUsed,
957 bool IgnoreARCAttachedCall,
958 bool IgnoreCastedDirectCall) const {
959 for (const Use &U : uses()) {
960 const User *FU = U.getUser();
961 if (IgnoreCallbackUses) {
962 AbstractCallSite ACS(&U);
963 if (ACS && ACS.isCallbackCall())
964 continue;
965 }
966
967 const auto *Call = dyn_cast<CallBase>(FU);
968 if (!Call) {
969 if (IgnoreAssumeLikeCalls &&
971 all_of(FU->users(), [](const User *U) {
972 if (const auto *I = dyn_cast<IntrinsicInst>(U))
973 return I->isAssumeLikeIntrinsic();
974 return false;
975 })) {
976 continue;
977 }
978
979 if (IgnoreLLVMUsed && !FU->user_empty()) {
980 const User *FUU = FU;
982 FU->hasOneUse() && !FU->user_begin()->user_empty())
983 FUU = *FU->user_begin();
984 if (llvm::all_of(FUU->users(), [](const User *U) {
985 if (const auto *GV = dyn_cast<GlobalVariable>(U))
986 return GV->hasName() &&
987 (GV->getName() == "llvm.compiler.used" ||
988 GV->getName() == "llvm.used");
989 return false;
990 }))
991 continue;
992 }
993 if (PutOffender)
994 *PutOffender = FU;
995 return true;
996 }
997
998 if (IgnoreAssumeLikeCalls) {
999 if (const auto *I = dyn_cast<IntrinsicInst>(Call))
1000 if (I->isAssumeLikeIntrinsic())
1001 continue;
1002 }
1003
1004 if (!Call->isCallee(&U) || (!IgnoreCastedDirectCall &&
1005 Call->getFunctionType() != getFunctionType())) {
1006 if (IgnoreARCAttachedCall &&
1007 Call->isOperandBundleOfType(LLVMContext::OB_clang_arc_attachedcall,
1008 U.getOperandNo()))
1009 continue;
1010
1011 if (PutOffender)
1012 *PutOffender = FU;
1013 return true;
1014 }
1015 }
1016 return false;
1017}
1018
1019bool Function::isDefTriviallyDead() const {
1020 // Check the linkage
1021 if (!hasLinkOnceLinkage() && !hasLocalLinkage() &&
1022 !hasAvailableExternallyLinkage())
1023 return false;
1024
1025 return use_empty();
1026}
1027
1028/// callsFunctionThatReturnsTwice - Return true if the function has a call to
1029/// setjmp or other function that gcc recognizes as "returning twice".
1031 for (const Instruction &I : instructions(this))
1032 if (const auto *Call = dyn_cast<CallBase>(&I))
1033 if (Call->hasFnAttr(Attribute::ReturnsTwice))
1034 return true;
1035
1036 return false;
1037}
1038
1040 assert(hasPersonalityFn() && getNumOperands());
1041 return cast<Constant>(Op<0>());
1042}
1043
1045 setHungoffOperand<0>(Fn);
1046 setValueSubclassDataBit(3, Fn != nullptr);
1047}
1048
1050 assert(hasPrefixData() && getNumOperands());
1051 return cast<Constant>(Op<1>());
1052}
1053
1054void Function::setPrefixData(Constant *PrefixData) {
1055 setHungoffOperand<1>(PrefixData);
1056 setValueSubclassDataBit(1, PrefixData != nullptr);
1057}
1058
1060 assert(hasPrologueData() && getNumOperands());
1061 return cast<Constant>(Op<2>());
1062}
1063
1064void Function::setPrologueData(Constant *PrologueData) {
1065 setHungoffOperand<2>(PrologueData);
1066 setValueSubclassDataBit(2, PrologueData != nullptr);
1067}
1068
1069void Function::allocHungoffUselist() {
1070 // If we've already allocated a uselist, stop here.
1071 if (getNumOperands())
1072 return;
1073
1074 allocHungoffUses(3, /*IsPhi=*/ false);
1075 setNumHungOffUseOperands(3);
1076
1077 // Initialize the uselist with placeholder operands to allow traversal.
1079 Op<0>().set(CPN);
1080 Op<1>().set(CPN);
1081 Op<2>().set(CPN);
1082}
1083
1084template <int Idx>
1085void Function::setHungoffOperand(Constant *C) {
1086 if (C) {
1087 allocHungoffUselist();
1088 Op<Idx>().set(C);
1089 } else if (getNumOperands()) {
1091 }
1092}
1093
1094void Function::setValueSubclassDataBit(unsigned Bit, bool On) {
1095 assert(Bit < 16 && "SubclassData contains only 16 bits");
1096 if (On)
1097 setValueSubclassData(getSubclassDataFromValue() | (1 << Bit));
1098 else
1099 setValueSubclassData(getSubclassDataFromValue() & ~(1 << Bit));
1100}
1101
1103 const DenseSet<GlobalValue::GUID> *S) {
1104#if !defined(NDEBUG)
1105 auto PrevCount = getEntryCount();
1106 assert(!PrevCount || PrevCount->getType() == Count.getType());
1107#endif
1108
1109 auto ImportGUIDs = getImportGUIDs();
1110 if (S == nullptr && ImportGUIDs.size())
1111 S = &ImportGUIDs;
1112
1113 MDBuilder MDB(getContext());
1114 setMetadata(
1115 LLVMContext::MD_prof,
1116 MDB.createFunctionEntryCount(Count.getCount(), Count.isSynthetic(), S));
1117}
1118
1120 const DenseSet<GlobalValue::GUID> *Imports) {
1121 setEntryCount(ProfileCount(Count, Type), Imports);
1122}
1123
1124std::optional<ProfileCount> Function::getEntryCount(bool AllowSynthetic) const {
1125 MDNode *MD = getMetadata(LLVMContext::MD_prof);
1126 if (MD && MD->getOperand(0))
1127 if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0))) {
1128 if (MDS->getString() == MDProfLabels::FunctionEntryCount) {
1131 // A value of -1 is used for SamplePGO when there were no samples.
1132 // Treat this the same as unknown.
1133 if (Count == (uint64_t)-1)
1134 return std::nullopt;
1135 return ProfileCount(Count, PCT_Real);
1136 } else if (AllowSynthetic &&
1137 MDS->getString() ==
1141 return ProfileCount(Count, PCT_Synthetic);
1142 }
1143 }
1144 return std::nullopt;
1145}
1146
1149 if (MDNode *MD = getMetadata(LLVMContext::MD_prof))
1150 if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0)))
1151 if (MDS->getString() == MDProfLabels::FunctionEntryCount)
1152 for (unsigned i = 2; i < MD->getNumOperands(); i++)
1154 ->getValue()
1155 .getZExtValue());
1156 return R;
1157}
1158
1159bool Function::nullPointerIsDefined() const {
1160 return hasFnAttribute(Attribute::NullPointerIsValid);
1161}
1162
1163unsigned Function::getVScaleValue() const {
1164 Attribute Attr = getFnAttribute(Attribute::VScaleRange);
1165 if (!Attr.isValid())
1166 return 0;
1167
1168 unsigned VScale = Attr.getVScaleRangeMin();
1169 if (VScale && VScale == Attr.getVScaleRangeMax())
1170 return VScale;
1171
1172 return 0;
1173}
1174
1175bool llvm::NullPointerIsDefined(const Function *F, unsigned AS) {
1176 if (F && F->nullPointerIsDefined())
1177 return true;
1178
1179 if (AS != 0)
1180 return true;
1181
1182 return false;
1183}
1184
1186 switch (CC) {
1187 case CallingConv::C:
1188 case CallingConv::Fast:
1189 case CallingConv::Cold:
1190 case CallingConv::GHC:
1191 case CallingConv::HiPE:
1195 case CallingConv::Swift:
1197 case CallingConv::Tail:
1212 case CallingConv::Win64:
1220 return true;
1225 return false;
1243 case CallingConv::GRAAL:
1260 return true;
1261 default:
1262 return false;
1263 }
1264
1265 llvm_unreachable("covered callingconv switch");
1266}
static unsigned getIntrinsicID(const SDNode *N)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Lower Kernel Arguments
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static bool setMemoryEffects(Function &F, MemoryEffects ME)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_EXPORT_TEMPLATE
Definition Compiler.h:215
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Finalize Linkage
This file defines the DenseSet and SmallDenseSet classes.
@ Default
Module.h This file contains the declarations for the Module class.
This defines the Use class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
This file contains the declarations for metadata subclasses.
This file contains the declarations for profiling metadata utility functions.
static StringRef getName(Value *V)
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")))
static const char * name
This file contains some templates that are useful if you are working with the STL at all.
static Type * getMemoryParamAllocType(AttributeSet ParamAttrs)
For a byval, sret, inalloca, or preallocated parameter, get the in-memory parameter type.
Definition Function.cpp:185
static cl::opt< int > NonGlobalValueMaxNameSize("non-global-value-max-name-size", cl::Hidden, cl::init(1024), cl::desc("Maximum size for the name of non-global values."))
static MutableArrayRef< Argument > makeArgArray(Argument *Args, size_t Count)
Definition Function.cpp:552
static unsigned computeAddrSpace(unsigned AddrSpace, Module *M)
Definition Function.cpp:476
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1541
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM_ABI Type * getParamByRefType() const
If this is a byref argument, return its type.
Definition Function.cpp:235
LLVM_ABI bool hasDeadOnReturnAttr() const
Return true if this argument has the dead_on_return attribute.
Definition Function.cpp:133
LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const
Definition Function.cpp:347
LLVM_ABI bool hasNoAliasAttr() const
Return true if this argument has the noalias attribute.
Definition Function.cpp:273
LLVM_ABI bool hasNonNullAttr(bool AllowUndefOrPoison=true) const
Return true if this argument has the nonnull attribute.
Definition Function.cpp:115
LLVM_ABI bool hasByRefAttr() const
Return true if this argument has the byref attribute.
Definition Function.cpp:139
LLVM_ABI uint64_t getDereferenceableOrNullBytes() const
If this argument has the dereferenceable_or_null attribute, return the number of bytes known to be de...
Definition Function.cpp:251
LLVM_ABI void addAttr(Attribute::AttrKind Kind)
Definition Function.cpp:321
LLVM_ABI Argument(Type *Ty, const Twine &Name="", Function *F=nullptr, unsigned ArgNo=0)
Argument constructor.
Definition Function.cpp:106
LLVM_ABI bool onlyReadsMemory() const
Return true if this argument has the readonly or readnone attribute.
Definition Function.cpp:309
LLVM_ABI bool hasPointeeInMemoryValueAttr() const
Return true if this argument has the byval, sret, inalloca, preallocated, or byref attribute.
Definition Function.cpp:172
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:339
LLVM_ABI bool hasReturnedAttr() const
Return true if this argument has the returned attribute.
Definition Function.cpp:297
LLVM_ABI Type * getParamStructRetType() const
If this is an sret argument, return its type.
Definition Function.cpp:230
LLVM_ABI bool hasInRegAttr() const
Return true if this argument has the inreg attribute.
Definition Function.cpp:293
LLVM_ABI bool hasByValAttr() const
Return true if this argument has the byval attribute.
Definition Function.cpp:128
LLVM_ABI bool hasPreallocatedAttr() const
Return true if this argument has the preallocated attribute.
Definition Function.cpp:158
LLVM_ABI bool hasSExtAttr() const
Return true if this argument has the sext attribute.
Definition Function.cpp:305
LLVM_ABI void removeAttr(Attribute::AttrKind Kind)
Remove attributes from an argument.
Definition Function.cpp:329
LLVM_ABI uint64_t getPassPointeeByValueCopySize(const DataLayout &DL) const
If this argument satisfies has hasPassPointeeByValueAttr, return the in-memory ABI size copied to the...
Definition Function.cpp:202
LLVM_ABI void removeAttrs(const AttributeMask &AM)
Definition Function.cpp:333
LLVM_ABI Type * getPointeeInMemoryValueType() const
If hasPointeeInMemoryValueAttr returns true, the in-memory ABI type is returned.
Definition Function.cpp:210
LLVM_ABI bool hasInAllocaAttr() const
Return true if this argument has the inalloca attribute.
Definition Function.cpp:153
LLVM_ABI bool hasSwiftErrorAttr() const
Return true if this argument has the swifterror attribute.
Definition Function.cpp:149
LLVM_ABI FPClassTest getNoFPClass() const
If this argument has nofpclass attribute, return the mask representing disallowed floating-point valu...
Definition Function.cpp:257
LLVM_ABI void addAttrs(AttrBuilder &B)
Add attributes to an argument.
Definition Function.cpp:315
LLVM_ABI bool hasNoFreeAttr() const
Return true if this argument has the nofree attribute.
Definition Function.cpp:283
LLVM_ABI bool hasSwiftSelfAttr() const
Return true if this argument has the swiftself attribute.
Definition Function.cpp:145
LLVM_ABI Type * getParamInAllocaType() const
If this is an inalloca argument, return its type.
Definition Function.cpp:240
LLVM_ABI bool hasZExtAttr() const
Return true if this argument has the zext attribute.
Definition Function.cpp:301
LLVM_ABI Type * getParamByValType() const
If this is a byval argument, return its type.
Definition Function.cpp:225
LLVM_ABI bool hasNestAttr() const
Return true if this argument has the nest attribute.
Definition Function.cpp:268
LLVM_ABI MaybeAlign getParamAlign() const
If this is a byval or inalloca argument, return its alignment.
Definition Function.cpp:216
LLVM_ABI std::optional< ConstantRange > getRange() const
If this argument has a range attribute, return the value range of the argument.
Definition Function.cpp:261
LLVM_ABI bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
Definition Function.cpp:288
LLVM_ABI AttributeSet getAttributes() const
Definition Function.cpp:351
LLVM_ABI bool hasPassPointeeByValueCopyAttr() const
Return true if this argument has the byval, inalloca, or preallocated attribute.
Definition Function.cpp:164
LLVM_ABI MaybeAlign getParamStackAlign() const
Definition Function.cpp:221
LLVM_ABI bool hasNoCaptureAttr() const
Return true if this argument has the nocapture attribute.
Definition Function.cpp:278
LLVM_ABI uint64_t getDereferenceableBytes() const
If this argument has the dereferenceable attribute, return the number of bytes known to be dereferenc...
Definition Function.cpp:245
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:361
LLVM_ABI Type * getInAllocaType() const
LLVM_ABI Type * getByValType() const
LLVM_ABI Type * getStructRetType() const
LLVM_ABI Type * getPreallocatedType() const
LLVM_ABI Type * getByRefType() const
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:88
static LLVM_ABI Attribute getWithMemoryEffects(LLVMContext &Context, MemoryEffects ME)
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI void dropAllReferences()
Cause all subinstructions to "let go" of all the references that said subinstructions are maintaining...
This is the shared class of boolean and integer constants.
Definition Constants.h:87
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:154
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
Definition Type.cpp:398
Class to represent profile counts.
Definition Function.h:297
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
Definition Function.cpp:640
unsigned getVScaleValue() const
Return the value for vscale based on the vscale_range attribute or 0 when unknown.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:166
void addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs)
adds the attributes to the list of attributes for the given arg.
Definition Function.cpp:676
void removeRetAttr(Attribute::AttrKind Kind)
removes the attribute from the return value list of attributes.
Definition Function.cpp:700
void addRetAttrs(const AttrBuilder &Attrs)
Add return value attributes to this function.
Definition Function.cpp:664
bool isDefTriviallyDead() const
isDefTriviallyDead - Return true if it is trivially safe to remove this function definition from the ...
bool onlyAccessesInaccessibleMemOrArgMem() const
Determine if the function may only access memory that is either inaccessible from the IR or pointed t...
Definition Function.cpp:926
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition Function.h:759
BasicBlockListType::iterator iterator
Definition Function.h:69
bool hasAddressTaken(const User **=nullptr, bool IgnoreCallbackUses=false, bool IgnoreAssumeLikeCalls=true, bool IngoreLLVMUsed=false, bool IgnoreARCAttachedCall=false, bool IgnoreCastedDirectCall=false) const
hasAddressTaken - returns true if there are any uses of this function other than direct calls or invo...
Definition Function.cpp:954
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
Definition Function.cpp:712
bool nullPointerIsDefined() const
Check if null pointer dereferencing is considered undefined behavior for the function.
Attribute getParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
gets the specified attribute from the list of attributes.
Definition Function.cpp:791
void setPrefixData(Constant *PrefixData)
bool hasStackProtectorFnAttr() const
Returns true if the function has ssp, sspstrong, or sspreq fn attrs.
Definition Function.cpp:851
void removeFromParent()
removeFromParent - This method unlinks 'this' from the containing module, but does not delete it.
Definition Function.cpp:447
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
Definition Function.cpp:363
void addFnAttrs(const AttrBuilder &Attrs)
Add function attributes to this function.
Definition Function.cpp:652
void renumberBlocks()
Renumber basic blocks into a dense value range starting from 0.
Definition Function.cpp:69
void setDoesNotAccessMemory()
Definition Function.cpp:886
void setGC(std::string Str)
Definition Function.cpp:839
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition Function.cpp:765
uint64_t getFnAttributeAsParsedInteger(StringRef Kind, uint64_t Default=0) const
For a string attribute Kind, parse attribute as an integer.
Definition Function.cpp:777
bool isConstrainedFPIntrinsic() const
Returns true if the function is one of the "Constrained Floating-PointIntrinsics".
Definition Function.cpp:556
void setOnlyAccessesArgMemory()
Definition Function.cpp:911
MemoryEffects getMemoryEffects() const
Definition Function.cpp:875
void setOnlyAccessesInaccessibleMemory()
Definition Function.cpp:920
void removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs)
removes the attribute from the list of attributes.
Definition Function.cpp:720
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:742
bool hasAttributeAtIndex(unsigned Idx, Attribute::AttrKind Kind) const
Check if attribute of the given kind is set at the given index.
Definition Function.cpp:760
static Function * createWithDefaultAttr(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Creates a function with some attributes recorded in llvm.module.flags and the LLVMContext applied.
Definition Function.cpp:380
void setOnlyReadsMemory()
Definition Function.cpp:894
bool isTargetIntrinsic() const
isTargetIntrinsic - Returns true if this function is an intrinsic and the intrinsic is specific to a ...
Definition Function.cpp:934
void removeFnAttrs(const AttributeMask &Attrs)
Definition Function.cpp:696
DenormalMode getDenormalModeRaw() const
Return the representational value of "denormal-fp-math".
Definition Function.cpp:818
void addRetAttr(Attribute::AttrKind Kind)
Add return value attributes to this function.
Definition Function.cpp:656
DenormalMode getDenormalModeF32Raw() const
Return the representational value of "denormal-fp-math-f32".
Definition Function.cpp:824
Constant * getPrologueData() const
Get the prologue data associated with this function.
void convertFromNewDbgValues()
Definition Function.cpp:96
Constant * getPersonalityFn() const
Get the personality function associated with this function.
void setOnlyWritesMemory()
Definition Function.cpp:902
void setPersonalityFn(Constant *Fn)
DenseSet< GlobalValue::GUID > getImportGUIDs() const
Returns the set of GUIDs that needs to be imported to the function for sample PGO,...
void removeAttributeAtIndex(unsigned i, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
Definition Function.cpp:680
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Function.cpp:451
void removeFnAttr(Attribute::AttrKind Kind)
Remove function attributes from this function.
Definition Function.cpp:688
void addDereferenceableOrNullParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable_or_null attribute to the list of attributes for the given arg.
Definition Function.cpp:796
void addRangeRetAttr(const ConstantRange &CR)
adds the range attribute to the list of attributes for the return value.
Definition Function.cpp:802
void stealArgumentListFrom(Function &Src)
Steal arguments from another function.
Definition Function.cpp:569
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:359
const std::string & getGC() const
Definition Function.cpp:834
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Definition Function.cpp:668
bool doesNotAccessMemory() const
Determine if the function does not access memory.
Definition Function.cpp:883
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition Function.cpp:806
void updateAfterNameChange()
Update internal caches that depend on the function name (such as the intrinsic ID and libcall cache).
Definition Function.cpp:938
bool callsFunctionThatReturnsTwice() const
callsFunctionThatReturnsTwice - Return true if the function has a call to setjmp or other function th...
bool hasRetAttribute(Attribute::AttrKind Kind) const
check if an attribute is in the list of attributes for the return value.
Definition Function.cpp:738
bool onlyWritesMemory() const
Determine if the function does not access or only writes memory.
Definition Function.cpp:899
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
Definition Function.cpp:917
void setPrologueData(Constant *PrologueData)
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
Definition Function.cpp:708
bool onlyAccessesArgMemory() const
Determine if the call can access memory only using pointers based on its arguments.
Definition Function.cpp:908
Function::iterator erase(Function::iterator FromIt, Function::iterator ToIt)
Erases a range of BasicBlocks from FromIt to (not including) ToIt.
Definition Function.cpp:467
void setMemoryEffects(MemoryEffects ME)
Definition Function.cpp:878
Constant * getPrefixData() const
Get the prefix data associated with this function.
Attribute getAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) const
gets the attribute from the list of attributes.
Definition Function.cpp:751
iterator end()
Definition Function.h:853
void convertToNewDbgValues()
Definition Function.cpp:90
void setOnlyAccessesInaccessibleMemOrArgMem()
Definition Function.cpp:929
void setEntryCount(ProfileCount Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
void addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes for the given arg.
Definition Function.cpp:725
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in this function.
Definition Function.cpp:367
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
Definition Function.cpp:891
void addAttributeAtIndex(unsigned i, Attribute Attr)
adds the attribute to the list of attributes.
Definition Function.cpp:636
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:859
Attribute getRetAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind for the return value.
Definition Function.cpp:773
LLVM_ABI void copyAttributesFrom(const GlobalObject *Src)
Definition Globals.cpp:155
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
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
static MemoryEffectsBase readOnly()
Definition ModRef.h:125
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:135
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:141
static MemoryEffectsBase writeOnly()
Definition ModRef.h:130
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:158
static MemoryEffectsBase none()
Definition ModRef.h:120
const FunctionListType & getFunctionList() const
Get the Module's list of functions (constant).
Definition Module.h:596
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
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
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
void dropAllReferences()
Drop all references to operands.
Definition User.h:349
user_iterator user_begin()
Definition Value.h:402
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
iterator_range< user_iterator > users()
Definition Value.h:426
bool user_empty() const
Definition Value.h:389
void push_back(pointer val)
Definition ilist.h:250
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
LLVM_ABI LLVM_READNONE bool supportsNonVoidReturnType(CallingConv::ID CC)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ ARM64EC_Thunk_Native
Calling convention used in the ARM64EC ABI to implement calls between ARM64 code and thunks.
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ M68k_INTR
Used for M68k interrupt routines.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ MSP430_BUILTIN
Used for special MSP430 rtlib functions which have an "optimized" convention using additional registe...
@ AVR_SIGNAL
Used for AVR signal routines.
@ HiPE
Used by the High-Performance Erlang Compiler (HiPE).
Definition CallingConv.h:53
@ Swift
Calling convention for Swift.
Definition CallingConv.h:69
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
Definition CallingConv.h:82
@ AVR_INTR
Used for AVR interrupt routines.
@ PreserveMost
Used for runtime calls that preserves most registers.
Definition CallingConv.h:63
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition CallingConv.h:60
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ CXX_FAST_TLS
Used for access functions.
Definition CallingConv.h:72
@ X86_INTR
x86 hardware interrupt context.
@ RISCV_VLSCall_32
Calling convention used for RISC-V V-extension fixed vectors.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
@ WASM_EmscriptenInvoke
For emscripten __invoke_* functions.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AVR_BUILTIN
Used for special AVR rtlib functions which have an "optimized" convention to preserve registers.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
Definition CallingConv.h:50
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Definition CallingConv.h:47
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ X86_ThisCall
Similar to X86_StdCall.
@ PTX_Device
Call to a PTX device function.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
Definition CallingConv.h:66
@ X86_StdCall
stdcall is mostly used by the Win32 API.
Definition CallingConv.h:99
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ MSP430_INTR
Used for MSP430 interrupt routines.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
Definition CallingConv.h:90
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Definition CallingConv.h:76
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition CallingConv.h:87
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ ARM64EC_Thunk_X64
Calling convention used in the ARM64EC ABI to implement calls between x64 code and thunks.
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ X86_FastCall
'fast' analog of X86_StdCall.
LLVM_ABI bool isConstrainedFPIntrinsic(ID QID)
Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics".
LLVM_ABI ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
LLVM_ABI bool isTargetIntrinsic(ID IID)
isTargetIntrinsic - Returns true if IID is an intrinsic specific to a certain target.
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
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:667
constexpr double e
Context & getContext() const
Definition BasicBlock.h:99
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1725
unsigned getPointerAddressSpace(const Type *T)
Definition SPIRVUtils.h:345
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:296
UWTableKind
Definition CodeGen.h:154
@ None
No unwind table requested.
Definition CodeGen.h:155
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
bool isPointerTy(const Type *T)
Definition SPIRVUtils.h:339
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
Function::ProfileCount ProfileCount
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
DWARFExpression::Operation Op
DenormalMode parseDenormalFPAttribute(StringRef Str)
Returns the denormal mode to use for inputs and outputs.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool capturesNothing(CaptureComponents CC)
Definition ModRef.h:315
#define N
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getInvalid()
static LLVM_ABI const char * SyntheticFunctionEntryCount
static LLVM_ABI const char * FunctionEntryCount
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106