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