35 OnlyNamed = onlyNamed;
38 for (
const auto &
G : M.globals()) {
39 incorporateType(
G.getValueType());
40 if (
G.hasInitializer())
41 incorporateValue(
G.getInitializer());
45 for (
const auto &
A : M.aliases()) {
46 incorporateType(
A.getValueType());
47 if (
const Value *Aliasee =
A.getAliasee())
48 incorporateValue(Aliasee);
52 for (
const auto &GI : M.ifuncs())
53 incorporateType(GI.getValueType());
58 incorporateType(FI.getFunctionType());
59 incorporateAttributes(FI.getAttributes());
61 for (
const Use &U : FI.operands())
62 incorporateValue(U.get());
65 for (
const auto &
A : FI.args())
71 incorporateType(
I.getType());
75 for (
const auto &O :
I.operands())
77 incorporateValue(&*O);
80 incorporateType(
GEP->getSourceElementType());
82 incorporateType(AI->getAllocatedType());
84 incorporateAttributes(CB->getAttributes());
87 I.getAllMetadataOtherThanDebugLoc(MDForInst);
88 for (
const auto &MD : MDForInst)
89 incorporateMDNode(MD.second);
93 for (
const auto &Dbg :
I.getDbgRecordRange()) {
97 for (
Value *V : DVI->location_ops())
99 if (DVI->isDbgAssign()) {
100 if (
Value *Addr = DVI->getAddress())
101 incorporateValue(Addr);
108 for (
const auto &NMD : M.named_metadata())
109 for (
const auto *MDOp : NMD.operands())
110 incorporateMDNode(MDOp);
114 VisitedConstants.clear();
115 VisitedTypes.clear();
121void TypeFinder::incorporateType(
Type *Ty) {
123 if (!VisitedTypes.insert(Ty).second)
133 if (!OnlyNamed || STy->hasName())
134 StructTypes.push_back(STy);
138 if (VisitedTypes.insert(SubTy).second)
140 }
while (!TypeWorklist.
empty());
147void TypeFinder::incorporateValue(
const Value *V) {
150 return incorporateMDNode(
N);
152 return incorporateValue(MDV->getValue());
154 for (
auto *Arg :
AL->getArgs())
155 incorporateValue(Arg->getValue());
164 if (!VisitedConstants.insert(V).second)
168 incorporateType(
V->getType());
175 incorporateType(
GEP->getSourceElementType());
179 for (
const auto &
I :
U->operands())
180 incorporateValue(&*
I);
185void TypeFinder::incorporateMDNode(
const MDNode *V) {
187 if (!VisitedMetadata.insert(V).second)
195 incorporateMDNode(
N);
199 incorporateValue(
C->getValue());
205void TypeFinder::incorporateAttributes(AttributeList AL) {
206 if (!VisitedAttributes.insert(AL).second)
209 for (AttributeSet AS : AL)
211 if (
A.isTypeAttribute())
212 incorporateType(
A.getValueAsType());
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Module.h This file contains the declarations for the Module class.
This defines the Use class.
This file defines the SmallVector class.
LLVM Basic Block Representation.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
A Module instance is used to store all the information related to an LLVM module.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Class to represent struct types.
void run(const Module &M, bool onlyNamed)
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
@ C
The default llvm calling convention, compatible with C.
@ User
could "use" a pointer
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto reverse(ContainerTy &&C)
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...
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.