LLVM 23.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
436 F->addFnAttrs(B);
437 return F;
438}
439
441 getParent()->getFunctionList().remove(getIterator());
442}
443
445 getParent()->getFunctionList().erase(getIterator());
446}
447
449 Function::iterator FromBeginIt,
450 Function::iterator FromEndIt) {
451#ifdef EXPENSIVE_CHECKS
452 // Check that FromBeginIt is before FromEndIt.
453 auto FromFEnd = FromF->end();
454 for (auto It = FromBeginIt; It != FromEndIt; ++It)
455 assert(It != FromFEnd && "FromBeginIt not before FromEndIt!");
456#endif // EXPENSIVE_CHECKS
457 BasicBlocks.splice(ToIt, FromF->BasicBlocks, FromBeginIt, FromEndIt);
458}
459
461 Function::iterator ToIt) {
462 return BasicBlocks.erase(FromIt, ToIt);
463}
464
465//===----------------------------------------------------------------------===//
466// Function Implementation
467//===----------------------------------------------------------------------===//
468
469static unsigned computeAddrSpace(unsigned AddrSpace, Module *M) {
470 // If AS == -1 and we are passed a valid module pointer we place the function
471 // in the program address space. Otherwise we default to AS0.
472 if (AddrSpace == static_cast<unsigned>(-1))
473 return M ? M->getDataLayout().getProgramAddressSpace() : 0;
474 return AddrSpace;
475}
476
477Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace,
478 const Twine &name, Module *ParentModule)
479 : GlobalObject(Ty, Value::FunctionVal, AllocMarker, Linkage, name,
480 computeAddrSpace(AddrSpace, ParentModule)),
481 NumArgs(Ty->getNumParams()) {
482 assert(FunctionType::isValidReturnType(getReturnType()) &&
483 "invalid return type");
484 setGlobalObjectSubClassData(0);
485
486 // We only need a symbol table for a function if the context keeps value names
487 if (!getContext().shouldDiscardValueNames())
488 SymTab = std::make_unique<ValueSymbolTable>(NonGlobalValueMaxNameSize);
489
490 // If the function has arguments, mark them as lazily built.
491 if (Ty->getNumParams())
492 setValueSubclassData(1); // Set the "has lazy arguments" bit.
493
494 if (ParentModule) {
495 ParentModule->getFunctionList().push_back(this);
496 }
497
498 HasLLVMReservedName = getName().starts_with("llvm.");
499 // Ensure intrinsics have the right parameter attributes.
500 // Note, the IntID field will have been set in Value::setName if this function
501 // name is a valid intrinsic ID.
502 if (IntID) {
503 // Don't set the attributes if the intrinsic signature is invalid. This
504 // case will either be auto-upgraded or fail verification.
505 SmallVector<Type *> OverloadTys;
506 if (!Intrinsic::isSignatureValid(IntID, Ty, OverloadTys))
507 return;
508
509 setAttributes(Intrinsic::getAttributes(getContext(), IntID, Ty));
510 }
511}
512
514 validateBlockNumbers();
515
516 dropAllReferences(); // After this it is safe to delete instructions.
517
518 // Delete all of the method arguments and unlink from symbol table...
519 if (Arguments)
520 clearArguments();
521
522 // Remove the function from the on-the-side GC table.
523 clearGC();
524}
525
526void Function::BuildLazyArguments() const {
527 // Create the arguments vector, all arguments start out unnamed.
528 auto *FT = getFunctionType();
529 if (NumArgs > 0) {
530 Arguments = std::allocator<Argument>().allocate(NumArgs);
531 for (unsigned i = 0, e = NumArgs; i != e; ++i) {
532 Type *ArgTy = FT->getParamType(i);
533 assert(!ArgTy->isVoidTy() && "Cannot have void typed arguments!");
534 new (Arguments + i) Argument(ArgTy, "", const_cast<Function *>(this), i);
535 }
536 }
537
538 // Clear the lazy arguments bit.
539 unsigned SDC = getSubclassDataFromValue();
540 SDC &= ~(1 << 0);
541 const_cast<Function*>(this)->setValueSubclassData(SDC);
542 assert(!hasLazyArguments());
543}
544
546 return MutableArrayRef<Argument>(Args, Count);
547}
548
551}
552
553void Function::clearArguments() {
554 for (Argument &A : makeArgArray(Arguments, NumArgs)) {
555 A.setName("");
556 A.~Argument();
557 }
558 std::allocator<Argument>().deallocate(Arguments, NumArgs);
559 Arguments = nullptr;
560}
561
563 assert(isDeclaration() && "Expected no references to current arguments");
564
565 // Drop the current arguments, if any, and set the lazy argument bit.
566 if (!hasLazyArguments()) {
568 [](const Argument &A) { return A.use_empty(); }) &&
569 "Expected arguments to be unused in declaration");
570 clearArguments();
571 setValueSubclassData(getSubclassDataFromValue() | (1 << 0));
572 }
573
574 // Nothing to steal if Src has lazy arguments.
575 if (Src.hasLazyArguments())
576 return;
577
578 // Steal arguments from Src, and fix the lazy argument bits.
579 assert(arg_size() == Src.arg_size());
580 Arguments = Src.Arguments;
581 Src.Arguments = nullptr;
582 for (Argument &A : makeArgArray(Arguments, NumArgs)) {
583 // FIXME: This does the work of transferNodesFromList inefficiently.
585 if (A.hasName())
586 Name = A.getName();
587 if (!Name.empty())
588 A.setName("");
589 A.setParent(this);
590 if (!Name.empty())
591 A.setName(Name);
592 }
593
594 setValueSubclassData(getSubclassDataFromValue() & ~(1 << 0));
595 assert(!hasLazyArguments());
596 Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0));
597}
598
599void Function::deleteBodyImpl(bool ShouldDrop) {
600 setIsMaterializable(false);
601
602 for (BasicBlock &BB : *this)
604
605 // Delete all basic blocks. They are now unused, except possibly by
606 // blockaddresses, but BasicBlock's destructor takes care of those.
607 while (!BasicBlocks.empty())
608 BasicBlocks.begin()->eraseFromParent();
609
610 if (getNumOperands()) {
611 if (ShouldDrop) {
612 // Drop uses of any optional data (real or placeholder).
614 setNumHungOffUseOperands(0);
615 } else {
616 // The code needs to match Function::allocHungoffUselist().
618 Op<0>().set(CPN);
619 Op<1>().set(CPN);
620 Op<2>().set(CPN);
621 }
622 setValueSubclassData(getSubclassDataFromValue() & ~0xe);
623 }
624
625 // Metadata is stored in a side-table.
626 clearMetadata();
627}
628
629void Function::addAttributeAtIndex(unsigned i, Attribute Attr) {
630 AttributeSets = AttributeSets.addAttributeAtIndex(getContext(), i, Attr);
631}
632
634 AttributeSets = AttributeSets.addFnAttribute(getContext(), Kind);
635}
636
638 AttributeSets = AttributeSets.addFnAttribute(getContext(), Kind, Val);
639}
640
641void Function::addFnAttr(Attribute Attr) {
642 AttributeSets = AttributeSets.addFnAttribute(getContext(), Attr);
643}
644
645void Function::addFnAttrs(const AttrBuilder &Attrs) {
646 AttributeSets = AttributeSets.addFnAttributes(getContext(), Attrs);
647}
648
650 AttributeSets = AttributeSets.addRetAttribute(getContext(), Kind);
651}
652
653void Function::addRetAttr(Attribute Attr) {
654 AttributeSets = AttributeSets.addRetAttribute(getContext(), Attr);
655}
656
657void Function::addRetAttrs(const AttrBuilder &Attrs) {
658 AttributeSets = AttributeSets.addRetAttributes(getContext(), Attrs);
659}
660
661void Function::addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
662 AttributeSets = AttributeSets.addParamAttribute(getContext(), ArgNo, Kind);
663}
664
665void Function::addParamAttr(unsigned ArgNo, Attribute Attr) {
666 AttributeSets = AttributeSets.addParamAttribute(getContext(), ArgNo, Attr);
667}
668
669void Function::addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs) {
670 AttributeSets = AttributeSets.addParamAttributes(getContext(), ArgNo, Attrs);
671}
672
674 AttributeSets = AttributeSets.removeAttributeAtIndex(getContext(), i, Kind);
675}
676
677void Function::removeAttributeAtIndex(unsigned i, StringRef Kind) {
678 AttributeSets = AttributeSets.removeAttributeAtIndex(getContext(), i, Kind);
679}
680
682 AttributeSets = AttributeSets.removeFnAttribute(getContext(), Kind);
683}
684
686 AttributeSets = AttributeSets.removeFnAttribute(getContext(), Kind);
687}
688
690 AttributeSets = AttributeSets.removeFnAttributes(getContext(), AM);
691}
692
694 AttributeSets = AttributeSets.removeRetAttribute(getContext(), Kind);
695}
696
698 AttributeSets = AttributeSets.removeRetAttribute(getContext(), Kind);
699}
700
701void Function::removeRetAttrs(const AttributeMask &Attrs) {
702 AttributeSets = AttributeSets.removeRetAttributes(getContext(), Attrs);
703}
704
705void Function::removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
706 AttributeSets = AttributeSets.removeParamAttribute(getContext(), ArgNo, Kind);
707}
708
709void Function::removeParamAttr(unsigned ArgNo, StringRef Kind) {
710 AttributeSets = AttributeSets.removeParamAttribute(getContext(), ArgNo, Kind);
711}
712
713void Function::removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs) {
714 AttributeSets =
715 AttributeSets.removeParamAttributes(getContext(), ArgNo, Attrs);
716}
717
718void Function::addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes) {
719 AttributeSets =
720 AttributeSets.addDereferenceableParamAttr(getContext(), ArgNo, Bytes);
721}
722
724 return AttributeSets.hasFnAttr(Kind);
725}
726
727bool Function::hasFnAttribute(StringRef Kind) const {
728 return AttributeSets.hasFnAttr(Kind);
729}
730
732 return AttributeSets.hasRetAttr(Kind);
733}
734
735bool Function::hasParamAttribute(unsigned ArgNo,
736 Attribute::AttrKind Kind) const {
737 return AttributeSets.hasParamAttr(ArgNo, Kind);
738}
739
740bool Function::hasParamAttribute(unsigned ArgNo, StringRef Kind) const {
741 return AttributeSets.hasParamAttr(ArgNo, Kind);
742}
743
744Attribute Function::getAttributeAtIndex(unsigned i,
745 Attribute::AttrKind Kind) const {
746 return AttributeSets.getAttributeAtIndex(i, Kind);
747}
748
749Attribute Function::getAttributeAtIndex(unsigned i, StringRef Kind) const {
750 return AttributeSets.getAttributeAtIndex(i, Kind);
751}
752
753bool Function::hasAttributeAtIndex(unsigned Idx,
754 Attribute::AttrKind Kind) const {
755 return AttributeSets.hasAttributeAtIndex(Idx, Kind);
756}
757
758Attribute Function::getFnAttribute(Attribute::AttrKind Kind) const {
759 return AttributeSets.getFnAttr(Kind);
760}
761
762Attribute Function::getFnAttribute(StringRef Kind) const {
763 return AttributeSets.getFnAttr(Kind);
764}
765
767 return AttributeSets.getRetAttr(Kind);
768}
769
771 uint64_t Default) const {
772 Attribute A = getFnAttribute(Name);
774 if (A.isStringAttribute()) {
775 StringRef Str = A.getValueAsString();
776 if (Str.getAsInteger(0, Result))
777 getContext().emitError("cannot parse integer attribute " + Name);
778 }
779
780 return Result;
781}
782
783/// gets the specified attribute from the list of attributes.
784Attribute Function::getParamAttribute(unsigned ArgNo,
785 Attribute::AttrKind Kind) const {
786 return AttributeSets.getParamAttr(ArgNo, Kind);
787}
788
790 uint64_t Bytes) {
791 AttributeSets = AttributeSets.addDereferenceableOrNullParamAttr(getContext(),
792 ArgNo, Bytes);
793}
794
796 AttributeSets = AttributeSets.addRangeRetAttr(getContext(), CR);
797}
798
800 Attribute Attr = getFnAttribute(Attribute::DenormalFPEnv);
801 if (!Attr.isValid())
803
804 DenormalFPEnv FPEnv = Attr.getDenormalFPEnv();
805 return &FPType == &APFloat::IEEEsingle() ? FPEnv.F32Mode : FPEnv.DefaultMode;
806}
807
809 Attribute Attr = getFnAttribute(Attribute::DenormalFPEnv);
810 return Attr.isValid() ? Attr.getDenormalFPEnv() : DenormalFPEnv::getDefault();
811}
812
813const std::string &Function::getGC() const {
814 assert(hasGC() && "Function has no collector");
815 return getContext().getGC(*this);
816}
817
818void Function::setGC(std::string Str) {
819 setValueSubclassDataBit(14, !Str.empty());
820 getContext().setGC(*this, std::move(Str));
821}
822
823void Function::clearGC() {
824 if (!hasGC())
825 return;
826 getContext().deleteGC(*this);
827 setValueSubclassDataBit(14, false);
828}
829
831 return hasFnAttribute(Attribute::StackProtect) ||
832 hasFnAttribute(Attribute::StackProtectStrong) ||
833 hasFnAttribute(Attribute::StackProtectReq);
834}
835
836/// Copy all additional attributes (those not needed to create a Function) from
837/// the Function Src to this one.
838void Function::copyAttributesFrom(const Function *Src) {
840 setCallingConv(Src->getCallingConv());
841 setAttributes(Src->getAttributes());
842 if (Src->hasGC())
843 setGC(Src->getGC());
844 else
845 clearGC();
846 if (Src->hasPersonalityFn())
847 setPersonalityFn(Src->getPersonalityFn());
848 if (Src->hasPrefixData())
849 setPrefixData(Src->getPrefixData());
850 if (Src->hasPrologueData())
851 setPrologueData(Src->getPrologueData());
852}
853
855 return getAttributes().getMemoryEffects();
856}
859}
860
861/// Determine if the function does not access memory.
863 return getMemoryEffects().doesNotAccessMemory();
864}
867}
868
869/// Determine if the function does not access or only reads memory.
870bool Function::onlyReadsMemory() const {
871 return getMemoryEffects().onlyReadsMemory();
872}
874 setMemoryEffects(getMemoryEffects() & MemoryEffects::readOnly());
875}
876
877/// Determine if the function does not access or only writes memory.
878bool Function::onlyWritesMemory() const {
879 return getMemoryEffects().onlyWritesMemory();
880}
882 setMemoryEffects(getMemoryEffects() & MemoryEffects::writeOnly());
883}
884
885/// Determine if the call can access memory only using pointers based
886/// on its arguments.
888 return getMemoryEffects().onlyAccessesArgPointees();
889}
891 setMemoryEffects(getMemoryEffects() & MemoryEffects::argMemOnly());
892}
893
894/// Determine if the function may only access memory that is
895/// inaccessible from the IR.
897 return getMemoryEffects().onlyAccessesInaccessibleMem();
898}
901}
902
903/// Determine if the function may only access memory that is
904/// either inaccessible from the IR or pointed to by its arguments.
906 return getMemoryEffects().onlyAccessesInaccessibleOrArgMem();
907}
909 setMemoryEffects(getMemoryEffects() &
911}
912
913bool Function::isTargetIntrinsic() const {
914 return Intrinsic::isTargetIntrinsic(IntID);
915}
916
918 LibFuncCache = UnknownLibFunc;
920 if (!Name.starts_with("llvm.")) {
921 HasLLVMReservedName = false;
923 return;
924 }
925 HasLLVMReservedName = true;
926 IntID = Intrinsic::lookupIntrinsicID(Name);
927}
928
929/// hasAddressTaken - returns true if there are any uses of this function
930/// other than direct calls or invokes to it. Optionally ignores callback
931/// uses, assume like pointer annotation calls, and references in llvm.used
932/// and llvm.compiler.used variables.
933bool Function::hasAddressTaken(const User **PutOffender,
934 bool IgnoreCallbackUses,
935 bool IgnoreAssumeLikeCalls, bool IgnoreLLVMUsed,
936 bool IgnoreARCAttachedCall,
937 bool IgnoreCastedDirectCall) const {
938 for (const Use &U : uses()) {
939 const User *FU = U.getUser();
940 if (IgnoreCallbackUses) {
941 AbstractCallSite ACS(&U);
942 if (ACS && ACS.isCallbackCall())
943 continue;
944 }
945
946 const auto *Call = dyn_cast<CallBase>(FU);
947 if (!Call) {
948 if (IgnoreAssumeLikeCalls &&
950 all_of(FU->users(), [](const User *U) {
951 if (const auto *I = dyn_cast<IntrinsicInst>(U))
952 return I->isAssumeLikeIntrinsic();
953 return false;
954 })) {
955 continue;
956 }
957
958 if (IgnoreLLVMUsed && !FU->user_empty()) {
959 const User *FUU = FU;
961 FU->hasOneUse() && !FU->user_begin()->user_empty())
962 FUU = *FU->user_begin();
963 if (llvm::all_of(FUU->users(), [](const User *U) {
964 if (const auto *GV = dyn_cast<GlobalVariable>(U))
965 return GV->hasName() &&
966 (GV->getName() == "llvm.compiler.used" ||
967 GV->getName() == "llvm.used");
968 return false;
969 }))
970 continue;
971 }
972 if (PutOffender)
973 *PutOffender = FU;
974 return true;
975 }
976
977 if (IgnoreAssumeLikeCalls) {
978 if (const auto *I = dyn_cast<IntrinsicInst>(Call))
979 if (I->isAssumeLikeIntrinsic())
980 continue;
981 }
982
983 if (!Call->isCallee(&U) || (!IgnoreCastedDirectCall &&
984 Call->getFunctionType() != getFunctionType())) {
985 if (IgnoreARCAttachedCall &&
986 Call->isOperandBundleOfType(LLVMContext::OB_clang_arc_attachedcall,
987 U.getOperandNo()))
988 continue;
989
990 if (PutOffender)
991 *PutOffender = FU;
992 return true;
993 }
994 }
995 return false;
996}
997
998bool Function::isDefTriviallyDead() const {
999 // Check the linkage
1000 if (!hasLinkOnceLinkage() && !hasLocalLinkage() &&
1001 !hasAvailableExternallyLinkage())
1002 return false;
1003
1004 return use_empty();
1005}
1006
1007/// callsFunctionThatReturnsTwice - Return true if the function has a call to
1008/// setjmp or other function that gcc recognizes as "returning twice".
1010 for (const Instruction &I : instructions(this))
1011 if (const auto *Call = dyn_cast<CallBase>(&I))
1012 if (Call->hasFnAttr(Attribute::ReturnsTwice))
1013 return true;
1014
1015 return false;
1016}
1017
1018Constant *Function::getPersonalityFn() const {
1019 assert(hasPersonalityFn() && getNumOperands());
1020 return cast<Constant>(Op<0>());
1021}
1022
1023void Function::setPersonalityFn(Constant *Fn) {
1024 setHungoffOperand<0>(Fn);
1025 setValueSubclassDataBit(3, Fn != nullptr);
1026}
1027
1028Constant *Function::getPrefixData() const {
1029 assert(hasPrefixData() && getNumOperands());
1030 return cast<Constant>(Op<1>());
1031}
1032
1033void Function::setPrefixData(Constant *PrefixData) {
1034 setHungoffOperand<1>(PrefixData);
1035 setValueSubclassDataBit(1, PrefixData != nullptr);
1036}
1037
1038Constant *Function::getPrologueData() const {
1039 assert(hasPrologueData() && getNumOperands());
1040 return cast<Constant>(Op<2>());
1041}
1042
1043void Function::setPrologueData(Constant *PrologueData) {
1044 setHungoffOperand<2>(PrologueData);
1045 setValueSubclassDataBit(2, PrologueData != nullptr);
1046}
1047
1048void Function::allocHungoffUselist() {
1049 // If we've already allocated a uselist, stop here.
1050 if (getNumOperands())
1051 return;
1052
1053 allocHungoffUses(3, /*IsPhi=*/ false);
1054 setNumHungOffUseOperands(3);
1055
1056 // Initialize the uselist with placeholder operands to allow traversal.
1058 Op<0>().set(CPN);
1059 Op<1>().set(CPN);
1060 Op<2>().set(CPN);
1061}
1062
1063template <int Idx>
1064void Function::setHungoffOperand(Constant *C) {
1065 if (C) {
1066 allocHungoffUselist();
1067 Op<Idx>().set(C);
1068 } else if (getNumOperands()) {
1070 }
1071}
1072
1073void Function::setValueSubclassDataBit(unsigned Bit, bool On) {
1074 assert(Bit < 16 && "SubclassData contains only 16 bits");
1075 if (On)
1076 setValueSubclassData(getSubclassDataFromValue() | (1 << Bit));
1077 else
1078 setValueSubclassData(getSubclassDataFromValue() & ~(1 << Bit));
1079}
1080
1082 const DenseSet<GlobalValue::GUID> *S) {
1083 auto ImportGUIDs = getImportGUIDs();
1084 if (S == nullptr && ImportGUIDs.size())
1085 S = &ImportGUIDs;
1086
1087 MDBuilder MDB(getContext());
1088 setMetadata(LLVMContext::MD_prof,
1089 MDB.createFunctionEntryCount(Count, false, S));
1090}
1091
1092std::optional<uint64_t> Function::getEntryCount() const {
1093 MDNode *MD = getMetadata(LLVMContext::MD_prof);
1094 if (MD && MD->getOperand(0))
1095 if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0))) {
1096 if (MDS->getString() != MDProfLabels::FunctionEntryCount)
1097 return std::nullopt;
1100 // A value of -1 is used for SamplePGO when there were no samples.
1101 // Treat this the same as unknown.
1102 if (Count == static_cast<uint64_t>(-1))
1103 return std::nullopt;
1104 return Count;
1105 }
1106 return std::nullopt;
1107}
1108
1111 if (MDNode *MD = getMetadata(LLVMContext::MD_prof))
1112 if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0)))
1113 if (MDS->getString() == MDProfLabels::FunctionEntryCount)
1114 for (unsigned i = 2; i < MD->getNumOperands(); i++)
1116 ->getValue()
1117 .getZExtValue());
1118 return R;
1119}
1120
1121bool Function::nullPointerIsDefined() const {
1122 return hasFnAttribute(Attribute::NullPointerIsValid);
1123}
1124
1125unsigned Function::getVScaleValue() const {
1126 Attribute Attr = getFnAttribute(Attribute::VScaleRange);
1127 if (!Attr.isValid())
1128 return 0;
1129
1130 unsigned VScale = Attr.getVScaleRangeMin();
1131 if (VScale && VScale == Attr.getVScaleRangeMax())
1132 return VScale;
1133
1134 return 0;
1135}
1136
1137bool llvm::NullPointerIsDefined(const Function *F, unsigned AS) {
1138 if (F && F->nullPointerIsDefined())
1139 return true;
1140
1141 if (AS != 0)
1142 return true;
1143
1144 return false;
1145}
1146
1148 switch (CC) {
1149 case CallingConv::C:
1150 case CallingConv::Fast:
1151 case CallingConv::Cold:
1152 case CallingConv::GHC:
1153 case CallingConv::HiPE:
1157 case CallingConv::Swift:
1159 case CallingConv::Tail:
1174 case CallingConv::Win64:
1182 return true;
1187 return false;
1205 case CallingConv::GRAAL:
1222 return true;
1223 default:
1224 return false;
1225 }
1226
1227 llvm_unreachable("covered callingconv switch");
1228}
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)
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:545
static unsigned computeAddrSpace(unsigned AddrSpace, Module *M)
Definition Function.cpp:469
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:297
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1563
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:289
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:633
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:669
void removeRetAttr(Attribute::AttrKind Kind)
removes the attribute from the return value list of attributes.
Definition Function.cpp:693
void addRetAttrs(const AttrBuilder &Attrs)
Add return value attributes to this function.
Definition Function.cpp:657
bool isDefTriviallyDead() const
isDefTriviallyDead - Return true if it is trivially safe to remove this function definition from the ...
Definition Function.cpp:998
bool onlyAccessesInaccessibleMemOrArgMem() const
Determine if the function may only access memory that is either inaccessible from the IR or pointed t...
Definition Function.cpp:905
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition Function.h:735
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:933
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
removes the attribute from the list of attributes.
Definition Function.cpp:705
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:784
void setPrefixData(Constant *PrefixData)
bool hasStackProtectorFnAttr() const
Returns true if the function has ssp, sspstrong, or sspreq fn attrs.
Definition Function.cpp:830
void removeFromParent()
removeFromParent - This method unlinks 'this' from the containing module, but does not delete it.
Definition Function.cpp:440
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:645
void renumberBlocks()
Renumber basic blocks into a dense value range starting from 0.
Definition Function.cpp:68
void setDoesNotAccessMemory()
Definition Function.cpp:865
void setGC(std::string Str)
Definition Function.cpp:818
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition Function.cpp:758
uint64_t getFnAttributeAsParsedInteger(StringRef Kind, uint64_t Default=0) const
For a string attribute Kind, parse attribute as an integer.
Definition Function.cpp:770
bool isConstrainedFPIntrinsic() const
Returns true if the function is one of the "Constrained Floating-PointIntrinsics".
Definition Function.cpp:549
void setOnlyAccessesArgMemory()
Definition Function.cpp:890
MemoryEffects getMemoryEffects() const
Definition Function.cpp:854
void setOnlyAccessesInaccessibleMemory()
Definition Function.cpp:899
void removeParamAttrs(unsigned ArgNo, const AttributeMask &Attrs)
removes the attribute from the list of attributes.
Definition Function.cpp:713
bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const
check if an attributes is in the list of attributes.
Definition Function.cpp:735
bool hasAttributeAtIndex(unsigned Idx, Attribute::AttrKind Kind) const
Check if attribute of the given kind is set at the given index.
Definition Function.cpp:753
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:873
bool isTargetIntrinsic() const
isTargetIntrinsic - Returns true if this function is an intrinsic and the intrinsic is specific to a ...
Definition Function.cpp:913
void removeFnAttrs(const AttributeMask &Attrs)
Definition Function.cpp:689
void addRetAttr(Attribute::AttrKind Kind)
Add return value attributes to this function.
Definition Function.cpp:649
DenormalFPEnv getDenormalFPEnv() const
Return the representational value of the denormal_fpenv attribute.
Definition Function.cpp:808
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:881
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:673
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Function.cpp:444
void removeFnAttr(Attribute::AttrKind Kind)
Remove function attributes from this function.
Definition Function.cpp:681
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:789
void addRangeRetAttr(const ConstantRange &CR)
adds the range attribute to the list of attributes for the return value.
Definition Function.cpp:795
void stealArgumentListFrom(Function &Src)
Steal arguments from another function.
Definition Function.cpp:562
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:813
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
adds the attribute to the list of attributes for the given arg.
Definition Function.cpp:661
bool doesNotAccessMemory() const
Determine if the function does not access memory.
Definition Function.cpp:862
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition Function.cpp:799
void updateAfterNameChange()
Update internal caches that depend on the function name (such as the intrinsic ID and libcall cache).
Definition Function.cpp:917
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:731
bool onlyWritesMemory() const
Determine if the function does not access or only writes memory.
Definition Function.cpp:878
bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
Definition Function.cpp:896
void setPrologueData(Constant *PrologueData)
void removeRetAttrs(const AttributeMask &Attrs)
removes the attributes from the return value list of attributes.
Definition Function.cpp:701
bool onlyAccessesArgMemory() const
Determine if the call can access memory only using pointers based on its arguments.
Definition Function.cpp:887
Function::iterator erase(Function::iterator FromIt, Function::iterator ToIt)
Erases a range of BasicBlocks from FromIt to (not including) ToIt.
Definition Function.cpp:460
void setMemoryEffects(MemoryEffects ME)
Definition Function.cpp:857
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:744
iterator end()
Definition Function.h:829
void convertToNewDbgValues()
Definition Function.cpp:89
void setOnlyAccessesInaccessibleMemOrArgMem()
Definition Function.cpp:908
void addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes)
adds the dereferenceable attribute to the list of attributes for the given arg.
Definition Function.cpp:718
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:870
void addAttributeAtIndex(unsigned i, Attribute Attr)
adds the attribute to the list of attributes.
Definition Function.cpp:629
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:723
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:838
Attribute getRetAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind for the return value.
Definition Function.cpp:766
LLVM_ABI void copyAttributesFrom(const GlobalObject *Src)
Definition Globals.cpp:166
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:1433
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1439
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:598
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
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.
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
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:1739
unsigned getPointerAddressSpace(const Type *T)
Definition SPIRVUtils.h:389
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: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:377
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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
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