LLVM 24.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;
59
60// Explicit instantiations of SymbolTableListTraits since some of the methods
61// are not in the public header file...
63
65 "non-global-value-max-name-size", cl::Hidden, cl::init(1024),
66 cl::desc("Maximum size for the name of non-global values."));
67
69 validateBlockNumbers();
70
71 NextBlockNum = 0;
72 for (auto &BB : *this)
73 BB.Number = NextBlockNum++;
74 BlockNumEpoch++;
75}
76
77void Function::validateBlockNumbers() const {
78#ifndef NDEBUG
79 BitVector Numbers(NextBlockNum);
80 for (const auto &BB : *this) {
81 unsigned Num = BB.getNumber();
82 assert(Num < NextBlockNum && "out of range block number");
83 assert(!Numbers[Num] && "duplicate block numbers");
84 Numbers.set(Num);
85 }
86#endif
87}
88
90 for (auto &BB : *this) {
91 BB.convertToNewDbgValues();
92 }
93}
94
96 for (auto &BB : *this) {
97 BB.convertFromNewDbgValues();
98 }
99}
100
101//===----------------------------------------------------------------------===//
102// Argument Implementation
103//===----------------------------------------------------------------------===//
104
105Argument::Argument(Type *Ty, const Twine &Name, Function *Par, unsigned ArgNo)
106 : Value(Ty, Value::ArgumentVal), Parent(Par), ArgNo(ArgNo) {
107 setName(Name);
108}
109
110void Argument::setParent(Function *parent) {
111 Parent = parent;
112}
113
114bool Argument::hasNonNullAttr(bool AllowUndefOrPoison) const {
115 if (!getType()->isPointerTy()) return false;
117 if (Attrs.hasAttribute(Attribute::NonNull) &&
118 (AllowUndefOrPoison || Attrs.hasAttribute(Attribute::NoUndef)))
119 return true;
120 else if (getDereferenceableBytes() > 0 &&
123 return true;
124 return false;
125}
126
127bool Argument::hasByValAttr() const {
128 if (!getType()->isPointerTy()) return false;
129 return hasAttribute(Attribute::ByVal);
130}
131
133 assert(getType()->isPointerTy() && "Only pointers have dead_on_return bytes");
134 return getParent()->getDeadOnReturnInfo(getArgNo());
135}
136
137bool Argument::hasByRefAttr() const {
138 if (!getType()->isPointerTy())
139 return false;
140 return hasAttribute(Attribute::ByRef);
141}
142
143bool Argument::hasSwiftSelfAttr() const {
144 return getParent()->hasParamAttribute(getArgNo(), Attribute::SwiftSelf);
145}
146
147bool Argument::hasSwiftErrorAttr() const {
148 return getParent()->hasParamAttribute(getArgNo(), Attribute::SwiftError);
149}
150
151bool Argument::hasInAllocaAttr() const {
152 if (!getType()->isPointerTy()) return false;
153 return hasAttribute(Attribute::InAlloca);
154}
155
157 if (!getType()->isPointerTy())
158 return false;
159 return hasAttribute(Attribute::Preallocated);
160}
161
163 if (!getType()->isPointerTy()) return false;
165 return Attrs.hasAttribute(Attribute::ByVal) ||
166 Attrs.hasAttribute(Attribute::InAlloca) ||
167 Attrs.hasAttribute(Attribute::Preallocated);
168}
169
171 if (!getType()->isPointerTy())
172 return false;
174 return Attrs.hasAttribute(Attribute::ByVal) ||
175 Attrs.hasAttribute(Attribute::StructRet) ||
176 Attrs.hasAttribute(Attribute::InAlloca) ||
177 Attrs.hasAttribute(Attribute::Preallocated) ||
178 Attrs.hasAttribute(Attribute::ByRef);
179}
180
181/// For a byval, sret, inalloca, or preallocated parameter, get the in-memory
182/// parameter type.
183static Type *getMemoryParamAllocType(AttributeSet ParamAttrs) {
184 // FIXME: All the type carrying attributes are mutually exclusive, so there
185 // should be a single query to get the stored type that handles any of them.
186 if (Type *ByValTy = ParamAttrs.getByValType())
187 return ByValTy;
188 if (Type *ByRefTy = ParamAttrs.getByRefType())
189 return ByRefTy;
190 if (Type *PreAllocTy = ParamAttrs.getPreallocatedType())
191 return PreAllocTy;
192 if (Type *InAllocaTy = ParamAttrs.getInAllocaType())
193 return InAllocaTy;
194 if (Type *SRetTy = ParamAttrs.getStructRetType())
195 return SRetTy;
196
197 return nullptr;
198}
199
201 if (Type *MemTy = getMemoryParamAllocType(getAttributes()))
202 return DL.getTypeAllocSize(MemTy);
203 return 0;
204}
205
208}
209
211 assert(getType()->isPointerTy() && "Only pointers have alignments");
212 return getParent()->getParamAlign(getArgNo());
213}
214
216 return getParent()->getParamStackAlign(getArgNo());
217}
218
219Type *Argument::getParamByValType() const {
220 assert(getType()->isPointerTy() && "Only pointers have byval types");
221 return getParent()->getParamByValType(getArgNo());
222}
223
225 assert(getType()->isPointerTy() && "Only pointers have sret types");
226 return getParent()->getParamStructRetType(getArgNo());
227}
228
229Type *Argument::getParamByRefType() const {
230 assert(getType()->isPointerTy() && "Only pointers have byref types");
231 return getParent()->getParamByRefType(getArgNo());
232}
233
234Type *Argument::getParamInAllocaType() const {
235 assert(getType()->isPointerTy() && "Only pointers have inalloca types");
236 return getParent()->getParamInAllocaType(getArgNo());
237}
238
241 "Only pointers have dereferenceable bytes");
242 return getParent()->getParamDereferenceableBytes(getArgNo());
243}
244
247 "Only pointers have dereferenceable bytes");
248 return getParent()->getParamDereferenceableOrNullBytes(getArgNo());
249}
250
251FPClassTest Argument::getNoFPClass() const {
252 return getParent()->getParamNoFPClass(getArgNo());
253}
254
255std::optional<ConstantRange> Argument::getRange() const {
256 const Attribute RangeAttr = getAttribute(llvm::Attribute::Range);
257 if (RangeAttr.isValid())
258 return RangeAttr.getRange();
259 return std::nullopt;
260}
261
262bool Argument::hasNestAttr() const {
263 if (!getType()->isPointerTy()) return false;
264 return hasAttribute(Attribute::Nest);
265}
266
267bool Argument::hasNoAliasAttr() const {
268 if (!getType()->isPointerTy()) return false;
269 return hasAttribute(Attribute::NoAlias);
270}
271
272bool Argument::hasNoCaptureAttr() const {
273 if (!getType()->isPointerTy()) return false;
274 return capturesNothing(getAttributes().getCaptureInfo());
275}
276
277bool Argument::hasNoFreeAttr() const {
278 if (!getType()->isPointerTy()) return false;
279 return hasAttribute(Attribute::NoFree);
280}
281
282bool Argument::hasStructRetAttr() const {
283 if (!getType()->isPointerTy()) return false;
284 return hasAttribute(Attribute::StructRet);
285}
286
287bool Argument::hasInRegAttr() const {
288 return hasAttribute(Attribute::InReg);
289}
290
291bool Argument::hasReturnedAttr() const {
292 return hasAttribute(Attribute::Returned);
293}
294
295bool Argument::hasZExtAttr() const {
296 return hasAttribute(Attribute::ZExt);
297}
298
299bool Argument::hasSExtAttr() const {
300 return hasAttribute(Attribute::SExt);
301}
302
303bool Argument::onlyReadsMemory() const {
305 return Attrs.hasAttribute(Attribute::ReadOnly) ||
306 Attrs.hasAttribute(Attribute::ReadNone);
307}
308
309void Argument::addAttrs(AttrBuilder &B) {
310 AttributeList AL = getParent()->getAttributes();
311 AL = AL.addParamAttributes(Parent->getContext(), getArgNo(), B);
312 getParent()->setAttributes(AL);
313}
314
316 getParent()->addParamAttr(getArgNo(), Kind);
317}
318
319void Argument::addAttr(Attribute Attr) {
320 getParent()->addParamAttr(getArgNo(), Attr);
321}
322
324 getParent()->removeParamAttr(getArgNo(), Kind);
325}
326
327void Argument::removeAttrs(const AttributeMask &AM) {
328 AttributeList AL = getParent()->getAttributes();
329 AL = AL.removeParamAttributes(Parent->getContext(), getArgNo(), AM);
330 getParent()->setAttributes(AL);
331}
332
334 return getParent()->hasParamAttribute(getArgNo(), Kind);
335}
336
337bool Argument::hasAttribute(StringRef Kind) const {
338 return getParent()->hasParamAttribute(getArgNo(), Kind);
339}
340
341Attribute Argument::getAttribute(Attribute::AttrKind Kind) const {
342 return getParent()->getParamAttribute(getArgNo(), Kind);
343}
344
346 return getParent()->getAttributes().getParamAttrs(getArgNo());
347}
348
349//===----------------------------------------------------------------------===//
350// Helper Methods in Function
351//===----------------------------------------------------------------------===//
352
354 return getType()->getContext();
355}
356
357const DataLayout &Function::getDataLayout() const {
358 return getParent()->getDataLayout();
359}
360
361unsigned Function::getInstructionCount() const {
362 unsigned NumInstrs = 0;
363 for (const BasicBlock &BB : BasicBlocks)
364 NumInstrs += BB.size();
365 return NumInstrs;
366}
367
369 const Twine &N, Module &M) {
370 return Create(Ty, Linkage, M.getDataLayout().getProgramAddressSpace(), N, &M);
371}
372
374 LinkageTypes Linkage,
375 unsigned AddrSpace, const Twine &N,
376 Module *M) {
377 auto *F = new (AllocMarker) Function(Ty, Linkage, AddrSpace, N, M);
378 AttrBuilder B(F->getContext());
379 UWTableKind UWTable = M->getUwtable();
380 if (UWTable != UWTableKind::None)
381 B.addUWTableAttr(UWTable);
382 switch (M->getFramePointer()) {
384 // 0 ("none") is the default.
385 break;
387 B.addAttribute("frame-pointer", "reserved");
388 break;
390 B.addAttribute("frame-pointer", "non-leaf");
391 break;
393 B.addAttribute("frame-pointer", "non-leaf-no-reserve");
394 break;
396 B.addAttribute("frame-pointer", "all");
397 break;
398 }
399 if (M->getModuleFlag("function_return_thunk_extern"))
400 B.addAttribute(Attribute::FnRetThunkExtern);
401 StringRef DefaultCPU = F->getContext().getDefaultTargetCPU();
402 if (!DefaultCPU.empty())
403 B.addAttribute("target-cpu", DefaultCPU);
404 StringRef DefaultFeatures = F->getContext().getDefaultTargetFeatures();
405 if (!DefaultFeatures.empty())
406 B.addAttribute("target-features", DefaultFeatures);
407
408 // Check if the module attribute is present and not zero.
409 auto isModuleAttributeSet = [&](const StringRef &ModAttr) -> bool {
410 const auto *Attr =
411 mdconst::extract_or_null<ConstantInt>(M->getModuleFlag(ModAttr));
412 return Attr && !Attr->isZero();
413 };
414
415 auto AddAttributeIfSet = [&](const StringRef &ModAttr) {
416 if (isModuleAttributeSet(ModAttr))
417 B.addAttribute(ModAttr);
418 };
419
420 StringRef SignType = "none";
421 if (isModuleAttributeSet("sign-return-address"))
422 SignType = "non-leaf";
423 if (isModuleAttributeSet("sign-return-address-all"))
424 SignType = "all";
425 if (SignType != "none") {
426 B.addAttribute("sign-return-address", SignType);
427 B.addAttribute("sign-return-address-key",
428 isModuleAttributeSet("sign-return-address-with-bkey")
429 ? "b_key"
430 : "a_key");
431 }
432 AddAttributeIfSet("branch-target-enforcement");
433 AddAttributeIfSet("branch-protection-pauth-lr");
434 AddAttributeIfSet("guarded-control-stack");
435 AddAttributeIfSet("ptrauth-returns");
436 AddAttributeIfSet("ptrauth-auth-traps");
437 AddAttributeIfSet("ptrauth-indirect-gotos");
438 AddAttributeIfSet("aarch64-jump-table-hardening");
439
440 F->addFnAttrs(B);
441 return F;
442}
443
445 getParent()->getFunctionList().remove(getIterator());
446}
447
449 getParent()->getFunctionList().erase(getIterator());
450}
451
453 Function::iterator FromBeginIt,
454 Function::iterator FromEndIt) {
455#ifdef EXPENSIVE_CHECKS
456 // Check that FromBeginIt is before FromEndIt.
457 auto FromFEnd = FromF->end();
458 for (auto It = FromBeginIt; It != FromEndIt; ++It)
459 assert(It != FromFEnd && "FromBeginIt not before FromEndIt!");
460#endif // EXPENSIVE_CHECKS
461 BasicBlocks.splice(ToIt, FromF->BasicBlocks, FromBeginIt, FromEndIt);
462}
463
465 Function::iterator ToIt) {
466 return BasicBlocks.erase(FromIt, ToIt);
467}
468
469//===----------------------------------------------------------------------===//
470// Function Implementation
471//===----------------------------------------------------------------------===//
472
473static unsigned computeAddrSpace(unsigned AddrSpace, Module *M) {
474 // If AS == -1 and we are passed a valid module pointer we place the function
475 // in the program address space. Otherwise we default to AS0.
476 if (AddrSpace == static_cast<unsigned>(-1))
477 return M ? M->getDataLayout().getProgramAddressSpace() : 0;
478 return AddrSpace;
479}
480
481Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace,
482 const Twine &name, Module *ParentModule)
483 : GlobalObject(Ty, Value::FunctionVal, AllocMarker, Linkage, name,
484 computeAddrSpace(AddrSpace, ParentModule)),
485 NumArgs(Ty->getNumParams()) {
486 assert(FunctionType::isValidReturnType(getReturnType()) &&
487 "invalid return type");
488 setGlobalObjectSubClassData(0);
489
490 // We only need a symbol table for a function if the context keeps value names
491 if (!getContext().shouldDiscardValueNames())
492 SymTab = std::make_unique<ValueSymbolTable>(NonGlobalValueMaxNameSize);
493
494 // If the function has arguments, mark them as lazily built.
495 if (Ty->getNumParams())
496 setValueSubclassData(1); // Set the "has lazy arguments" bit.
497
498 if (ParentModule) {
499 ParentModule->getFunctionList().push_back(this);
500 }
501
502 HasLLVMReservedName = getName().starts_with("llvm.");
503 // Ensure intrinsics have the right parameter attributes.
504 // Note, the IntID field will have been set in Value::setName if this function
505 // name is a valid intrinsic ID.
506 if (IntID) {
507 // Don't set the attributes if the intrinsic signature is invalid. This
508 // case will either be auto-upgraded or fail verification.
509 SmallVector<Type *> OverloadTys;
510 if (!Intrinsic::isSignatureValid(IntID, Ty, OverloadTys))
511 return;
512
513 setAttributes(Intrinsic::getAttributes(getContext(), IntID, Ty));
514 }
515}
516
518 validateBlockNumbers();
519
520 dropAllReferences(); // After this it is safe to delete instructions.
521
522 // Delete all of the method arguments and unlink from symbol table...
523 if (Arguments)
524 clearArguments();
525
526 // Remove the function from the on-the-side GC table.
527 clearGC();
528}
529
530void Function::BuildLazyArguments() const {
531 // Create the arguments vector, all arguments start out unnamed.
532 auto *FT = getFunctionType();
533 if (NumArgs > 0) {
534 Arguments = std::allocator<Argument>().allocate(NumArgs);
535 for (unsigned i = 0, e = NumArgs; i != e; ++i) {
536 Type *ArgTy = FT->getParamType(i);
537 assert(!ArgTy->isVoidTy() && "Cannot have void typed arguments!");
538 new (Arguments + i) Argument(ArgTy, "", const_cast<Function *>(this), i);
539 }
540 }
541
542 // Clear the lazy arguments bit.
543 unsigned SDC = getSubclassDataFromValue();
544 SDC &= ~(1 << 0);
545 const_cast<Function*>(this)->setValueSubclassData(SDC);
546 assert(!hasLazyArguments());
547}
548
550 return MutableArrayRef<Argument>(Args, Count);
551}
552
555}
556
557void Function::clearArguments() {
558 for (Argument &A : makeArgArray(Arguments, NumArgs)) {
559 A.setName("");
560 A.~Argument();
561 }
562 std::allocator<Argument>().deallocate(Arguments, NumArgs);
563 Arguments = nullptr;
564}
565
567 assert(isDeclaration() && "Expected no references to current arguments");
568
569 // Drop the current arguments, if any, and set the lazy argument bit.
570 if (!hasLazyArguments()) {
572 [](const Argument &A) { return A.use_empty(); }) &&
573 "Expected arguments to be unused in declaration");
574 clearArguments();
575 setValueSubclassData(getSubclassDataFromValue() | (1 << 0));
576 }
577
578 // Nothing to steal if Src has lazy arguments.
579 if (Src.hasLazyArguments())
580 return;
581
582 // Steal arguments from Src, and fix the lazy argument bits.
583 assert(arg_size() == Src.arg_size());
584 Arguments = Src.Arguments;
585 Src.Arguments = nullptr;
586 for (Argument &A : makeArgArray(Arguments, NumArgs)) {
587 // FIXME: This does the work of transferNodesFromList inefficiently.
589 if (A.hasName())
590 Name = A.getName();
591 if (!Name.empty())
592 A.setName("");
593 A.setParent(this);
594 if (!Name.empty())
595 A.setName(Name);
596 }
597
598 setValueSubclassData(getSubclassDataFromValue() & ~(1 << 0));
599 assert(!hasLazyArguments());
600 Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0));
601}
602
603void Function::deleteBodyImpl(bool ShouldDrop) {
604 setIsMaterializable(false);
605
606 for (BasicBlock &BB : *this)
608
609 // Delete all basic blocks. They are now unused, except possibly by
610 // blockaddresses, but BasicBlock's destructor takes care of those.
611 while (!BasicBlocks.empty())
612 BasicBlocks.begin()->eraseFromParent();
613
614 if (getNumOperands()) {
615 if (ShouldDrop) {
616 // Drop uses of any optional data (real or placeholder).
618 setNumHungOffUseOperands(0);
619 } else {
620 // The code needs to match Function::allocHungoffUselist().
622 Op<0>().set(CPN);
623 Op<1>().set(CPN);
624 Op<2>().set(CPN);
625 }
626 setValueSubclassData(getSubclassDataFromValue() & ~0xe);
627 }
628
629 // Metadata is stored in a side-table.
630 clearMetadata();
631}
632
633void Function::addAttributeAtIndex(unsigned i, Attribute Attr) {
634 AttributeSets = AttributeSets.addAttributeAtIndex(getContext(), i, Attr);
635}
636
638 AttributeSets = AttributeSets.addFnAttribute(getContext(), Kind);
639}
640
642 AttributeSets = AttributeSets.addFnAttribute(getContext(), Kind, Val);
643}
644
645void Function::addFnAttr(Attribute Attr) {
646 AttributeSets = AttributeSets.addFnAttribute(getContext(), Attr);
647}
648
649void Function::addFnAttrs(const AttrBuilder &Attrs) {
650 AttributeSets = AttributeSets.addFnAttributes(getContext(), Attrs);
651}
652
654 AttributeSets = AttributeSets.addRetAttribute(getContext(), Kind);
655}
656
657void Function::addRetAttr(Attribute Attr) {
658 AttributeSets = AttributeSets.addRetAttribute(getContext(), Attr);
659}
660
661void Function::addRetAttrs(const AttrBuilder &Attrs) {
662 AttributeSets = AttributeSets.addRetAttributes(getContext(), Attrs);
663}
664
665void Function::addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
666 AttributeSets = AttributeSets.addParamAttribute(getContext(), ArgNo, Kind);
667}
668
669void Function::addParamAttr(unsigned ArgNo, Attribute Attr) {
670 AttributeSets = AttributeSets.addParamAttribute(getContext(), ArgNo, Attr);
671}
672
673void Function::addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs) {
674 AttributeSets = AttributeSets.addParamAttributes(getContext(), ArgNo, Attrs);
675}
676
678 AttributeSets = AttributeSets.removeAttributeAtIndex(getContext(), i, Kind);
679}
680
681void Function::removeAttributeAtIndex(unsigned i, StringRef Kind) {
682 AttributeSets = AttributeSets.removeAttributeAtIndex(getContext(), i, Kind);
683}
684
686 AttributeSets = AttributeSets.removeFnAttribute(getContext(), Kind);
687}
688
690 AttributeSets = AttributeSets.removeFnAttribute(getContext(), Kind);
691}
692
694 AttributeSets = AttributeSets.removeFnAttributes(getContext(), AM);
695}
696
698 AttributeSets = AttributeSets.removeRetAttribute(getContext(), Kind);
699}
700
702 AttributeSets = AttributeSets.removeRetAttribute(getContext(), Kind);
703}
704
705void Function::removeRetAttrs(const AttributeMask &Attrs) {
706 AttributeSets = AttributeSets.removeRetAttributes(getContext(), Attrs);
707}
708
709void Function::removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
710 AttributeSets = AttributeSets.removeParamAttribute(getContext(), ArgNo, Kind);
711}
712
713void Function::removeParamAttr(unsigned ArgNo, StringRef Kind) {
714 AttributeSets = AttributeSets.removeParamAttribute(getContext(), ArgNo, Kind);
715}
716
717void Function::removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs) {
718 AttributeSets =
719 AttributeSets.removeParamAttributes(getContext(), ArgNo, Attrs);
720}
721
722void Function::addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes) {
723 AttributeSets =
724 AttributeSets.addDereferenceableParamAttr(getContext(), ArgNo, Bytes);
725}
726
728 return AttributeSets.hasFnAttr(Kind);
729}
730
731bool Function::hasFnAttribute(StringRef Kind) const {
732 return AttributeSets.hasFnAttr(Kind);
733}
734
736 return AttributeSets.hasRetAttr(Kind);
737}
738
739bool Function::hasParamAttribute(unsigned ArgNo,
740 Attribute::AttrKind Kind) const {
741 return AttributeSets.hasParamAttr(ArgNo, Kind);
742}
743
744bool Function::hasParamAttribute(unsigned ArgNo, StringRef Kind) const {
745 return AttributeSets.hasParamAttr(ArgNo, Kind);
746}
747
748Attribute Function::getAttributeAtIndex(unsigned i,
749 Attribute::AttrKind Kind) const {
750 return AttributeSets.getAttributeAtIndex(i, Kind);
751}
752
753Attribute Function::getAttributeAtIndex(unsigned i, StringRef Kind) const {
754 return AttributeSets.getAttributeAtIndex(i, Kind);
755}
756
757bool Function::hasAttributeAtIndex(unsigned Idx,
758 Attribute::AttrKind Kind) const {
759 return AttributeSets.hasAttributeAtIndex(Idx, Kind);
760}
761
762Attribute Function::getFnAttribute(Attribute::AttrKind Kind) const {
763 return AttributeSets.getFnAttr(Kind);
764}
765
766Attribute Function::getFnAttribute(StringRef Kind) const {
767 return AttributeSets.getFnAttr(Kind);
768}
769
771 return AttributeSets.getRetAttr(Kind);
772}
773
775 uint64_t Default) const {
776 Attribute A = getFnAttribute(Name);
778 if (A.isStringAttribute()) {
779 StringRef Str = A.getValueAsString();
780 if (Str.getAsInteger(0, Result))
781 getContext().emitError("cannot parse integer attribute " + Name);
782 }
783
784 return Result;
785}
786
787/// gets the specified attribute from the list of attributes.
788Attribute Function::getParamAttribute(unsigned ArgNo,
789 Attribute::AttrKind Kind) const {
790 return AttributeSets.getParamAttr(ArgNo, Kind);
791}
792
794 uint64_t Bytes) {
795 AttributeSets = AttributeSets.addDereferenceableOrNullParamAttr(getContext(),
796 ArgNo, Bytes);
797}
798
800 AttributeSets = AttributeSets.addRangeRetAttr(getContext(), CR);
801}
802
804 Attribute Attr = getFnAttribute(Attribute::DenormalFPEnv);
805 if (!Attr.isValid())
807
808 DenormalFPEnv FPEnv = Attr.getDenormalFPEnv();
809 return &FPType == &APFloat::IEEEsingle() ? FPEnv.F32Mode : FPEnv.DefaultMode;
810}
811
813 Attribute Attr = getFnAttribute(Attribute::DenormalFPEnv);
814 return Attr.isValid() ? Attr.getDenormalFPEnv() : DenormalFPEnv::getDefault();
815}
816
817const std::string &Function::getGC() const {
818 assert(hasGC() && "Function has no collector");
819 return getContext().getGC(*this);
820}
821
822void Function::setGC(std::string Str) {
823 setValueSubclassDataBit(14, !Str.empty());
824 getContext().setGC(*this, std::move(Str));
825}
826
827void Function::clearGC() {
828 if (!hasGC())
829 return;
830 getContext().deleteGC(*this);
831 setValueSubclassDataBit(14, false);
832}
833
835 return hasFnAttribute(Attribute::StackProtect) ||
836 hasFnAttribute(Attribute::StackProtectStrong) ||
837 hasFnAttribute(Attribute::StackProtectReq);
838}
839
840/// Copy all additional attributes (those not needed to create a Function) from
841/// the Function Src to this one.
842void Function::copyAttributesFrom(const Function *Src) {
844 setCallingConv(Src->getCallingConv());
845 setAttributes(Src->getAttributes());
846 if (Src->hasGC())
847 setGC(Src->getGC());
848 else
849 clearGC();
850 if (Src->hasPersonalityFn())
851 setPersonalityFn(Src->getPersonalityFn());
852 if (Src->hasPrefixData())
853 setPrefixData(Src->getPrefixData());
854 if (Src->hasPrologueData())
855 setPrologueData(Src->getPrologueData());
856}
857
859 return getAttributes().getMemoryEffects();
860}
863}
864
865/// Determine if the function does not access memory.
867 return getMemoryEffects().doesNotAccessMemory();
868}
871}
872
873/// Determine if the function does not access or only reads memory.
874bool Function::onlyReadsMemory() const {
875 return getMemoryEffects().onlyReadsMemory();
876}
878 setMemoryEffects(getMemoryEffects() & MemoryEffects::readOnly());
879}
880
881/// Determine if the function does not access or only writes memory.
882bool Function::onlyWritesMemory() const {
883 return getMemoryEffects().onlyWritesMemory();
884}
886 setMemoryEffects(getMemoryEffects() & MemoryEffects::writeOnly());
887}
888
889/// Determine if the call can access memory only using pointers based
890/// on its arguments.
892 return getMemoryEffects().onlyAccessesArgPointees();
893}
895 setMemoryEffects(getMemoryEffects() & MemoryEffects::argMemOnly());
896}
897
898/// Determine if the function may only access memory that is
899/// inaccessible from the IR.
901 return getMemoryEffects().onlyAccessesInaccessibleMem();
902}
905}
906
907/// Determine if the function may only access memory that is
908/// either inaccessible from the IR or pointed to by its arguments.
910 return getMemoryEffects().onlyAccessesInaccessibleOrArgMem();
911}
913 setMemoryEffects(getMemoryEffects() &
915}
916
917bool Function::isTargetIntrinsic() const {
918 return Intrinsic::isTargetIntrinsic(IntID);
919}
920
922 LibFuncCache = UnknownLibFunc;
924 if (!Name.starts_with("llvm.")) {
925 HasLLVMReservedName = false;
927 return;
928 }
929 HasLLVMReservedName = true;
930 IntID = Intrinsic::lookupIntrinsicID(Name);
931}
932
933/// hasAddressTaken - returns true if there are any uses of this function
934/// other than direct calls or invokes to it. Optionally ignores callback
935/// uses, assume like pointer annotation calls, and references in llvm.used
936/// and llvm.compiler.used variables.
937bool Function::hasAddressTaken(const User **PutOffender,
938 bool IgnoreCallbackUses,
939 bool IgnoreAssumeLikeCalls, bool IgnoreLLVMUsed,
940 bool IgnoreARCAttachedCall,
941 bool IgnoreCastedDirectCall) const {
942 for (const Use &U : uses()) {
943 const User *FU = U.getUser();
944 if (IgnoreCallbackUses) {
945 AbstractCallSite ACS(&U);
946 if (ACS && ACS.isCallbackCall())
947 continue;
948 }
949
950 const auto *Call = dyn_cast<CallBase>(FU);
951 if (!Call) {
952 if (IgnoreAssumeLikeCalls &&
954 all_of(FU->users(), [](const User *U) {
955 if (const auto *I = dyn_cast<IntrinsicInst>(U))
956 return I->isAssumeLikeIntrinsic();
957 return false;
958 })) {
959 continue;
960 }
961
962 if (IgnoreLLVMUsed && !FU->user_empty()) {
963 const User *FUU = FU;
965 FU->hasOneUse() && !FU->user_begin()->user_empty())
966 FUU = *FU->user_begin();
967 if (llvm::all_of(FUU->users(), [](const User *U) {
968 if (const auto *GV = dyn_cast<GlobalVariable>(U))
969 return GV->hasName() &&
970 (GV->getName() == "llvm.compiler.used" ||
971 GV->getName() == "llvm.used");
972 return false;
973 }))
974 continue;
975 }
976 if (PutOffender)
977 *PutOffender = FU;
978 return true;
979 }
980
981 if (IgnoreAssumeLikeCalls) {
982 if (const auto *I = dyn_cast<IntrinsicInst>(Call))
983 if (I->isAssumeLikeIntrinsic())
984 continue;
985 }
986
987 if (!Call->isCallee(&U) || (!IgnoreCastedDirectCall &&
988 Call->getFunctionType() != getFunctionType())) {
989 if (IgnoreARCAttachedCall &&
990 Call->isOperandBundleOfType(LLVMContext::OB_clang_arc_attachedcall,
991 U.getOperandNo()))
992 continue;
993
994 if (PutOffender)
995 *PutOffender = FU;
996 return true;
997 }
998 }
999 return false;
1000}
1001
1002bool Function::isDefTriviallyDead() const {
1003 // Check the linkage
1004 if (!hasLinkOnceLinkage() && !hasLocalLinkage() &&
1005 !hasAvailableExternallyLinkage())
1006 return false;
1007
1008 return use_empty();
1009}
1010
1011/// callsFunctionThatReturnsTwice - Return true if the function has a call to
1012/// setjmp or other function that gcc recognizes as "returning twice".
1014 for (const Instruction &I : instructions(this))
1015 if (const auto *Call = dyn_cast<CallBase>(&I))
1016 if (Call->hasFnAttr(Attribute::ReturnsTwice))
1017 return true;
1018
1019 return false;
1020}
1021
1022Constant *Function::getPersonalityFn() const {
1023 assert(hasPersonalityFn() && getNumOperands());
1024 return cast<Constant>(Op<0>());
1025}
1026
1027void Function::setPersonalityFn(Constant *Fn) {
1028 setHungoffOperand<0>(Fn);
1029 setValueSubclassDataBit(3, Fn != nullptr);
1030}
1031
1032Constant *Function::getPrefixData() const {
1033 assert(hasPrefixData() && getNumOperands());
1034 return cast<Constant>(Op<1>());
1035}
1036
1037void Function::setPrefixData(Constant *PrefixData) {
1038 setHungoffOperand<1>(PrefixData);
1039 setValueSubclassDataBit(1, PrefixData != nullptr);
1040}
1041
1042Constant *Function::getPrologueData() const {
1043 assert(hasPrologueData() && getNumOperands());
1044 return cast<Constant>(Op<2>());
1045}
1046
1047void Function::setPrologueData(Constant *PrologueData) {
1048 setHungoffOperand<2>(PrologueData);
1049 setValueSubclassDataBit(2, PrologueData != nullptr);
1050}
1051
1052void Function::allocHungoffUselist() {
1053 // If we've already allocated a uselist, stop here.
1054 if (getNumOperands())
1055 return;
1056
1057 allocHungoffUses(3, /*IsPhi=*/ false);
1058 setNumHungOffUseOperands(3);
1059
1060 // Initialize the uselist with placeholder operands to allow traversal.
1062 Op<0>().set(CPN);
1063 Op<1>().set(CPN);
1064 Op<2>().set(CPN);
1065}
1066
1067template <int Idx>
1068void Function::setHungoffOperand(Constant *C) {
1069 if (C) {
1070 allocHungoffUselist();
1071 Op<Idx>().set(C);
1072 } else if (getNumOperands()) {
1074 }
1075}
1076
1077void Function::setValueSubclassDataBit(unsigned Bit, bool On) {
1078 assert(Bit < 16 && "SubclassData contains only 16 bits");
1079 if (On)
1080 setValueSubclassData(getSubclassDataFromValue() | (1 << Bit));
1081 else
1082 setValueSubclassData(getSubclassDataFromValue() & ~(1 << Bit));
1083}
1084
1086 const DenseSet<GlobalValue::GUID> *S) {
1087 auto ImportGUIDs = getImportGUIDs();
1088 if (S == nullptr && ImportGUIDs.size())
1089 S = &ImportGUIDs;
1090
1091 MDBuilder MDB(getContext());
1092 setMetadata(LLVMContext::MD_prof,
1093 MDB.createFunctionEntryCount(Count, false, S));
1094}
1095
1096std::optional<uint64_t> Function::getEntryCount() const {
1097 MDNode *MD = getMetadata(LLVMContext::MD_prof);
1098 if (MD && MD->getOperand(0))
1099 if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0))) {
1100 if (MDS->getString() != MDProfLabels::FunctionEntryCount)
1101 return std::nullopt;
1104 // A value of -1 is used for SamplePGO when there were no samples.
1105 // Treat this the same as unknown.
1106 if (Count == static_cast<uint64_t>(-1))
1107 return std::nullopt;
1108 return Count;
1109 }
1110 return std::nullopt;
1111}
1112
1115 if (MDNode *MD = getMetadata(LLVMContext::MD_prof))
1116 if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0)))
1117 if (MDS->getString() == MDProfLabels::FunctionEntryCount)
1118 for (unsigned i = 2; i < MD->getNumOperands(); i++)
1120 ->getValue()
1121 .getZExtValue());
1122 return R;
1123}
1124
1125bool Function::nullPointerIsDefined() const {
1126 return hasFnAttribute(Attribute::NullPointerIsValid);
1127}
1128
1129unsigned Function::getVScaleValue() const {
1130 Attribute Attr = getFnAttribute(Attribute::VScaleRange);
1131 if (!Attr.isValid())
1132 return 0;
1133
1134 unsigned VScale = Attr.getVScaleRangeMin();
1135 if (VScale && VScale == Attr.getVScaleRangeMax())
1136 return VScale;
1137
1138 return 0;
1139}
1140
1141bool llvm::NullPointerIsDefined(const Function *F, unsigned AS) {
1142 if (F && F->nullPointerIsDefined())
1143 return true;
1144
1145 if (AS != 0)
1146 return true;
1147
1148 return false;
1149}
1150
1152 switch (CC) {
1153 case CallingConv::C:
1154 case CallingConv::Fast:
1155 case CallingConv::Cold:
1156 case CallingConv::GHC:
1157 case CallingConv::HiPE:
1161 case CallingConv::Swift:
1163 case CallingConv::Tail:
1178 case CallingConv::Win64:
1186 return true;
1191 return false;
1209 case CallingConv::GRAAL:
1226 return true;
1227 default:
1228 return false;
1229 }
1230
1231 llvm_unreachable("covered callingconv switch");
1232}
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:217
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)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file contains some templates that are useful if you are working with the STL at all.
static const char * name
static Type * getMemoryParamAllocType(AttributeSet ParamAttrs)
For a byval, sret, inalloca, or preallocated parameter, get the in-memory parameter type.
Definition Function.cpp:183
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:549
static unsigned computeAddrSpace(unsigned AddrSpace, Module *M)
Definition Function.cpp:473
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:304
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
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:229
LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo() const
Returns information on the memory marked dead_on_return for the argument.
Definition Function.cpp:132
LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const
Definition Function.cpp:341
LLVM_ABI bool hasNoAliasAttr() const
Return true if this argument has the noalias attribute.
Definition Function.cpp:267
LLVM_ABI bool hasNonNullAttr(bool AllowUndefOrPoison=true) const
Return true if this argument has the nonnull attribute.
Definition Function.cpp:114
LLVM_ABI bool hasByRefAttr() const
Return true if this argument has the byref attribute.
Definition Function.cpp:137
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:245
LLVM_ABI void addAttr(Attribute::AttrKind Kind)
Definition Function.cpp:315
LLVM_ABI Argument(Type *Ty, const Twine &Name="", Function *F=nullptr, unsigned ArgNo=0)
Argument constructor.
Definition Function.cpp:105
LLVM_ABI bool onlyReadsMemory() const
Return true if this argument has the readonly or readnone attribute.
Definition Function.cpp:303
LLVM_ABI bool hasPointeeInMemoryValueAttr() const
Return true if this argument has the byval, sret, inalloca, preallocated, or byref attribute.
Definition Function.cpp:170
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Check if an argument has a given attribute.
Definition Function.cpp:333
LLVM_ABI bool hasReturnedAttr() const
Return true if this argument has the returned attribute.
Definition Function.cpp:291
LLVM_ABI Type * getParamStructRetType() const
If this is an sret argument, return its type.
Definition Function.cpp:224
LLVM_ABI bool hasInRegAttr() const
Return true if this argument has the inreg attribute.
Definition Function.cpp:287
LLVM_ABI bool hasByValAttr() const
Return true if this argument has the byval attribute.
Definition Function.cpp:127
LLVM_ABI bool hasPreallocatedAttr() const
Return true if this argument has the preallocated attribute.
Definition Function.cpp:156
LLVM_ABI bool hasSExtAttr() const
Return true if this argument has the sext attribute.
Definition Function.cpp:299
LLVM_ABI void removeAttr(Attribute::AttrKind Kind)
Remove attributes from an argument.
Definition Function.cpp:323
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:200
LLVM_ABI void removeAttrs(const AttributeMask &AM)
Definition Function.cpp:327
LLVM_ABI Type * getPointeeInMemoryValueType() const
If hasPointeeInMemoryValueAttr returns true, the in-memory ABI type is returned.
Definition Function.cpp:206
LLVM_ABI bool hasInAllocaAttr() const
Return true if this argument has the inalloca attribute.
Definition Function.cpp:151
LLVM_ABI bool hasSwiftErrorAttr() const
Return true if this argument has the swifterror attribute.
Definition Function.cpp:147
LLVM_ABI FPClassTest getNoFPClass() const
If this argument has nofpclass attribute, return the mask representing disallowed floating-point valu...
Definition Function.cpp:251
LLVM_ABI void addAttrs(AttrBuilder &B)
Add attributes to an argument.
Definition Function.cpp:309
LLVM_ABI bool hasNoFreeAttr() const
Return true if this argument has the nofree attribute.
Definition Function.cpp:277
LLVM_ABI bool hasSwiftSelfAttr() const
Return true if this argument has the swiftself attribute.
Definition Function.cpp:143
LLVM_ABI Type * getParamInAllocaType() const
If this is an inalloca argument, return its type.
Definition Function.cpp:234
LLVM_ABI bool hasZExtAttr() const
Return true if this argument has the zext attribute.
Definition Function.cpp:295
LLVM_ABI Type * getParamByValType() const
If this is a byval argument, return its type.
Definition Function.cpp:219
LLVM_ABI bool hasNestAttr() const
Return true if this argument has the nest attribute.
Definition Function.cpp:262
LLVM_ABI MaybeAlign getParamAlign() const
If this is a byval or inalloca argument, return its alignment.
Definition Function.cpp:210
LLVM_ABI std::optional< ConstantRange > getRange() const
If this argument has a range attribute, return the value range of the argument.
Definition Function.cpp:255
LLVM_ABI bool hasStructRetAttr() const
Return true if this argument has the sret attribute.
Definition Function.cpp:282
LLVM_ABI AttributeSet getAttributes() const
Definition Function.cpp:345
LLVM_ABI bool hasPassPointeeByValueCopyAttr() const
Return true if this argument has the byval, inalloca, or preallocated attribute.
Definition Function.cpp:162
LLVM_ABI MaybeAlign getParamStackAlign() const
Definition Function.cpp:215
LLVM_ABI bool hasNoCaptureAttr() const
Return true if this argument has the nocapture attribute.
Definition Function.cpp:272
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:239
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:407
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:124
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:159
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
Definition Type.cpp:462
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
Definition Function.cpp:637
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:168
void addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs)
adds the attributes to the list of attributes for the given arg.
Definition Function.cpp:673
void removeRetAttr(Attribute::AttrKind Kind)
removes the attribute from the return value list of attributes.
Definition Function.cpp:697
void addRetAttrs(const AttrBuilder &Attrs)
Add return value attributes to this function.
Definition Function.cpp:661
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:909
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition Function.h:738
BasicBlockListType::iterator iterator
Definition Function.h:70
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:937
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
Definition Function.cpp:709
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:788
void setPrefixData(Constant *PrefixData)
bool hasStackProtectorFnAttr() const
Returns true if the function has ssp, sspstrong, or sspreq fn attrs.
Definition Function.cpp:834
void removeFromParent()
removeFromParent - This method unlinks 'this' from the containing module, but does not delete it.
Definition Function.cpp:444
const DataLayout & getDataLayout() const
Get the data layout of the module this function belongs to.
Definition Function.cpp:357
void addFnAttrs(const AttrBuilder &Attrs)
Add function attributes to this function.
Definition Function.cpp:649
void renumberBlocks()
Renumber basic blocks into a dense value range starting from 0.
Definition Function.cpp:68
void setDoesNotAccessMemory()
Definition Function.cpp:869
void setGC(std::string Str)
Definition Function.cpp:822
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition Function.cpp:762
uint64_t getFnAttributeAsParsedInteger(StringRef Kind, uint64_t Default=0) const
For a string attribute Kind, parse attribute as an integer.
Definition Function.cpp:774
bool isConstrainedFPIntrinsic() const
Returns true if the function is one of the "Constrained Floating-PointIntrinsics".
Definition Function.cpp:553
void setOnlyAccessesArgMemory()
Definition Function.cpp:894
MemoryEffects getMemoryEffects() const
Definition Function.cpp:858
void setOnlyAccessesInaccessibleMemory()
Definition Function.cpp:903
void removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs)
removes the attribute from the list of attributes.
Definition Function.cpp:717
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:739
bool hasAttributeAtIndex(unsigned Idx, Attribute::AttrKind Kind) const
Check if attribute of the given kind is set at the given index.
Definition Function.cpp:757
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:373
void setOnlyReadsMemory()
Definition Function.cpp:877
bool isTargetIntrinsic() const
isTargetIntrinsic - Returns true if this function is an intrinsic and the intrinsic is specific to a ...
Definition Function.cpp:917
void removeFnAttrs(const AttributeMask &Attrs)
Definition Function.cpp:693
void addRetAttr(Attribute::AttrKind Kind)
Add return value attributes to this function.
Definition Function.cpp:653
DenormalFPEnv getDenormalFPEnv() const
Return the representational value of the denormal_fpenv attribute.
Definition Function.cpp:812
Constant * getPrologueData() const
Get the prologue data associated with this function.
void convertFromNewDbgValues()
Definition Function.cpp:95
Constant * getPersonalityFn() const
Get the personality function associated with this function.
void setOnlyWritesMemory()
Definition Function.cpp:885
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:677
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Function.cpp:448
void removeFnAttr(Attribute::AttrKind Kind)
Remove function attributes from this function.
Definition Function.cpp:685
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:793
void addRangeRetAttr(const ConstantRange &CR)
adds the range attribute to the list of attributes for the return value.
Definition Function.cpp:799
void stealArgumentListFrom(Function &Src)
Steal arguments from another function.
Definition Function.cpp:566
std::optional< uint64_t > getEntryCount() const
Get the entry count for this function.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:353
const std::string & getGC() const
Definition Function.cpp:817
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Definition Function.cpp:665
bool doesNotAccessMemory() const
Determine if the function does not access memory.
Definition Function.cpp:866
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition Function.cpp:803
void updateAfterNameChange()
Update internal caches that depend on the function name (such as the intrinsic ID and libcall cache).
Definition Function.cpp:921
void setEntryCount(uint64_t Count, const DenseSet< GlobalValue::GUID > *Imports=nullptr)
Set the entry count for this function.
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:735
bool onlyWritesMemory() const
Determine if the function does not access or only writes memory.
Definition Function.cpp:882
bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
Definition Function.cpp:900
void setPrologueData(Constant *PrologueData)
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
Definition Function.cpp:705
bool onlyAccessesArgMemory() const
Determine if the call can access memory only using pointers based on its arguments.
Definition Function.cpp:891
Function::iterator erase(Function::iterator FromIt, Function::iterator ToIt)
Erases a range of BasicBlocks from FromIt to (not including) ToIt.
Definition Function.cpp:464
void setMemoryEffects(MemoryEffects ME)
Definition Function.cpp:861
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:748
iterator end()
Definition Function.h:832
void convertToNewDbgValues()
Definition Function.cpp:89
void setOnlyAccessesInaccessibleMemOrArgMem()
Definition Function.cpp:912
void addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes for the given arg.
Definition Function.cpp:722
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in this function.
Definition Function.cpp:361
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
Definition Function.cpp:874
void addAttributeAtIndex(unsigned i, Attribute Attr)
adds the attribute to the list of attributes.
Definition Function.cpp:633
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:727
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:842
Attribute getRetAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind for the return value.
Definition Function.cpp:770
LLVM_ABI void copyAttributesFrom(const GlobalObject *Src)
Definition Globals.cpp:228
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1432
A single uniqued string.
Definition Metadata.h:722
static MemoryEffectsBase readOnly()
Definition ModRef.h:133
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:143
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:149
static MemoryEffectsBase writeOnly()
Definition ModRef.h:138
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:166
static MemoryEffectsBase none()
Definition ModRef.h:128
const FunctionListType & getFunctionList() const
Get the Module's list of functions (constant).
Definition Module.h:704
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:911
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
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:324
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 isSignatureValid(Intrinsic::ID ID, FunctionType *FT, SmallVectorImpl< Type * > &OverloadTys, raw_ostream &OS=nulls())
Returns true if FT is a valid function type for intrinsic ID.
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:683
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
constexpr double e
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:1739
unsigned getPointerAddressSpace(const Type *T)
Definition SPIRVUtils.h:390
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:356
UWTableKind
Definition CodeGen.h:221
@ None
No unwind table requested.
Definition CodeGen.h:222
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:378
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
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
DWARFExpression::Operation Op
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:375
#define N
Represents the full denormal controls for a function, including the default mode and the f32 specific...
static constexpr DenormalFPEnv getDefault()
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getDefault()
Return the assumed default mode for a function without denormal-fp-math.
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